/ Hex Artifact Content
Login

Artifact ea3e5e233cf16f4cb43f6ec35972683ae7bc03f3:


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 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 33 33  select.c,v 1.433
0200: 20 32 30 30 38 2f 30 36 2f 32 32 20 31 32 3a 33   2008/06/22 12:3
0210: 37 3a 35 38 20 64 72 68 20 45 78 70 20 24 0a 2a  7:58 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0410: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0420: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0430: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0440: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0450: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0460: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0470: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0480: 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20 70 44  st = eDest;.  pD
0490: 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69 50 61  est->iParm = iPa
04a0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 72 65 67  rm;.  pDest->reg
04b0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
04c0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04d0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04e0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04f0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
0500: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0510: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0520: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0530: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0540: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0550: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0560: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0570: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0580: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0590: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
05a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
05b0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05c0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05f0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0600: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0610: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0620: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0630: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0640: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0650: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0660: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0670: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0680: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0690: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
06a0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
06b0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06c0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06d0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06f0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
0700: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
0710: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0720: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0730: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0740: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0750: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0760: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0770: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0790: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
07a0: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
07b0: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07c0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07d0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07f0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
0800: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
0810: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0820: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
0830: 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69  pOffset || pLimi
0840: 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27 74 20  t );   /* Can't 
0850: 68 61 76 65 20 4f 46 46 53 45 54 20 77 69 74 68  have OFFSET with
0860: 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a 20 20  out LIMIT. */.  
0870: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
0880: 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64     pNew = &stand
0890: 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  in;.    memset(p
08a0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
08b0: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66  pNew));.  }.  if
08c0: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
08d0: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
08e0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
08f0: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
0900: 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b 5f 41  ite3Expr(db,TK_A
0910: 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20  LL,0,0,0), 0);. 
0920: 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73   }.  pNew->pELis
0930: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e  t = pEList;.  pN
0940: 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  ew->pSrc = pSrc;
0950: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
0960: 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77  = pWhere;.  pNew
0970: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  ->pGroupBy = pGr
0980: 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70  oupBy;.  pNew->p
0990: 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67  Having = pHaving
09a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
09b0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
09c0: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
09d0: 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a  t = isDistinct;.
09e0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
09f0: 53 45 4c 45 43 54 3b 0a 20 20 61 73 73 65 72 74  SELECT;.  assert
0a00: 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ( pOffset==0 || 
0a10: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70  pLimit!=0 );.  p
0a20: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c  New->pLimit = pL
0a30: 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  imit;.  pNew->pO
0a40: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
0a50: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
0a60: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f  = -1;.  pNew->iO
0a70: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  ffset = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
0aa0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
0ab0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
0ac0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
0ad0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e 65 77  = -1;.  if( pNew
0ae0: 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a 20 20  ==&standin) {.  
0af0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70 4e    clearSelect(pN
0b00: 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew);.    pNew = 
0b10: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0b20: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
0b30: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
0b40: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0b50: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
0b60: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
0b70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0b80: 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63  lectDelete(Selec
0b90: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
0ba0: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0bb0: 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t(p);.    sqlite
0bc0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
0bd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20  ../*.** Given 1 
0be0: 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73  to 3 identifiers
0bf0: 20 70 72 65 63 65 65 64 69 6e 67 20 74 68 65 20   preceeding the 
0c00: 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65  JOIN keyword, de
0c10: 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74  termine the.** t
0c20: 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65  ype of join.  Re
0c30: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
0c40: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78  constant that ex
0c50: 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79 70  presses that typ
0c60: 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66  e.** in terms of
0c70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
0c80: 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a  it values:.**.**
0c90: 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a       JT_INNER.**
0ca0: 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a       JT_CROSS.**
0cb0: 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a       JT_OUTER.**
0cc0: 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a       JT_NATURAL.
0cd0: 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a  **     JT_LEFT.*
0ce0: 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a  *     JT_RIGHT.*
0cf0: 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65  *.** A full oute
0d00: 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f  r join is the co
0d10: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f  mbination of JT_
0d20: 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48  LEFT and JT_RIGH
0d30: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  T..**.** If an i
0d40: 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70  llegal or unsupp
0d50: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20  orted join type 
0d60: 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74  is seen, then st
0d70: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  ill return.** a 
0d80: 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70  join type, but p
0d90: 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  ut an error in t
0da0: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
0db0: 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
0dc0: 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73  te3JoinType(Pars
0dd0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
0de0: 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c   *pA, Token *pB,
0df0: 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69   Token *pC){.  i
0e00: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  nt jointype = 0;
0e10: 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b  .  Token *apAll[
0e20: 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a  3];.  Token *p;.
0e30: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
0e40: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
0e50: 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72 64 5b  t char zKeyword[
0e60: 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68 61 72  8];.    u8 nChar
0e70: 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 0a 20  ;.    u8 code;. 
0e80: 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20   } keywords[] = 
0e90: 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c  {.    { "natural
0ea0: 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ", 7, JT_NATURAL
0eb0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22   },.    { "left"
0ec0: 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c  ,    4, JT_LEFT|
0ed0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0ee0: 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20  { "right",   5, 
0ef0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
0f00: 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c  R },.    { "full
0f10: 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54  ",    4, JT_LEFT
0f20: 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54  |JT_RIGHT|JT_OUT
0f30: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74  ER },.    { "out
0f40: 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54  er",   5, JT_OUT
0f50: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e  ER },.    { "inn
0f60: 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e  er",   5, JT_INN
0f70: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f  ER },.    { "cro
0f80: 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e  ss",   5, JT_INN
0f90: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a 20  ER|JT_CROSS },. 
0fa0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
0fb0: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
0fc0: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
0fd0: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
0fe0: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
0ff0: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1000: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1010: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1020: 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79  =0; j<sizeof(key
1030: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65  words)/sizeof(ke
1040: 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29  ywords[0]); j++)
1050: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  {.      if( p->n
1060: 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43  ==keywords[j].nC
1070: 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26  har .          &
1080: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1090: 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b  p((char*)p->z, k
10a0: 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77  eywords[j].zKeyw
10b0: 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b  ord, p->n)==0 ){
10c0: 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  .        jointyp
10d0: 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d  e |= keywords[j]
10e0: 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62  .code;.        b
10f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1100: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73    }.    if( j>=s
1110: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f  izeof(keywords)/
1120: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b  sizeof(keywords[
1130: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  0]) ){.      joi
1140: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1150: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1170: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1180: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1190: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
11a0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
11b0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
11c0: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
11d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11e0: 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20 20 20  *zSp1 = " ";.   
11f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1200: 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69 66 28  2 = " ";.    if(
1210: 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31 2b 2b   pB==0 ){ zSp1++
1220: 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43 3d 3d  ; }.    if( pC==
1230: 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d 0a 20  0 ){ zSp2++; }. 
1240: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1250: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
1260: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
1270: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
1280: 20 20 20 20 20 20 20 22 25 54 25 73 25 54 25 73         "%T%s%T%s
1290: 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c 20 70  %T", pA, zSp1, p
12a0: 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a 20 20  B, zSp2, pC);.  
12b0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
12c0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
12d0: 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  f( jointype & JT
12e0: 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71  _RIGHT ){.    sq
12f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1300: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
1310: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
1320: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
1330: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
1340: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
1350: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
1360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
1370: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
1380: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1390: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
13a0: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
13b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
13c0: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
13d0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
13e0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
13f0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
1400: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1410: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1420: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1430: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1440: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1450: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
1460: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
1470: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
1480: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1490: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
14a0: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
14b0: 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20  of a token to a 
14c0: 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65  '\000'-terminate
14d0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  d string..*/.sta
14e0: 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65  tic void setToke
14f0: 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73  n(Token *p, cons
1500: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d  t char *z){.  p-
1510: 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70  >z = (u8*)z;.  p
1520: 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e  ->n = z ? strlen
1530: 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79  (z) : 0;.  p->dy
1540: 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 0;.}../*.** 
1550: 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20 74 6f  Set the token to
1560: 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f 74   the double-quot
1570: 65 64 20 61 6e 64 20 65 73 63 61 70 65 64 20 76  ed and escaped v
1580: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  ersion of the st
1590: 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ring pointed.** 
15a0: 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65 78 61  to by z. For exa
15b0: 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b  mple;.**.**    {
15c0: 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22 22  a"bc}  ->  {"a""
15d0: 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  bc"}.*/.static v
15e0: 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54 6f 6b  oid setQuotedTok
15f0: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
1600: 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73  , Token *p, cons
1610: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f  t char *z){..  /
1620: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73  * Check if the s
1630: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61  tring contains a
1640: 6e 79 20 22 20 63 68 61 72 61 63 74 65 72 73 2e  ny " characters.
1650: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65   If it does, the
1660: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  n.  ** this func
1670: 74 69 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c 6f 63  tion will malloc
1680: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
1690: 20 61 20 71 75 6f 74 65 64 20 76 65 72 73 69 6f   a quoted versio
16a0: 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 74  n of.  ** the st
16b0: 72 69 6e 67 20 69 6e 2e 20 4f 74 68 65 72 77 69  ring in. Otherwi
16c0: 73 65 2c 20 73 61 76 65 20 61 20 63 61 6c 6c 20  se, save a call 
16d0: 74 6f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  to sqlite3MPrint
16e0: 66 28 29 20 62 79 0a 20 20 2a 2a 20 6a 75 73 74  f() by.  ** just
16f0: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 6f 69   copying the poi
1700: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
1710: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng..  */.  const
1720: 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20   char *z2 = z;. 
1730: 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 0a 20   while( *z2 ){. 
1740: 20 20 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27 20     if( *z2=='"' 
1750: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 32 2b  ) break;.    z2+
1760: 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a  +;.  }..  if( *z
1770: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69  2 ){.    /* Stri
1780: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63 68  ng contains " ch
1790: 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20  aracters - copy 
17a0: 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73 74  and quote the st
17b0: 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  ring. */.    p->
17c0: 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  z = (u8 *)sqlite
17d0: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
17e0: 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a  >db, "\"%w\"", z
17f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20  );.    if( p->z 
1800: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20  ){.      p->n = 
1810: 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
1820: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ->z);.      p->d
1830: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  yn = 1;.    }.  
1840: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74  }else{.    /* St
1850: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  ring contains no
1860: 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2d 20   " characters - 
1870: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
1880: 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  . */.    p->z = 
1890: 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e  (u8*)z;.    p->n
18a0: 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20   = (z2 - z);.   
18b0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d   p->dyn = 0;.  }
18c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
18d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
18e0: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
18f0: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
1900: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
1910: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65  Expr *sqlite3Cre
1920: 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20  ateIdExpr(Parse 
1930: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1940: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54  har *zName){.  T
1950: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65  oken dummy;.  se
1960: 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a  tToken(&dummy, z
1970: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1980: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1990: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
19a0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a  , &dummy);.}../*
19b0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
19c0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
19d0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
19e0: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
19f0: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
1a00: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1a10: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1a20: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1a30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a40: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1a50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1a70: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1a80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1a90: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
1aa0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1ab0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1ac0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1ad0: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1ae0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1af0: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
1b00: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
1b10: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1b20: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
1b30: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
1b40: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
1b50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b60: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1b70: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1b80: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1b90: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1ba0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
1bb0: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1bc0: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
1bd0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
1be0: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
1bf0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1c00: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
1c10: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
1c20: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  n */.  int isOut
1c30: 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20  erJoin          
1c40: 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69  /* True if deali
1c50: 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52  ng with an OUTER
1c60: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78   join */.){.  Ex
1c70: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1c80: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1c90: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1ca0: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1cb0: 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65  .  pE1a = sqlite
1cc0: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1cd0: 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70  arse, zCol);.  p
1ce0: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2a = sqlite3Cre
1cf0: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d00: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  , zCol);.  if( z
1d10: 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20  Alias1==0 ){.   
1d20: 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31   zAlias1 = pTab1
1d30: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1d40: 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1b = sqlite3Cre
1d50: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d60: 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66  , zAlias1);.  if
1d70: 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a  ( zAlias2==0 ){.
1d80: 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54      zAlias2 = pT
1d90: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab2->zName;.  }.
1da0: 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33    pE2b = sqlite3
1db0: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1dc0: 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  rse, zAlias2);. 
1dd0: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50   pE1c = sqlite3P
1de0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1df0: 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c  DOT, pE1b, pE1a,
1e00: 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71   0);.  pE2c = sq
1e10: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e20: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  e, TK_DOT, pE2b,
1e30: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1e40: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1e50: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
1e60: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
1e70: 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65  if( pE && isOute
1e80: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
1e90: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
1ea0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1eb0: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1ec0: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1ed0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1ee0: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1ef0: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
1f00: 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29  >db,*ppExpr, pE)
1f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1f20: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1f30: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
1f40: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
1f50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
1f60: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
1f70: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1f80: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
1f90: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
1fa0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
1fb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
1fc0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1fd0: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
1fe0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1ff0: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2000: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2010: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2020: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2030: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2040: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2050: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
2060: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2070: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
2080: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
2090: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
20a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
20b0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
20c0: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
20d0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
20e0: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
20f0: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2100: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2110: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2120: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2130: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2140: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2150: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2160: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
2170: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2180: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
2190: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
21a0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
21b0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
21c0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
21d0: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
21e0: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
21f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2200: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2210: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2220: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2230: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2240: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2250: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2260: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
2270: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
2280: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
2290: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
22a0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
22b0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
22c0: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
22d0: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
22e0: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
22f0: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2300: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2310: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2320: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2330: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2340: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2350: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
2360: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2370: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
2380: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
2390: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
23a0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
23b0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
23c0: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
23d0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
23e0: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
23f0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2400: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2410: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2420: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2430: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e  omJoin);.    p->
2440: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2450: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  = iTable;.    se
2460: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2470: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
2480: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2490: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
24a0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
24b0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
24c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
24d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24e0: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
24f0: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2500: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
2510: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
2520: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
2530: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
2540: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
2550: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2560: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2570: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
2580: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
2590: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
25a0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
25b0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
25c0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
25d0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
25e0: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
25f0: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
2600: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
2610: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
2620: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
2630: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
2640: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
2650: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
2660: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
2670: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
2680: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
2690: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
26a0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
26b0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
26c0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
26d0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
26e0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
26f0: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
2700: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2710: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2720: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
2730: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
2740: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
2750: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
2760: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2770: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
2780: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
2790: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
27a0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
27b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
27c0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
27e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
27f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2800: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
2810: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
2820: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
2830: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2840: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
2850: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
2860: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2870: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
2880: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
2890: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
28a0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
28b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
28c0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
28d0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
28e0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
28f0: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
2900: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
2910: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
2920: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
2930: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
2940: 20 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d     if( pLeftTab=
2950: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
2960: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2970: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
2980: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2990: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
29a0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
29b0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
29c0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
29d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
29e0: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
29f0: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2a00: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2a10: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2a20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2a30: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2a40: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2a50: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2a60: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2a70: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2a80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2a90: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2aa0: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2ab0: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2ac0: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2ad0: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2ae0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2af0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2b00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66   for(j=0; j<pLef
2b10: 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  tTab->nCol; j++)
2b20: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2b30: 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62  zName = pLeftTab
2b40: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2b50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
2b60: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2b70: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
2b80: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68  .          addWh
2b90: 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ereTerm(pParse, 
2ba0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2bb0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2be0: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2bf0: 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ->zAlias,.      
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
2c20: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
2c30: 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20  ere, isOuter);. 
2c40: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2c50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c60: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
2c70: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
2c80: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
2c90: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
2ca0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2cb0: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
2cc0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2cd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2ce0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
2cf0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
2d00: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
2d10: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
2d20: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
2d30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d50: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2d60: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2d70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d80: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2d90: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2da0: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2db0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2dc0: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
2dd0: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
2de0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2df0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2e00: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2e10: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2e20: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2e30: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2e40: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2e50: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2e60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2e70: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2e80: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2e90: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2ea0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2eb0: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2ec0: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2ed0: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2ee0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2ef0: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2f00: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2f10: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2f20: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2f30: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2f40: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2f50: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2f60: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2f70: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2f80: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2f90: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2fa0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2fb0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2fc0: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2fd0: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
2fe0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2ff0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3000: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3010: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
3020: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
3030: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
3040: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
3050: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
3060: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
3070: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
3080: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
3090: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
30a0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
30b0: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
30c0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
30d0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
30e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
30f0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3100: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
3110: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
3120: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
3130: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
3140: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
3150: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
3160: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
3170: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
3180: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
3190: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
31a0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
31d0: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
31e0: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
3210: 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73  , &p->pWhere, is
3220: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Outer);.      }.
3230: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3240: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
3250: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
3260: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
3270: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
3280: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
3290: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
32a0: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
32b0: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
32c0: 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65  oSorter(.  Parse
32d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
32e0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
32f0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3300: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3310: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
3320: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
3330: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
3340: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
3350: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3360: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
3370: 61 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a            /* 
3380: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
3390: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
33a0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ed */.){.  Vdbe 
33b0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
33c0: 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  be;.  int nExpr 
33d0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
33e0: 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  r;.  int regBase
33f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3400: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
3410: 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72  Expr+2);.  int r
3420: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
3430: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
3440: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
3450: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
3460: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
3470: 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
3480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3490: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
34a0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
34b0: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
34c0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
34d0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
34e0: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
34f0: 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31  gBase+nExpr+1, 1
3500: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3510: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
3520: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
3530: 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67  , nExpr + 2, reg
3540: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
3550: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3560: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f  OP_IdxInsert, pO
3570: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
3580: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
3590: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
35a0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
35b0: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
35c0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
35d0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
35e0: 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20  ase, nExpr+2);. 
35f0: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
3600: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
3610: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
3620: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
3630: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
3640: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
3650: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
3660: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a  ect->iOffset+1;.
3670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3680: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
3690: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  t->iLimit;.    }
36a0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
36b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
36c0: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
36d0: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
36e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
36f0: 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74  P_AddImm, iLimit
3700: 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32  , -1);.    addr2
3710: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3720: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
3730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3740: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3750: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
3760: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3770: 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d  _Last, pOrderBy-
3780: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
3790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37a0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
37b0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
37c0: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
37d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
37e0: 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c  addr2);.    pSel
37f0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  ect->iLimit = -1
3800: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3810: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
3820: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
3830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3840: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
3850: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
3860: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3870: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3880: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
3890: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
38a0: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
38b0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
38c0: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
38d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
38e0: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
38f0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
3900: 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30  f( p->iOffset>=0
3910: 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30   && iContinue!=0
3920: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
3930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3940: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
3950: 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65 74  dImm, p->iOffset
3960: 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 20  , -1);.    addr 
3970: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3980: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c  Op1(v, OP_IfNeg,
3990: 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
39a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
39b0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
39c0: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
39d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
39e0: 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20  v, "skip OFFSET 
39f0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
3a00: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3a10: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
3a20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
3a30: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68  ode that will ch
3a40: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
3a50: 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
3a60: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65   starting at iMe
3a70: 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74  m.** form a dist
3a80: 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61  inct entry.  iTa
3a90: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
3aa0: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
3ab0: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
3ac0: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
3ad0: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
3ae0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
3af0: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
3b00: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
3b10: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
3b20: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
3b30: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
3b40: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31  made and the N+1
3b50: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
3b60: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
3b70: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
3b80: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
3b90: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
3ba0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
3bb0: 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73  Distinct(.  Pars
3bc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
3bd0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
3be0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
3bf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
3c00: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
3c10: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
3c20: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
3c30: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
3c40: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
3c50: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
3c60: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
3c70: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
3c80: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
3c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
3ca0: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ents */.  int iM
3cb0: 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em           /* 
3cc0: 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f  First element */
3cd0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  .){.  Vdbe *v;. 
3ce0: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20   int r1;..  v = 
3cf0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
3d00: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
3d10: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
3d20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3d30: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
3d40: 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20  ecord, iMem, N, 
3d50: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
3d60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
3d70: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
3d80: 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20 73  Repeat, r1);.  s
3d90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3da0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
3db0: 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73  , iTab, r1);.  s
3dc0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
3dd0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
3de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
3df0: 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ate an error mes
3e00: 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45  sage when a SELE
3e10: 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69  CT is used withi
3e20: 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f  n a subexpressio
3e30: 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20  n.** (example:  
3e40: 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20  "a IN (SELECT * 
3e50: 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75  FROM table)") bu
3e60: 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68  t it has more th
3e70: 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63  an 1 result.** c
3e80: 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68  olumn.  We do th
3e90: 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69  is in a subrouti
3ea0: 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65  ne because the e
3eb0: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 6d  rror occurs in m
3ec0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65  ultiple.** place
3ed0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
3ee0: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
3ef0: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
3f00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3f10: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
3f20: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
3f30: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
3f40: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
3f50: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
3f60: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
3f70: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
3f80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
3f90: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
3fa0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
3fb0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
3fc0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
3fd0: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
3fe0: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
3ff0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
4000: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
4010: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4020: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
4030: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
4040: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
4050: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
4060: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
4070: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
4080: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
4090: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
40a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
40b0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
40c0: 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  s the code for t
40d0: 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  he inside of the
40e0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
40f0: 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  f a SELECT..**.*
4100: 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20  * If srcTab and 
4110: 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68  nColumn are both
4120: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
4130: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
4140: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
4150: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
4160: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
4170: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e   this row.  If n
4180: 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e  Column>0.** then
4190: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
41a0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
41b0: 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f  pEList is used o
41c0: 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a  nly to get the.*
41d0: 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20  * datatypes for 
41e0: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
41f0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
4200: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
4210: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4220: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
4230: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
4240: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
4250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4260: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
4270: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
4280: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
4290: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
42a0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
42b0: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
42c0: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
42d0: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
42e0: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
42f0: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
4300: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4310: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4320: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
4330: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
4340: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
4350: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
4360: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
4370: 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20  L, sort results 
4380: 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a  using this key *
4390: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
43a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
43b0: 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65  f >=0, make sure
43c0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
43d0: 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63  tinct */.  Selec
43e0: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
43f0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
4400: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
4410: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
4420: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
4430: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4440: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
4450: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
4460: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20   iBreak,        
4470: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4480: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
4490: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
44a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
44c0: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
44d0: 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54   if eDest is SRT
44e0: 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  _Union */.){.  V
44f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
4500: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
4510: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
4520: 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
4530: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
4540: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
4550: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  esent */.  int r
4560: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
4570: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
4580: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
4590: 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  g result set */.
45a0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
45b0: 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a  est->eDest;   /*
45c0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
45d0: 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  of results */.  
45e0: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
45f0: 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46  t->iParm;   /* F
4600: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
4610: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
4620: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c   */.  int nResul
4630: 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
4640: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
4650: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
4660: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
4670: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4680: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
4690: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
46a0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
46b0: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
46c0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f  atement, then do
46d0: 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20   the check.  ** 
46e0: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72  to see if this r
46f0: 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74  ow should be out
4700: 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44  put..  */.  hasD
4710: 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e  istinct = distin
4720: 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 2d  ct>=0 && pEList-
4730: 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20  >nExpr>0;.  if( 
4740: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
4750: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
4760: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
4770: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
4780: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
4790: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
47a0: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  umns..  */.  if(
47b0: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
47c0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e    nResultCol = n
47d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
47e0: 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  .    nResultCol 
47f0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
4800: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74  .  }.  if( pDest
4810: 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->iMem==0 ){.   
4820: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73   pDest->iMem = s
4830: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
4840: 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 73 75  ge(pParse, nResu
4850: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 70 44 65 73  ltCol);.    pDes
4860: 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c  t->nMem = nResul
4870: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
4880: 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 21 3d 6e  ( pDest->nMem!=n
4890: 52 65 73 75 6c 74 43 6f 6c 20 29 7b 0a 20 20 20  ResultCol ){.   
48a0: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
48b0: 20 77 68 65 6e 20 74 77 6f 20 53 45 4c 45 43 54   when two SELECT
48c0: 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
48d0: 53 45 4c 45 43 54 20 68 61 76 65 20 64 69 66 66  SELECT have diff
48e0: 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 6e 75 6d  ering.    ** num
48f0: 62 65 72 73 20 6f 66 20 72 65 73 75 6c 74 20 63  bers of result c
4900: 6f 6c 75 6d 6e 73 2e 20 20 54 68 65 20 65 72 72  olumns.  The err
4910: 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
4920: 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 0a  be generated by.
4930: 20 20 20 20 2a 2a 20 61 20 68 69 67 68 65 72 2d      ** a higher-
4940: 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 2e 20 2a  level routine. *
4950: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
4960: 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  }.  regResult = 
4970: 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69  pDest->iMem;.  i
4980: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4990: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
49a0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
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 43 6f 6c 75  ddOp3(v, OP_Colu
49d0: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
49e0: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
49f0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
4a00: 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
4a10: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
4a20: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
4a30: 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20   an EXISTS(...) 
4a40: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
4a50: 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61  actual.    ** va
4a60: 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  lues returned by
4a70: 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
4a80: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
4a90: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
4aa0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4ab0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
4ac0: 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73   regResult, eDes
4ad0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 29  t==SRT_Callback)
4ae0: 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ;.  }.  nColumn 
4af0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20  = nResultCol;.. 
4b00: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
4b10: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
4b20: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
4b30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
4b40: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
4b50: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
4b60: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
4b70: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
4b80: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
4b90: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
4ba0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
4bb0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
4bc0: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
4bd0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4be0: 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e  ->nExpr==nColumn
4bf0: 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74   );.    codeDist
4c00: 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64 69 73  inct(pParse, dis
4c10: 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  tinct, iContinue
4c20: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65  , nColumn, regRe
4c30: 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70  sult);.    if( p
4c40: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
4c50: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4c60: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4c70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4c80: 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
4c90: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
4ca0: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
4cb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
4cc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
4cd0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
4ce0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
4cf0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
4d00: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
4d10: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
4d20: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
4d30: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
4d40: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
4d50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
4d60: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
4d70: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
4d80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
4d90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
4da0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
4db0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
4dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4dd0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4de0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
4df0: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
4e00: 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20   if( aff ){.    
4e10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4e20: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 61  hangeP4(v, -1, a
4e30: 66 66 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  ff, P4_STATIC);.
4e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4e50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4e60: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4e70: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
4e80: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4e90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4ea0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
4eb0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4ec0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
4ed0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
4ee0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
4ef0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
4f00: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
4f10: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
4f20: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
4f30: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
4f40: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
4f50: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
4f60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4f70: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
4f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f90: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
4fa0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
4fb0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
4fc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4fd0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4fe0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
4ff0: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
5000: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
5010: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5020: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
5030: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
5040: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
5050: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5060: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5080: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5090: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
50a0: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  lt, nColumn, r1)
50b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
50c0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
50d0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
50e0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
50f0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d   p, r1);.      }
5100: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
5110: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
5120: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5130: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5150: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
5160: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
5170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5180: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
5190: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
51a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
51b0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
51c0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
51d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
51e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
51f0: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
5200: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
5210: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5220: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
5230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5240: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5250: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
5260: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
5270: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
5280: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
5290: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
52a0: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
52b0: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
52c0: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
52d0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
52e0: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
52f0: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
5300: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
5310: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
5320: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
5330: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
5340: 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  dr2;..      asse
5350: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
5360: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
5370: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5380: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
5390: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
53a0: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
53b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
53c0: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
53d0: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
53e0: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
53f0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
5400: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
5410: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
5420: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
5430: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
5440: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
5450: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
5460: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
5470: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
5480: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
5490: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
54a0: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
54b0: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
54c0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
54d0: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
54e0: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
54f0: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
5500: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5510: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5520: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
5530: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
5540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
5550: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5560: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5570: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5580: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
5590: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
55a0: 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20  gResult, 1, r1, 
55b0: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
55c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
55d0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
55e0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
55f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
5600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5610: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5620: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
5630: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
5640: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5650: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5670: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5680: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
5690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
56b0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
56c0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
56d0: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
56e0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
56f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
5700: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
5710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5720: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
5730: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
5740: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
5750: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
5760: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
5770: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
5780: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
5790: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
57a0: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
57b0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
57c0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
57d0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
57e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
57f0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
5800: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
5810: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
5820: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
5830: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5840: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
5850: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5860: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
5870: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5880: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5890: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
58a0: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
58b0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
58c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
58d0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
58e0: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
58f0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
5900: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
5910: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
5920: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
5930: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
5940: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5950: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5960: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5970: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
5980: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
5990: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
59a0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f  lback function o
59b0: 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  r to a subroutin
59c0: 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a  e.  In the.    *
59d0: 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72  * case of a subr
59e0: 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72  outine, the subr
59f0: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73  outine itself is
5a00: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
5a10: 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20  .    ** popping 
5a20: 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  the data from th
5a30: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  e stack..    */.
5a40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
5a50: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
5a60: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b   SRT_Callback: {
5a70: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5a80: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
5a90: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
5aa0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5ab0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5ac0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5ad0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5ae0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5af0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
5b00: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
5b10: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
5b20: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   p, r1);.       
5b30: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5b40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5b50: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
5b60: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
5b70: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
5b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5b90: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
5ba0: 64 2c 20 70 44 65 73 74 2d 3e 72 65 67 43 6f 72  d, pDest->regCor
5bb0: 6f 75 74 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d  outine);.      }
5bc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5be0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
5bf0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5c00: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
5c10: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
5c20: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
5c30: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
5c40: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
5c50: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5c60: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
5c70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
5c80: 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
5c90: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
5ca0: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
5cb0: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
5cc0: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
5cd0: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
5ce0: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
5cf0: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
5d00: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
5d10: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
5d20: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
5d30: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
5d40: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
5d50: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
5d60: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
5d70: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
5d80: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
5d90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5da0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
5db0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
5dc0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
5dd0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5de0: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
5df0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
5e00: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
5e10: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
5e20: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
5e30: 74 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  t>=0 && pOrderBy
5e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5e50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5e60: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c  OP_AddImm, p->iL
5e70: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73  imit, -1);.    s
5e80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5e90: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
5ea0: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
5eb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5ec0: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
5ed0: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
5ee0: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
5ef0: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
5f00: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
5f10: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
5f20: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
5f30: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
5f40: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
5f50: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5f60: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
5f70: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
5f80: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
5f90: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
5fa0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5fb0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5fc0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5fd0: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
5fe0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
5ff0: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
6000: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
6010: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
6020: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
6030: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
6040: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
6050: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
6060: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
6070: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
6080: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
6090: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
60a0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
60b0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
60c0: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
60d0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
60e0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
60f0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
6100: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
6110: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
6120: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
6130: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
6140: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6150: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
6160: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
6170: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
6180: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
6190: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
61a0: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
61b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
61c0: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
61d0: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
61e0: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
61f0: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
6200: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6210: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
6220: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
6230: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
6240: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6250: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
6260: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
6270: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
6280: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6290: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
62a0: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
62b0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
62c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
62d0: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
62e0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
62f0: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
6300: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
6310: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  o->nField = nExp
6320: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
6330: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
6340: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
6350: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
6360: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6370: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6380: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6390: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
63a0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
63b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
63c0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
63d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
63e0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
63f0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
6400: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
6410: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
6420: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6430: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
6440: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
6450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
6460: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
6470: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
6480: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
6490: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
64a0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
64b0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
64c0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
64d0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
64e0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
64f0: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
6500: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
6510: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
6520: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
6530: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
6540: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
6550: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
6560: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
6570: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6580: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
6590: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
65a0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
65b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
65c0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
65d0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
65e0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
65f0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
6600: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
6610: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
6620: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
6630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6640: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
6650: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
6660: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
6670: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
6680: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
6690: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
66a0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
66b0: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
66c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
66d0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
66e0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
66f0: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
6700: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
6710: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
6720: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
6730: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
6740: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
6750: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6760: 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Parm;..  int reg
6770: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
6780: 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  wid;..  iTab = p
6790: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
67a0: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
67b0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20  SRT_Callback || 
67c0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
67d0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75  tine ){.    pseu
67e0: 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  doTab = pParse->
67f0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
6800: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6810: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
6820: 73 2c 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  s, 0, nColumn);.
6830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6840: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6850: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
6860: 62 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  b, eDest==SRT_Ca
6870: 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 61  llback);.  }.  a
6880: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
6890: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
68a0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62 72  P_Sort, iTab, br
68b0: 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  k);.  codeOffset
68c0: 28 76 2c 20 70 2c 20 63 6f 6e 74 29 3b 0a 20 20  (v, p, cont);.  
68d0: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
68e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
68f0: 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d  e);.  regRowid =
6900: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6910: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6930: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
6940: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
6950: 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29  xpr + 1, regRow)
6960: 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ;.  switch( eDes
6970: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
6980: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
6990: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
69a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
69b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
69c0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
69d0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
69e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
69f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6a00: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
6a10: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6a30: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6a40: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
6a50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6a60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6a70: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6a80: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
6a90: 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 20     int j1;.     
6aa0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
6ab0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 6a 31 20  ==1 );.      j1 
6ac0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6ad0: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
6ae0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20  , regRow);.     
6af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b00: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
6b10: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20  ord, regRow, 1, 
6b20: 72 65 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66  regRowid, &p->af
6b30: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
6b40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6b50: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
6b60: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
6b70: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
6b80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6b90: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
6ba0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
6bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6bc0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
6bd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6be0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
6bf0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
6c00: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
6c10: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
6c20: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
6c30: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
6c40: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
6c50: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
6c60: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
6c70: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
6c80: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
6c90: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
6ca0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
6cb0: 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20  lback:.    case 
6cc0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
6cd0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
6ce0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6cf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6d00: 67 65 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  ger, 1, regRowid
6d10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6d20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6d30: 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54  _Insert, pseudoT
6d40: 61 62 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  ab, regRow, regR
6d50: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  owid);.      for
6d60: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
6d70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
6d80: 73 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70  ssert( regRow!=p
6d90: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a  Dest->iMem+i );.
6da0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6db0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6dc0: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
6dd0: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65  b, i, pDest->iMe
6de0: 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  m+i);.      }.  
6df0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6e00: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
6e10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6e20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6e30: 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d  esultRow, pDest-
6e40: 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  >iMem, nColumn);
6e50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6e60: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
6e70: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
6e80: 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f  pDest->iMem, nCo
6e90: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
6ea0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
6eb0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
6ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6ed0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
6ee0: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 72 65 67  ield, pDest->reg
6ef0: 43 6f 72 6f 75 74 69 6e 65 29 3b 0a 20 20 20 20  Coroutine);.    
6f00: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6f10: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6f20: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
6f30: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
6f40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6f50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
6f60: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6f70: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
6f80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6f90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6fa0: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4a 75  Rowid);..  /* Ju
6fb0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
6fc0: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74   the loop when t
6fd0: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
6fe0: 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  hed.  */.  if( p
6ff0: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
7000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7010: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
7020: 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31  m, p->iLimit, -1
7030: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7040: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7050: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
7060: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f  , brk);.  }..  /
7070: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
7080: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
7090: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
70a0: 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29  veLabel(v, cont)
70b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
70c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
70d0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
70e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
70f0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
7100: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
7110: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65  RT_Callback || e
7120: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
7130: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
7140: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7150: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
7160: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a  Tab, 0);.  }..}.
7170: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7180: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
7190: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
71a0: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
71b0: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
71c0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
71d0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
71e0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
71f0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
7200: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ler..**.** The d
7210: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7220: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
7230: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
7240: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7250: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
7260: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7270: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
7280: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
7290: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
72a0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
72b0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
72c0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
72d0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
72e0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
72f0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
7300: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
7310: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
7320: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
7330: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
7340: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
7350: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
7360: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
7370: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
7380: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
7390: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
73a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
73b0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
73c0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
73d0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
73e0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
73f0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
7400: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
7410: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
7420: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
7430: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
7440: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7450: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
7460: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
7470: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
7480: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
7490: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
74a0: 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Type(.  NameCont
74b0: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
74c0: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
74d0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
74e0: 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  nDb,.  const cha
74f0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c  r **pzOriginTab,
7500: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
7510: 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20  pzOriginCol.){. 
7520: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
7530: 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
7540: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20  onst *zOriginDb 
7550: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
7560: 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20  t *zOriginTab = 
7570: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
7580: 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b  *zOriginCol = 0;
7590: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20  .  int j;.  if( 
75a0: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d  pExpr==0 || pNC-
75b0: 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72  >pSrcList==0 ) r
75c0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74  eturn 0;..  swit
75d0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
75e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
75f0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
7600: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
7610: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7620: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
7630: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
7640: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
7650: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
7660: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
7670: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
7680: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
7690: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
76a0: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
76b0: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
76c0: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
76d0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
76e0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
76f0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
7700: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
7710: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
7720: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
7730: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
7740: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
7750: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
7760: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
7770: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
7780: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
7790: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
77a0: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
77b0: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
77c0: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
77d0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
77e0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
77f0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
7800: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
7810: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
7820: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
7830: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
7840: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
7850: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
7860: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
7870: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
7880: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
7890: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
78a0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
78b0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
78c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
78d0: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
78e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
78f0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
7900: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
7910: 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20   FIX ME:.       
7920: 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63   ** This can occ
7930: 75 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20  urs if you have 
7940: 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22  something like "
7950: 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69  SELECT new.x;" i
7960: 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a  nside.        **
7970: 20 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20   a trigger.  In 
7980: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
7990: 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68  you reference th
79a0: 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a  e special "new".
79b0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
79c0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
79d0: 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  et of a select. 
79e0: 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   We do not have 
79f0: 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20  a good way.     
7a00: 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68     ** to find th
7a10: 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74  e actual table t
7a20: 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20  ype, so call it 
7a30: 22 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73  "TEXT".  This is
7a40: 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20   really.        
7a50: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20  ** something of 
7a60: 61 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20  a bug, but I do 
7a70: 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20  not know how to 
7a80: 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20  fix it..        
7a90: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
7aa0: 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74  is code does not
7ab0: 20 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72   produce the cor
7ac0: 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74  rect answer - it
7ad0: 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20   just prevents. 
7ae0: 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66         ** a segf
7af0: 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65  ault.  See ticke
7b00: 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20  t #1229..       
7b10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70   */.        zTyp
7b20: 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20  e = "TEXT";.    
7b30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7b40: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
7b50: 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ( pTab );.      
7b60: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
7b70: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
7b80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
7b90: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
7ba0: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
7bb0: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
7bc0: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
7bd0: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
7be0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
7bf0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
7c00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
7c10: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
7c20: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
7c30: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
7c40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7c50: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
7c60: 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74   iCol<pS->pEList
7c70: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
7c80: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
7c90: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
7ca0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
7cb0: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
7cc0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
7cd0: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
7ce0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
7cf0: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
7d00: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
7d10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
7d20: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
7d30: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
7d40: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
7d50: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
7d60: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
7d70: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
7d80: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
7d90: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
7da0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
7db0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
7dc0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
7dd0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
7de0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
7df0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
7e00: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
7e10: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
7e20: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
7e30: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
7e40: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
7e50: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  Col); .        }
7e60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7e70: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
7e80: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
7e90: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
7ea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
7eb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7ec0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
7ed0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
7ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
7ef0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
7f00: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
7f10: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20  nCol) );.       
7f20: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
7f30: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
7f40: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
7f50: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7f60: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
7f70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f80: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
7f90: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
7fa0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ype;.          z
7fb0: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62  OriginCol = pTab
7fc0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
7fd0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7fe0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62        zOriginTab
7ff0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8000: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
8010: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
8020: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
8030: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
8040: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
8050: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
8060: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
8070: 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e  OriginDb = pNC->
8080: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
8090: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
80a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
80b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
80c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
80d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
80e0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
80f0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
8100: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
8110: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74   sub-select. Ret
8120: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
8130: 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20  ion type and.   
8140: 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66     ** origin inf
8150: 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65  o for the single
8160: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
8170: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
8180: 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a   SELECT.      **
8190: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
81a0: 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43    */.      NameC
81b0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
81c0: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
81d0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
81e0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
81f0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
8200: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43  pExpr;.      sNC
8210: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
8220: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
8230: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
8240: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
8250: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
8260: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
8270: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
8280: 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69  zOriginDb, &zOri
8290: 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e  ginTab, &zOrigin
82a0: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65  Col); .      bre
82b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
82c0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a  .  }.  .  if( pz
82d0: 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20  OriginDb ){.    
82e0: 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e  assert( pzOrigin
82f0: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43  Tab && pzOriginC
8300: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
8310: 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44  ginDb = zOriginD
8320: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
8330: 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62  Tab = zOriginTab
8340: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43  ;.    *pzOriginC
8350: 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b  ol = zOriginCol;
8360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54  .  }.  return zT
8370: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
8380: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
8390: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
83a0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
83b0: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
83c0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
83d0: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
83e0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
83f0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
8400: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8410: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
8420: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
8430: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
8440: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
8450: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
8460: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
8470: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
8480: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
8490: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
84a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
84b0: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
84c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
84d0: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
84e0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
84f0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
8500: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
8510: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
8520: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8530: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8540: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
8550: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
8560: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
8570: 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20   *zType;.#ifdef 
8580: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
8590: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
85a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
85b0: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63  rigDb = 0;.    c
85c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
85d0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Tab = 0;.    con
85e0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f  st char *zOrigCo
85f0: 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65  l = 0;.    zType
8600: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
8610: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c  NC, p, &zOrigDb,
8620: 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72   &zOrigTab, &zOr
8630: 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  igCol);..    /* 
8640: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
8650: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
8660: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
8670: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
8680: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
8690: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
86a0: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
86b0: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
86c0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
86d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
86e0: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
86f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8700: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8710: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
8720: 2c 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54 52  , zOrigDb, P4_TR
8730: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8740: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8750: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8760: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
8770: 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  b, P4_TRANSIENT)
8780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8790: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
87a0: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
87b0: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f 54  , zOrigCol, P4_T
87c0: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
87d0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
87e0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
87f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
8800: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
8810: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8820: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
8830: 50 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52  PE, zType, P4_TR
8840: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
8850: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8860: 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a  MIT_DECLTYPE */.
8870: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
8880: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
8890: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
88a0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
88b0: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
88c0: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
88d0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
88e0: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
88f0: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
8900: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
8910: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
8920: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
8930: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
8940: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8950: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
8960: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
8970: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
8980: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
8990: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
89a0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
89b0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
89c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
89d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
89e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
89f0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
8a00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8a10: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
8a20: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
8a30: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
8a40: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
8a50: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
8a60: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
8a70: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
8a80: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
8a90: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
8aa0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
8ab0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
8ac0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
8ad0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
8ae0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
8af0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
8b00: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
8b10: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
8b20: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
8b30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
8b40: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
8b50: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
8b60: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8b70: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
8b80: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
8b90: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
8ba0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
8bb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
8bc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
8bd0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
8be0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
8bf0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8c00: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
8c10: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
8c20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
8c30: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
8c40: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
8c50: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
8c60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8c70: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8c80: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8c90: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
8ca0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
8cb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8cc0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
8cd0: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
8ce0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8cf0: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
8d00: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
8d10: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
8d20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
8d30: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8d40: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
8d50: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
8d60: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
8d70: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
8d80: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
8d90: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
8da0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
8db0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
8dc0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
8dd0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
8de0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
8df0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
8e00: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
8e10: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
8e20: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
8e30: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
8e40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8e50: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
8e60: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8e70: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
8e80: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
8e90: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
8ea0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  && p->span.z && 
8eb0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
8ec0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8ed0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8ee0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8ef0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8f00: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
8f10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8f20: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73  fullNames || (!s
8f30: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61  hortNames && pTa
8f40: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
8f50: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
8f60: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
8f70: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
8f80: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
8f90: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  pTabList->a[j].z
8fa0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69  Alias;.        i
8fb0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
8fc0: 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d  zTab==0 ) zTab =
8fd0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
8fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
8ff0: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a  String(&zName, z
9000: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
9010: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
9020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9030: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9040: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
9050: 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
9060: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9080: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
9090: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
90a0: 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f  zCol, strlen(zCo
90b0: 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l));.      }.   
90c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
90d0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
90e0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
90f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9100: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9110: 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70  E_NAME, (char*)p
9120: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
9130: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  n.n);.      /* s
9140: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65  qlite3VdbeCompre
9150: 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29  ssSpace(v, addr)
9160: 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ; */.    }else{.
9170: 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65        char zName
9180: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  [30];.      asse
9190: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  rt( p->op!=TK_CO
91a0: 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74  LUMN || pTabList
91b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
91c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
91d0: 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e 61  zeof(zName), zNa
91e0: 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  me, "column%d", 
91f0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  i+1);.      sqli
9200: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9210: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
9220: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  NAME, zName, 0);
9230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
9240: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
9250: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
9260: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
9270: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9280: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9290: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
92a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
92b0: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
92c0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
92d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
92e0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
92f0: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
9300: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
9310: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
9320: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
9330: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
9340: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9350: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
9360: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
9370: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9380: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
9390: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
93a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
93b0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
93c0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
93d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
93e0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
93f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9400: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
9410: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
9420: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
9430: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
9440: 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  t prepSelectStmt
9450: 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a  (Parse*, Select*
9460: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  );../*.** Given 
9470: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
9480: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
9490: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
94a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
94b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
94c0: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
94d0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
94e0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
94f0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
9500: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
9510: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
9520: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
9530: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
9540: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9550: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
9560: 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  l, *pCol;.  sqli
9570: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9580: 2d 3e 64 62 3b 0a 0a 20 20 77 68 69 6c 65 28 20  ->db;..  while( 
9590: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
95a0: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
95b0: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69  ect->pPrior;.  i
95c0: 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
95d0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
95e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
95f0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
9600: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
9610: 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ve(pParse, pSele
9620: 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65  ct, 0) ){.    re
9630: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
9640: 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
9650: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
9660: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
9670: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
9680: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9690: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
96a0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
96b0: 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71   = zTabName ? sq
96c0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
96d0: 2c 20 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  , zTabName) : 0;
96e0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
96f0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
9700: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
9710: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
9720: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
9730: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
9740: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
9750: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
9760: 62 2c 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e  b, sizeof(pTab->
9770: 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e  aCol[0])*pTab->n
9780: 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Col);.  for(i=0,
9790: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54   pCol=aCol; i<pT
97a0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
97b0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  Col++){.    Expr
97c0: 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68   *p, *pR;.    ch
97d0: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63  ar *zType;.    c
97e0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
97f0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43  int nName;.    C
9800: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
9810: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
9820: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
9830: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74  .    .    /* Get
9840: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
9850: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
9860: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
9870: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
9880: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
9890: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
98a0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
98b0: 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ken.z==0 || p->p
98c0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
98d0: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
98e0: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
98f0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
9900: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
9910: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
9920: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
9930: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
9940: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
9950: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
9960: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9970: 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
9980: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
9990: 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20  p==TK_DOT .     
99a0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52 3d           && (pR=
99b0: 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26  p->pRight)!=0 &&
99c0: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20   pR->token.z && 
99d0: 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29  pR->token.z[0] )
99e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  {.      /* For c
99f0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72  olumns of the fr
9a00: 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73 20  om A.B use B as 
9a10: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
9a20: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
9a30: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54  3MPrintf(db, "%T
9a40: 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a  ", &pR->token);.
9a50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
9a60: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
9a70: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
9a80: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
9a90: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
9aa0: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
9ab0: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
9ac0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9ad0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9ae0: 62 2c 20 22 25 54 22 2c 20 26 70 2d 3e 73 70 61  b, "%T", &p->spa
9af0: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
9b00: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65       /* If all e
9b10: 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20  lse fails, make 
9b20: 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  up a name */.   
9b30: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9b40: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63  e3MPrintf(db, "c
9b50: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
9b60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
9b70: 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Name || db->mall
9b80: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9b90: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
9ba0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ed = 1;.      sq
9bb0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
9bc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9bd0: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62  DeleteTable(pTab
9be0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9bf0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
9c00: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
9c10: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  e);..    /* Make
9c20: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
9c30: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
9c40: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
9c50: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
9c60: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
9c70: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
9c80: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
9c90: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
9ca0: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
9cb0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
9cc0: 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a    for(j=cnt=0; j
9cd0: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
9ce0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9cf0: 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  mp(aCol[j].zName
9d00: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  , zName)==0 ){. 
9d10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
9d20: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
9d30: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
9d40: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a  MPrintf(db, "%z:
9d50: 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  %d", zName, ++cn
9d60: 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  t);.        j = 
9d70: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
9d80: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
9d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9da0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
9db0: 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  = zName;..    /*
9dc0: 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d   Get the typenam
9dd0: 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  e, type affinity
9de0: 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  , and collating 
9df0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
9e00: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  .    ** column..
9e10: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
9e20: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
9e30: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
9e40: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
9e50: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a  ect->pSrc;.    z
9e60: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
9e70: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
9e80: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
9e90: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
9ea0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70  ol->zType = zTyp
9eb0: 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  e;.    pCol->aff
9ec0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
9ed0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
9ee0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
9ef0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
9f00: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
9f10: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
9f20: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
9f30: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9f40: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
9f50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
9f60: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
9f70: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
9f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9f90: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9fa0: 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
9fb0: 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20  ng by doing the 
9fc0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69  following.** thi
9fd0: 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs:.**.**    (1
9fe0: 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
9ff0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
a000: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
a010: 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
a020: 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
a030: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
a040: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
a050: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
a060: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
a070: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
a080: 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
a090: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
a0a0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
a0b0: 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
a0c0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
a0d0: 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
a0e0: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
a0f0: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
a100: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
a110: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
a120: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
a130: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
a140: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
a150: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
a160: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
a170: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
a180: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
a190: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
a1a0: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
a1b0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
a1c0: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
a1d0: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
a1e0: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
a1f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
a200: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
a210: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
a220: 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
a230: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a240: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
a250: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
a260: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
a270: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
a280: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
a290: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
a2a0: 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
a2b0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
a2c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
a2d0: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
a2e0: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
a2f0: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
a300: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
a310: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
a320: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
a330: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
a340: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
a350: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
a360: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
a370: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
a380: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
a390: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
a3a0: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
a3b0: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
a3c0: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
a3d0: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
a3e0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
a3f0: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
a400: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
a410: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
a420: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
a430: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
a440: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
a450: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
a460: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a470: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
a480: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
a490: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
a4a0: 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
a4b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a4c0: 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  b;..  if( p==0 |
a4d0: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  | p->pSrc==0 || 
a4e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a4f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
a500: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
a510: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
a520: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
a530: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
a540: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
a550: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
a560: 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
a570: 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
a580: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
a590: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
a5a0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
a5b0: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
a5c0: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
a5d0: 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c  ->pSrc);..  /* L
a5e0: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
a5f0: 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
a600: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
a610: 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
a620: 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
a630: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a640: 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
a650: 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
a660: 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
a670: 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
a680: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
a690: 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
a6a0: 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
a6b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
a6c0: 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
a6d0: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
a6e0: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
a6f0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
a700: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46  pTab;.    if( pF
a710: 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
a720: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
a730: 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
a740: 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
a750: 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
a760: 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
a770: 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
a780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
a790: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
a7a0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
a7b0: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
a7c0: 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
a7d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a7e0: 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ERY.      /* A s
a7f0: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
a800: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
a810: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
a820: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
a830: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
a840: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
a850: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
a860: 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61      pFrom->zAlia
a870: 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  s =.          sq
a880: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
a890: 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
a8a0: 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70  y_%p_", (void*)p
a8b0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
a8c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a8d0: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
a8e0: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
a8f0: 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
a900: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
a910: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
a920: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46 72  lect(pParse, pFr
a930: 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f  om->zAlias, pFro
a940: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
a950: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
a960: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a970: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a980: 20 20 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d    /* The isEphem
a990: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
a9a0: 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73  that the Table s
a9b0: 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65  tructure has bee
a9c0: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d  n.      ** dynam
a9d0: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
a9e0: 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65   and may be free
a9f0: 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20  d at any time.  
aa00: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
aa10: 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73        ** pTab is
aa20: 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
aa30: 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61   a persistent ta
aa40: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
aa50: 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20  at defines.     
aa60: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
aa70: 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20  schema. */.     
aa80: 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d   pTab->isEphem =
aa90: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
aaa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
aab0: 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
aac0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
aad0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
aae0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
aaf0: 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
ab00: 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
ab10: 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  >pTab = pTab = .
ab20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
ab30: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
ab40: 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  e,0,pFrom->zName
ab50: 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
ab60: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
ab70: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
ab80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
ab90: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
aba0: 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
abb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
abc0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
abd0: 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
abe0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
abf0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
ac00: 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
ac10: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
ac20: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
ac30: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
ac40: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
ac50: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
ac60: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ac70: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
ac80: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
ac90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
aca0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
acb0: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  }.        /* If 
acc0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
acd0: 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  0 it means we ar
ace0: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
acf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77  .        ** view
ad00: 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20   within a view. 
ad10: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75   The SELECT stru
ad20: 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64  cture has alread
ad30: 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a  y been.        *
ad40: 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20  * copied by the 
ad50: 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65  outer view so we
ad60: 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f   can skip the co
ad70: 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20  py step here.   
ad80: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
ad90: 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20  nner view..     
ada0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
adb0: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
adc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
add0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
ade0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
adf0: 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
ae00: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
ae10: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
ae20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ae30: 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
ae40: 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
ae50: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
ae60: 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
ae70: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72  /.  if( sqlitePr
ae80: 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
ae90: 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , p) ) return 1;
aea0: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
aeb0: 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
aec0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
aed0: 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
aee0: 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
aef0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
af00: 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
af10: 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
af20: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
af30: 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
af40: 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
af50: 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
af60: 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
af70: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
af80: 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
af90: 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
afa0: 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
afb0: 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
afc0: 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
afd0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
afe0: 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
aff0: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
b000: 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
b010: 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
b020: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
b030: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
b040: 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
b050: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
b060: 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
b070: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
b080: 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
b090: 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
b0a0: 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
b0b0: 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
b0c0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
b0d0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
b0e0: 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
b0f0: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
b100: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
b110: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
b120: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
b130: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
b140: 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
b150: 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
b160: 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
b170: 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
b180: 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
b190: 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
b1a0: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
b1b0: 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
b1c0: 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
b1d0: 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
b1e0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
b1f0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
b200: 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
b210: 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
b220: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
b230: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
b240: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
b250: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
b260: 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
b270: 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
b280: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
b290: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b2a0: 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
b2b0: 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
b2c0: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
b2d0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
b2e0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
b2f0: 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
b300: 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
b310: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
b320: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
b330: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
b340: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
b350: 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
b360: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
b370: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
b380: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b390: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
b3a0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
b3b0: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
b3c0: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
b3d0: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
b3e0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
b3f0: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
b400: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
b410: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
b420: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
b430: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
b440: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
b450: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
b460: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
b470: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
b480: 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
b490: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
b4a0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
b4b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
b4c0: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
b4d0: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
b4e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
b500: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
b510: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
b520: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
b530: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
b540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b550: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
b560: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
b570: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
b580: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
b590: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
b5a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
b5b0: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
b5c0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
b5d0: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
b5e0: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
b5f0: 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
b600: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
b610: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
b620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b630: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
b640: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
b650: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
b660: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b670: 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e  mToken(db, &pE->
b680: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  pLeft->token);. 
b690: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b6a0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
b6b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
b6c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
b6d0: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
b6e0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
b6f0: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
b700: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
b710: 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
b720: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
b730: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
b740: 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
b750: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b760: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
b770: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
b780: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
b790: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
b7a0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
b7b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
b7c0: 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e  zTName && (zTabN
b7d0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
b7e0: 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20  me[0]==0 || .   
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
b800: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
b810: 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
b820: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
b830: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b850: 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
b860: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
b870: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
b880: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b890: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c      Expr *pExpr,
b8a0: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
b8b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
b8c0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
b8d0: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
b8e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
b8f0: 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
b900: 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72  s 'hidden' (curr
b910: 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69  ently only possi
b920: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
b930: 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  ** for virtual t
b940: 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69  ables), do not i
b950: 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65  nclude it in the
b960: 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
b970: 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
b980: 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  set list..      
b990: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b9a0: 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65       if( IsHidde
b9b0: 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
b9c0: 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20  Col[j]) ){.     
b9d0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
b9e0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
b9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ba00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
ba10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
ba20: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
ba40: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
ba50: 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
ba60: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ba80: 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79  (pLeft[1].jointy
ba90: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
baa0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
bac0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
bad0: 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ->pTab, zName)>=
bae0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
baf0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
bb00: 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
bb10: 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
bb20: 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
bb30: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
bb40: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
bb50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
bb60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
bb90: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
bba0: 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69  ex(pLeft[1].pUsi
bbb0: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
bbc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bbd0: 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
bbe0: 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
bbf0: 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
bc00: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
bc10: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
bc20: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
bc30: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
bc40: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
bc50: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
bc60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
bc70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
bc80: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
bc90: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
bca0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
bcb0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
bcc0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
bcd0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
bce0: 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74           setQuot
bcf0: 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  edToken(pParse, 
bd00: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20  &pRight->token, 
bd10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
bd20: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
bd30: 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c   && (longNames |
bd40: 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
bd50: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >1) ){.         
bd60: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
bd70: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bd80: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
bd90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
bda0: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
bdb0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bdc0: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
bdd0: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
bdf0: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
be00: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
be10: 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
be20: 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e  pParse, &pLeft->
be30: 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
be40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
be50: 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d  setToken(&pExpr-
be60: 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20  >span, .        
be70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
be80: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
be90: 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
bea0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
beb0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
bec0: 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20  an.dyn = 1;.    
bed0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
bee0: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20  >token.z = 0;.  
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
bf00: 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a  r->token.n = 0;.
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bf20: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  xpr->token.dyn =
bf30: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
bf40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bf50: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
bf60: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
bf70: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d     pExpr->span =
bf80: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20   pExpr->token;. 
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bfa0: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30  pr->span.dyn = 0
bfb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
bfd0: 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
bfe0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
bff0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
c000: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
c010: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
c020: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
c030: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
c050: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
c060: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
c070: 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  , pNew, pExpr, &
c080: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  pRight->token);.
c090: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
c0a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c0b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c0c0: 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
c0d0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
c0e0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
c0f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c100: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
c110: 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
c120: 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
c130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c140: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
c150: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
c160: 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
c170: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
c180: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c190: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
c1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c1b0: 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e(zTName);.     
c1c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
c1d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
c1e0: 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  te(pEList);.    
c1f0: 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
c200: 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
c210: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
c220: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
c230: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
c240: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
c250: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
c260: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
c270: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c280: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
c290: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
c2a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
c2b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e  E_ERROR;.  }.#en
c2c0: 64 69 66 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  dif.  if( db->ma
c2d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c2e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
c2f0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
c300: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
c310: 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  E is a pointer t
c320: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
c330: 77 68 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c  which is a singl
c340: 65 20 74 65 72 6d 20 69 6e 0a 2a 2a 20 4f 52 44  e term in.** ORD
c350: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
c360: 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
c370: 49 66 20 70 45 20 65 76 61 6c 75 61 74 65 73 20  If pE evaluates 
c380: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  to an integer co
c390: 6e 73 74 61 6e 74 20 69 2c 20 74 68 65 6e 20 72  nstant i, then r
c3a0: 65 74 75 72 6e 20 69 2e 0a 2a 2a 20 54 68 69 73  eturn i..** This
c3b0: 20 69 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f   is an indicatio
c3c0: 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  n to the caller 
c3d0: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73  that it should s
c3e0: 6f 72 74 0a 2a 2a 20 62 79 20 74 68 65 20 69 2d  ort.** by the i-
c3f0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
c400: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
c410: 2a 2a 20 49 66 20 70 45 20 69 73 20 61 20 77 65  ** If pE is a we
c420: 6c 6c 2d 66 6f 72 6d 65 64 20 65 78 70 72 65 73  ll-formed expres
c430: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 53 45 4c  sion and the SEL
c440: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
c450: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64   is not compound
c460: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  , then return 0.
c470: 20 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73    This indicates
c480: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   to the.** calle
c490: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
c4a0: 20 73 6f 72 74 20 62 79 20 74 68 65 20 76 61 6c   sort by the val
c4b0: 75 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ue of the ORDER 
c4c0: 42 59 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  BY.** expression
c4d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
c4e0: 45 4c 45 43 54 20 69 73 20 63 6f 6d 70 6f 75 6e  ELECT is compoun
c4f0: 64 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  d, then attempt 
c500: 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69  to match pE agai
c510: 6e 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65  nst.** result se
c520: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
c530: 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   left-most SELEC
c540: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
c550: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  turn.** the inde
c560: 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68  x i of the match
c570: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61 73 20 61  ing column, as a
c580: 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
c590: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
c5a0: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f  hat it should so
c5b0: 72 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63  rt by the i-th c
c5c0: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 72 65  olumn.  If there
c5d0: 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c   is.** no match,
c5e0: 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 6c   return -1 and l
c5f0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
c600: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
c610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
c620: 61 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54  atchOrderByTermT
c630: 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  oExprList(.  Par
c640: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c650: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c660: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
c670: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
c680: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
c690: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
c6a0: 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f  ement with the O
c6b0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
c6c0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 20 20  /.  Expr *pE,   
c6d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
c6e0: 65 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20  ecific ORDER BY 
c6f0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 64  term */.  int id
c700: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
c710: 57 68 65 6e 20 4f 52 44 45 52 20 42 59 20 74 65  When ORDER BY te
c720: 72 6d 20 69 73 20 74 68 69 73 20 2a 2f 0a 20 20  rm is this */.  
c730: 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 2c 20  int isCompound, 
c740: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
c750: 69 73 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  is is a compound
c760: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 75 38 20   SELECT */.  u8 
c770: 2a 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20  *pHasAgg        
c780: 2f 2a 20 54 72 75 65 20 69 66 20 65 78 70 72 65  /* True if expre
c790: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
c7a0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
c7b0: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ns */.){.  int i
c7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c7d0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c7e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c7f0: 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ist;  /* The col
c800: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75  umns of the resu
c810: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65  lt set */.  Name
c820: 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f  Context nc;    /
c830: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
c840: 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20  or resolving pE 
c850: 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  */...  /* If the
c860: 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65   term is an inte
c870: 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 72 65  ger constant, re
c880: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
c890: 66 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 73  f that.  ** cons
c8a0: 74 61 6e 74 20 2a 2f 0a 20 20 70 45 4c 69 73 74  tant */.  pEList
c8b0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
c8c0: 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
c8d0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
c8e0: 45 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 69 66  E, &i) ){.    if
c8f0: 28 20 69 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i<=0 ){.      
c900: 2f 2a 20 49 66 20 69 20 69 73 20 74 6f 6f 20 73  /* If i is too s
c910: 6d 61 6c 6c 2c 20 6d 61 6b 65 20 69 74 20 74 6f  mall, make it to
c920: 6f 20 62 69 67 2e 20 20 54 68 61 74 20 77 61 79  o big.  That way
c930: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 20 20 20   the calling.   
c940: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73     ** function s
c950: 74 69 6c 6c 20 73 65 65 73 20 61 20 76 61 6c 75  till sees a valu
c960: 65 20 74 68 61 74 20 69 73 20 6f 75 74 20 6f 66  e that is out of
c970: 20 72 61 6e 67 65 2c 20 62 75 74 20 64 6f 65 73   range, but does
c980: 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  .      ** not co
c990: 6e 66 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  nfuse the column
c9a0: 20 6e 75 6d 62 65 72 20 77 69 74 68 20 30 20 6f   number with 0 o
c9b0: 72 20 2d 31 20 72 65 73 75 6c 74 20 63 6f 64 65  r -1 result code
c9c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c9d0: 20 69 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i = pEList->nEx
c9e0: 70 72 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pr+1;.    }.    
c9f0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 0a 20  return i;.  }.. 
ca00: 20 2f 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20   /* If the term 
ca10: 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e  is a simple iden
ca20: 74 69 66 69 65 72 20 74 68 61 74 20 74 72 79 20  tifier that try 
ca30: 74 6f 20 6d 61 74 63 68 20 74 68 61 74 20 69 64  to match that id
ca40: 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 61 67  entifier.  ** ag
ca50: 61 69 6e 73 74 20 61 20 63 6f 6c 75 6d 6e 20 6e  ainst a column n
ca60: 61 6d 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ame in the resul
ca70: 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
ca80: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ( pE->op==TK_ID 
ca90: 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53  || (pE->op==TK_S
caa0: 54 52 49 4e 47 20 26 26 20 70 45 2d 3e 74 6f 6b  TRING && pE->tok
cab0: 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27 27 29 20 29  en.z[0]!='\'') )
cac0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
cad0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cae0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d      char *zCol =
caf0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
cb00: 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 74  Token(db, &pE->t
cb10: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  oken);.    if( z
cb20: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
cb30: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
cb40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cb50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
cb60: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
cb70: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
cb80: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
cb90: 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73   if( zAs!=0 && s
cba0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
cbb0: 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  s, zCol)==0 ){. 
cbc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
cbd0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ree(zCol);.     
cbe0: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
cbf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cc00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
cc10: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ol);.  }..  /* R
cc20: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
cc30: 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
cc40: 20 74 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e   term expression
cc50: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
cc60: 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63  nc, 0, sizeof(nc
cc70: 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20  ));.  nc.pParse 
cc80: 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70  = pParse;.  nc.p
cc90: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
cca0: 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45  t->pSrc;.  nc.pE
ccb0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
ccc0: 20 6e 63 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31   nc.allowAgg = 1
ccd0: 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b  ;.  nc.nErr = 0;
cce0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
ccf0: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
cd00: 6e 63 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 69  nc, pE) ){.    i
cd10: 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  f( isCompound ){
cd20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
cd30: 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29  rorClear(pParse)
cd40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
cd50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cd60: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
cd70: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 63    }.  }.  if( nc
cd80: 2e 68 61 73 41 67 67 20 26 26 20 70 48 61 73 41  .hasAgg && pHasA
cd90: 67 67 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 41  gg ){.    *pHasA
cda0: 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 1;.  }..  /
cdb0: 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  * For a compound
cdc0: 20 53 45 4c 45 43 54 2c 20 77 65 20 6e 65 65 64   SELECT, we need
cdd0: 20 74 6f 20 74 72 79 20 74 6f 20 6d 61 74 63 68   to try to match
cde0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
cdf0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  ** expression ag
ce00: 61 69 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73  ainst an express
ce10: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
ce20: 74 20 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28  t set.  */.  if(
ce30: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20   isCompound ){. 
ce40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
ce50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ce60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
ce70: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
ce80: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
ce90: 70 72 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  pr, pE) ){.     
cea0: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
ceb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
cec0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ced0: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61  ./*.** Analyze a
cee0: 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  nd ORDER BY or G
cef0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
cf00: 6e 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  n a simple SELEC
cf10: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
cf20: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
cf30: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
cf40: 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 74 65  ..**.** Every te
cf50: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
cf60: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
cf70: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62  lause needs to b
cf80: 65 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  e an.** expressi
cf90: 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72  on.  If any expr
cfa0: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
cfb0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74  eger constant, t
cfc0: 68 65 6e 0a 2a 2a 20 74 68 61 74 20 65 78 70 72  hen.** that expr
cfd0: 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63  ession is replac
cfe0: 65 64 20 62 79 20 74 68 65 20 63 6f 72 72 65 73  ed by the corres
cff0: 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72  ponding .** expr
d000: 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
d010: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
d020: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
d030: 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20  sOrderGroupBy(. 
d040: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d050: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d060: 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76  g context.  Leav
d070: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
d080: 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
d090: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
d0a0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
d0b0: 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  tatement contain
d0c0: 69 6e 67 20 74 68 65 20 63 6c 61 75 73 65 20 2a  ing the clause *
d0d0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
d0e0: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65  rderBy,   /* The
d0f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
d100: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
d110: 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  be processed */.
d120: 20 20 69 6e 74 20 69 73 4f 72 64 65 72 2c 20 20    int isOrder,  
d130: 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72          /* 1 for
d140: 20 4f 52 44 45 52 20 42 59 2e 20 20 30 20 66 6f   ORDER BY.  0 fo
d150: 72 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  r GROUP BY */.  
d160: 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20 20  u8 *pHasAgg     
d170: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
d180: 54 52 55 45 20 69 66 20 61 6e 79 20 74 65 72 6d  TRUE if any term
d190: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 61 67 67   contains an agg
d1a0: 72 65 67 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  regate */.){.  i
d1b0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
d1c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d1d0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
d1e0: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4f 72  List;..  if( pOr
d1f0: 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72  derBy==0 || pPar
d200: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d210: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
d220: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
d230: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72  COLUMN.  if( pOr
d240: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d  derBy->nExpr>db-
d250: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
d260: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
d270: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d280: 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72 20  zType = isOrder 
d290: 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52 4f  ? "ORDER" : "GRO
d2a0: 55 50 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  UP";.    sqlite3
d2b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d2c0: 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
d2d0: 20 69 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65   in %s BY clause
d2e0: 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72  ", zType);.    r
d2f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e  eturn 1;.  }.#en
d300: 64 69 66 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  dif.  pEList = p
d310: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
d320: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
d330: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d340: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
d350: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
d360: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
d370: 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20   iCol;.    Expr 
d380: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
d390: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d3a0: 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65  iCol = matchOrde
d3b0: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
d3c0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
d3d0: 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30 2c 20 70  t, pE, i+1, 0, p
d3e0: 48 61 73 41 67 67 29 3b 0a 20 20 20 20 69 66 28  HasAgg);.    if(
d3f0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
d400: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
d410: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45  .    if( iCol>pE
d420: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
d430: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d440: 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65 72  *zType = isOrder
d450: 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47 52   ? "ORDER" : "GR
d460: 4f 55 50 22 3b 0a 20 20 20 20 20 20 73 71 6c 69  OUP";.      sqli
d470: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d480: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 22 25  se, .         "%
d490: 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74  r %s BY term out
d4a0: 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
d4b0: 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
d4c0: 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
d4d0: 25 64 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c  %d", i+1, zType,
d4e0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d4f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
d500: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d510: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 43  Col>0 ){.      C
d520: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
d530: 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pE->pColl;.     
d540: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45 2d   int flags = pE-
d550: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
d560: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73 71  ollate;.      sq
d570: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d580: 70 45 29 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  pE);.      pE = 
d590: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
d5a0: 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  b, pEList->a[iCo
d5b0: 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
d5c0: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
d5d0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20  ].pExpr = pE;.  
d5e0: 20 20 20 20 69 66 28 20 70 45 20 26 26 20 70 43      if( pE && pC
d5f0: 6f 6c 6c 20 26 26 20 66 6c 61 67 73 20 29 7b 0a  oll && flags ){.
d600: 20 20 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c          pE->pCol
d610: 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  l = pColl;.     
d620: 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20     pE->flags |= 
d630: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20  flags;.      }. 
d640: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d650: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
d660: 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
d670: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
d680: 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43  lause in a SELEC
d690: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
d6a0: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
d6b0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
d6c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6d  n..**.** For com
d6d0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
d6e0: 74 65 6d 65 6e 74 73 2c 20 65 76 65 72 79 20 65  tements, every e
d6f0: 78 70 72 65 73 73 69 6f 6e 20 6e 65 65 64 73 20  xpression needs 
d700: 74 6f 20 62 65 20 6f 66 0a 2a 2a 20 74 79 70 65  to be of.** type
d710: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 77 69 74 68 20   TK_COLUMN with 
d720: 61 20 69 54 61 62 6c 65 20 76 61 6c 75 65 20 61  a iTable value a
d730: 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 34  s given in the 4
d740: 74 68 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  th parameter..**
d750: 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   If any expressi
d760: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
d770: 2c 20 74 68 61 74 20 62 65 63 6f 6d 65 73 20 74  , that becomes t
d780: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
d790: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
d7a0: 6d 61 74 63 68 20 74 68 65 20 65 78 70 72 65 73  match the expres
d7b0: 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 72 65 73  sion against res
d7c0: 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
d7d0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6c 65 66 74  from.** the left
d7e0: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 2e 0a 2a 2f  -most SELECT..*/
d7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
d800: 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  essCompoundOrder
d810: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
d820: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d830: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
d840: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
d850: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
d860: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
d870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
d880: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
d890: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44  ntaining the ORD
d8a0: 45 52 20 42 59 20 2a 2f 0a 20 20 69 6e 74 20 69  ER BY */.  int i
d8b0: 54 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20  Table           
d8c0: 20 2f 2a 20 4f 75 74 70 75 74 20 74 61 62 6c 65   /* Output table
d8d0: 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45   for compound SE
d8e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
d8f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
d900: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
d910: 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  rBy;.  ExprList 
d920: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
d930: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f  e3 *db;.  int mo
d940: 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70  reToDo = 1;..  p
d950: 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65 63  OrderBy = pSelec
d960: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  t->pOrderBy;.  i
d970: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
d980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 20   return 0;.  db 
d990: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
d9a0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
d9b0: 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72  UMN.  if( pOrder
d9c0: 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  By->nExpr>db->aL
d9d0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
d9e0: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
d9f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
da00: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
da10: 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45  ny terms in ORDE
da20: 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  R BY clause");. 
da30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
da40: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
da50: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
da60: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
da70: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
da80: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77  one = 0;.  }.  w
da90: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
daa0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65  Prior ){.    pSe
dab0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
dac0: 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68  pPrior;.  }.  wh
dad0: 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26 26 20  ile( pSelect && 
dae0: 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20  moreToDo ){.    
daf0: 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20  moreToDo = 0;.  
db00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
db10: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
db20: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
db30: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45  ol = -1;.      E
db40: 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a  xpr *pE, *pDup;.
db50: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
db60: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
db70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
db80: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
db90: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
dba0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
dbb0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 29 3b 0a  xprDup(db, pE);.
dbc0: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
dbd0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
dbe0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 44         assert(pD
dbf0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  up);.        iCo
dc00: 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79  l = matchOrderBy
dc10: 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70  TermToExprList(p
dc20: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
dc30: 70 44 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29  pDup, i+1, 1, 0)
dc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dc50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
dc60: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  e(pDup);.      i
dc70: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
dc80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
dc90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
dca0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
dcb0: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28  EList;.      if(
dcc0: 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20   pEList==0 ){.  
dcd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
dce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dcf0: 28 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  ( iCol>pEList->n
dd00: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
dd10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
dd20: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
dd30: 20 20 20 20 22 25 72 20 4f 52 44 45 52 20 42 59      "%r ORDER BY
dd40: 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e   term out of ran
dd50: 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
dd60: 0a 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74  .           "bet
dd70: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
dd80: 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  i+1, pEList->nEx
dd90: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
dda0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
ddb0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
ddc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 6f  ){.        pE->o
ddd0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
dde0: 20 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c         pE->iTabl
ddf0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
de00: 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20 2d      pE->iAgg = -
de10: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69  1;.        pE->i
de20: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 2d 31 3b  Column = iCol-1;
de30: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 70 54 61  .        pE->pTa
de40: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
de50: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
de60: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ne = 1;.      }e
de70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72  lse{.        mor
de80: 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20  eToDo = 1;.     
de90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65   }.    }.    pSe
dea0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
deb0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72  pNext;.  }.  for
dec0: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
ded0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
dee0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
def0: 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b  >a[i].done==0 ){
df00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
df10: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
df20: 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  %r ORDER BY term
df30: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
df40: 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20 20  any ".          
df50: 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65    "column in the
df60: 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b   result set", i+
df70: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
df80: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
df90: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
dfa0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
dfb0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
dfc0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
dfd0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
dfe0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
dff0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e000: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
e010: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
e020: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
e030: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
e040: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
e050: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
e060: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e070: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
e080: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
e090: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
e0a0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
e0b0: 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  >db);.#ifndef SQ
e0c0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
e0d0: 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20      if( v ){.   
e0e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e0f0: 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65  dOp0(v, OP_Trace
e100: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
e110: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
e120: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
e130: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
e140: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
e150: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
e160: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
e170: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
e180: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
e190: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
e1a0: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
e1b0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
e1c0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
e1d0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
e1e0: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
e1f0: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
e200: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
e210: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
e220: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
e230: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
e240: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
e250: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
e260: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
e270: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
e280: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
e290: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
e2a0: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
e2b0: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
e2c0: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
e2d0: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
e2e0: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
e2f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
e300: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
e310: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
e320: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
e330: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
e340: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
e350: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
e360: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
e370: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
e380: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
e390: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
e3a0: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
e3b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
e3c0: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
e3d0: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
e3e0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
e3f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
e400: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
e410: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
e420: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
e430: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
e440: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
e450: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
e460: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
e470: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
e480: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
e490: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
e4a0: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
e4b0: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
e4c0: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
e4d0: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
e4e0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
e4f0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
e500: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
e510: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
e520: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
e530: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
e540: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
e550: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
e560: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
e570: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
e580: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
e590: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
e5a0: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
e5b0: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
e5c0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
e5d0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
e5e0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
e5f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
e600: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
e610: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
e620: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
e630: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
e640: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
e650: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
e660: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
e670: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e680: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
e690: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e6a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e6b0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
e6c0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
e6d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e6e0: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
e6f0: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Int, iLimit);.  
e700: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e710: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
e720: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
e730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e740: 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  _IfZero, iLimit,
e750: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20   iBreak);.  }.  
e760: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
e770: 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74  {.    p->iOffset
e780: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
e790: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
e7a0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
e7b0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
e7c0: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
e7d0: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
e7e0: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
e7f0: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
e800: 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  }.    v = sqlite
e810: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e820: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
e830: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
e840: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e850: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
e860: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
e870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e880: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
e890: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
e8a0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e8b0: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
e8c0: 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  ));.    addr1 = 
e8d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e8e0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
e8f0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
e900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e910: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
e920: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
e930: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
e940: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
e950: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
e960: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e970: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e980: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
e990: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
e9a0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
e9b0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
e9c0: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
e9d0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
e9e0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e9f0: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
ea00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ea10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ea20: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
ea30: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
ea40: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ea50: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
ea60: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
ea70: 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75  Allocate a virtu
ea80: 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
ea90: 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a  for sorting..*/.
eaa0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
eab0: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50  teSortingIndex(P
eac0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
ead0: 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73  lect *p, ExprLis
eae0: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
eaf0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
eb00: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
eb10: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
eb20: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20  By->iECursor==0 
eb30: 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
eb40: 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
eb50: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
eb60: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
eb70: 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
eb80: 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 45  >pVdbe, OP_OpenE
eb90: 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
ebc0: 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
ebd0: 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20  By->nExpr+1);.  
ebe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
ebf0: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20  rOpenEphm[2] == 
ec00: 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64  -1 );.    p->add
ec10: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
ec20: 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ddr;.  }.}..#ifn
ec30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ec40: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ec50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ec60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
ec70: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
ec80: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
ec90: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
eca0: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
ecb0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
ecc0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
ecd0: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
ece0: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
ecf0: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
ed00: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
ed10: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
ed20: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ed30: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
ed40: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
ed50: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
ed60: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
ed70: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
ed80: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
ed90: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
eda0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
edb0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
edc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
edd0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
ede0: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
edf0: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
ee00: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
ee10: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
ee20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
ee30: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
ee40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
ee50: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  et = 0;.  }.  if
ee60: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
ee70: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
ee80: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
ee90: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
eea0: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
eeb0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
eec0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eed0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
eee0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20  D_SELECT */../* 
eef0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
ef00: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
ef10: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
ef20: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
ef30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
ef40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
ef50: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
ef60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ef70: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
ef80: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
ef90: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
efa0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 2f 2a  st *pDest,    /*
efb0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
efc0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
efd0: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
efe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
eff0: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
f000: 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
f010: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 3b 0a 0a 0a   string */.);...
f020: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f030: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
f040: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
f050: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f060: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
f070: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
f080: 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
f090: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
f0a0: 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
f0b0: 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
f0c0: 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
f0d0: 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
f0e0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
f0f0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
f100: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
f110: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
f120: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
f130: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
f140: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
f150: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
f160: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
f170: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
f180: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
f190: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
f1a0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
f1b0: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
f1c0: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
f1d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
f1e0: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
f1f0: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
f200: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
f210: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
f220: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
f230: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
f240: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
f250: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
f260: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
f270: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
f280: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
f290: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
f2a0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
f2b0: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
f2c0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
f2d0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
f2e0: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
f2f0: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
f300: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
f330: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
f340: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
f350: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
f360: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
f370: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
f380: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
f390: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
f3a0: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
f3b0: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
f3c0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
f3d0: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
f3e0: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
f3f0: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
f400: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
f410: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
f420: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
f430: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
f440: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
f450: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
f460: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
f470: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
f480: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
f490: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
f4a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f4b0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
f4c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f4d0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
f4e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
f4f0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
f500: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
f510: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
f520: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
f530: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
f540: 65 73 74 2c 20 20 20 20 2f 2a 20 57 68 61 74 20  est,    /* What 
f550: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
f560: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 63 68   results */.  ch
f570: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
f580: 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
f590: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
f5a0: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
f5b0: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
f5c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
f5d0: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
f5e0: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
f5f0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
f600: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
f610: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
f620: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
f630: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
f640: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
f650: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f660: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
f670: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
f680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f690: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f6a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f6b0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
f6c0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
f6d0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
f6e0: 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e  use on p */.  in
f6f0: 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20 20 20  t aSetP2[2];    
f700: 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20 76 61      /* Set P2 va
f710: 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f 70 20  lue of these op 
f720: 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  to number of col
f730: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  umns */.  int nS
f740: 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20 20 20  etP2 = 0;       
f750: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  /* Number of slo
f760: 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d 20 75  ts in aSetP2[] u
f770: 73 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  sed */.  SelectD
f780: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
f790: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
f7a0: 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
f7b0: 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  /..  /* Make sur
f7c0: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
f7d0: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
f7e0: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
f7f0: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
f800: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
f810: 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
f820: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
f830: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
f840: 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
f850: 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  */.  if( p==0 ||
f860: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
f870: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
f880: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f890: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50  ct_end;.  }.  pP
f8a0: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
f8b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
f8c0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d  or->pRightmost!=
f8d0: 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65  pPrior );.  asse
f8e0: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
f8f0: 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68  htmost==p->pRigh
f900: 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70  tmost );.  if( p
f910: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
f920: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f930: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
f940: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
f950: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
f960: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
f970: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
f980: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
f990: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
f9a0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f9b0: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
f9c0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
f9d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f9e0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
f9f0: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
fa00: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
fa10: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
fa20: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
fa30: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
fa40: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
fa50: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
fa60: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
fa70: 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69  e we have a vali
fa80: 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20  d query engine. 
fa90: 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20   If not, create 
faa0: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
fab0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
fac0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
fad0: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
fae0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
faf0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
fb00: 64 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  d;.  }..#if 0.  
fb10: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
fb20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
fb30: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
fb40: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
fb50: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e  t, aff);.  }.#en
fb60: 64 69 66 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  dif..  /* Create
fb70: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
fb80: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fb90: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
fba0: 2a 2f 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  */.  dest = *pDe
fbb0: 73 74 3b 0a 20 20 69 66 28 20 64 65 73 74 2e 65  st;.  if( dest.e
fbc0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
fbd0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
fbe0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
fbf0: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
fc00: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
fc10: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
fc20: 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32  ]) );.    aSetP2
fc30: 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c  [nSetP2++] = sql
fc40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fc50: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
fc60: 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20  al, dest.iParm, 
fc70: 30 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  0);.    dest.eDe
fc80: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
fc90: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
fca0: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
fcb0: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
fcc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
fcd0: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42  ..  */.  pOrderB
fce0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
fcf0: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
fd00: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
fd10: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ALL: {.      if(
fd20: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
fd30: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
fd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73   = 0;.        as
fd50: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
fd60: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20  Limit );.       
fd70: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
fd80: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
fd90: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
fda0: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
fdb0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
fdc0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
fdd0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
fde0: 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
fdf0: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  f);.        p->p
fe00: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
fe10: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
fe20: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  0;.        if( r
fe30: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
fe40: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fe50: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
fe60: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
fe70: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
fe80: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
fe90: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
fea0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
feb0: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
fec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
fed0: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
fee0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
fef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ff00: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
ff10: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
ff20: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ff30: 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
ff40: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
ff50: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  "));.        }. 
ff60: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
ff70: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
ff80: 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  , p, &dest, 0, 0
ff90: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
ffa0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
ffb0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
ffc0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
ffd0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
ffe0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
fff0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10000 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
10010 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10020 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
10030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10040 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10050 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
10060 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
10070 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
10080 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
10090 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
100a0 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
100b0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
100c0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
100d0 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
100e0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
100f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
10100 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
10110 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
10120 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
10130 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
10140 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
10150 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
10160 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
10170 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
10180 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
10190 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
101a0 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
101b0 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
101c0 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
101d0 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
101e0 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
101f0 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
10200 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
10210 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
10220 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  ;..      priorOp
10230 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
10240 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
10250 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
10260 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
10270 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65  priorOp && pOrde
10280 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c  rBy==0 && !p->pL
10290 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66  imit && !p->pOff
102a0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  set ){.        /
102b0 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
102c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
102d0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
102e0 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
102f0 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
10300 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10310 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
10320 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
10330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
10340 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
10350 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
10360 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10370 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
10380 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
10390 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
103a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
103b0 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
103c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
103d0 20 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43      if( processC
103e0 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70  ompoundOrderBy(p
103f0 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
10400 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
10410 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
10420 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
10430 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10440 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
10450 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10460 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
10470 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
10480 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
10490 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54  if( priorOp==SRT
104a0 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
104b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74      assert( nSet
104c0 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32  P2<sizeof(aSetP2
104d0 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b  )/sizeof(aSetP2[
104e0 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  0]) );.         
104f0 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
10500 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
10510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10520 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
10530 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
10540 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
10550 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10560 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
10570 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
10580 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  ost->usesEphm = 
10590 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
105a0 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69       createSorti
105b0 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
105c0 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p, pOrderBy);.  
105d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
105e0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
105f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
10600 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
10610 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
10620 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
10630 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
10640 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
10650 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10660 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
10670 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
10680 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
10690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
106a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
106b0 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c  ior, &uniondest,
106c0 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
106d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
106e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
106f0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10700 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
10710 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
10720 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
10730 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
10740 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
10750 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
10760 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
10770 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
10780 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
10790 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
107a0 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
107b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
107c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
107d0 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
107e0 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
107f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
10800 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
10810 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10820 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61  0;.      p->disa
10830 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f  llowOrderBy = pO
10840 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20  rderBy!=0;.     
10850 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
10860 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
10870 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
10880 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
10890 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
108a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
108b0 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
108c0 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63  t = op;.      rc
108d0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
108e0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
108f0 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ondest, 0, 0, 0,
10900 20 61 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20   aff);.      /* 
10910 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
10920 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
10930 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
10940 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
10950 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
10960 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
10970 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
10980 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
10990 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
109a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
109b0 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65  tDelete(p->pOrde
109c0 72 42 79 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rBy);.      p->p
109d0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
109e0 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
109f0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
10a00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
10a10 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29  elete(p->pLimit)
10a20 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
10a30 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
10a40 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
10a50 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
10a60 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
10a70 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
10a80 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72   -1;.      if( r
10a90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10aa0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10ab0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  nd;.      }...  
10ac0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
10ad0 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
10ae0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
10af0 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
10b00 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
10b10 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
10b20 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
10b30 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
10b40 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
10b50 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
10b60 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b  b!=dest.iParm ){
10b70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
10b80 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
10b90 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
10ba0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
10bb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
10bc0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  t.eDest==SRT_Cal
10bd0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
10be0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
10bf0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
10c00 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
10c10 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
10c20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
10c30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
10c40 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
10c50 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
10c60 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
10c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
10c80 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
10c90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10ca0 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
10cb0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10cc0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
10cd0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
10ce0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
10cf0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d10 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
10d20 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
10d30 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
10d40 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
10d50 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10d60 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
10d70 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
10d80 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
10d90 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
10da0 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31      pOrderBy, -1
10dd0 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
10de0 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
10df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
10e00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
10e10 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
10e20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10e30 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
10e40 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
10e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10e60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
10e70 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
10e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10e90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
10ea0 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
10eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10ec0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10ed0 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
10ee0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
10ef0 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
10f00 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
10f10 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
10f20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
10f30 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
10f40 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
10f50 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
10f60 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
10f70 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
10f80 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
10f90 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
10fa0 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
10fb0 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
10fc0 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
10fd0 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
10fe0 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
10ff0 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
11000 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
11010 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
11020 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
11030 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
11040 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11050 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
11060 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11070 20 20 20 20 20 20 69 66 28 20 70 72 6f 63 65 73        if( proces
11080 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  sCompoundOrderBy
11090 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31  (pParse, p, tab1
110a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
110b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
110c0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
110d0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
110e0 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
110f0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
11100 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20  pOrderBy);..    
11110 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
11120 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11130 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11140 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
11150 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
11160 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
11170 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
11180 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
11190 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
111a0 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70  ightmost->usesEp
111b0 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  hm = 1;.      as
111c0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
111d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
111e0 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
111f0 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
11200 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
11210 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
11220 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
11230 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
11240 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
11250 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
11260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11270 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11280 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
11290 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  tdest, 0, 0, 0, 
112a0 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
112b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
112c0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
112d0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
112e0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
112f0 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
11300 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
11310 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
11320 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
11330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11340 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
11350 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
11360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11370 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11380 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
11390 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
113a0 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
113b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
113c0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
113d0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
113e0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
113f0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
11400 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
11410 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
11420 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
11430 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74  ctdest.iParm = t
11440 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ab2;.      rc = 
11450 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
11460 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
11470 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  ectdest, 0, 0, 0
11480 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d  , aff);.      p-
11490 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
114a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
114b0 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
114c0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
114d0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
114e0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
114f0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
11500 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11510 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
11520 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11530 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
11540 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
11550 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
11560 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
11570 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
11580 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
11590 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
115a0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
115b0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
115c0 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
115d0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
115e0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
115f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
11600 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
11610 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
11620 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
11630 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
11640 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
11650 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
11660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11670 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
11680 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11690 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
116a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
116b0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
116c0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
116d0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
116e0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
116f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11700 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
11710 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
11720 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
11730 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11740 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
11750 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11760 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
11770 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
11780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11790 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  dOp3(v, OP_NotFo
117a0 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
117b0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
117c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
117d0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
117e0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
117f0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
11800 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
11810 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
11820 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
11830 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
11840 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69  By, -1, &dest, i
11850 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
11860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11870 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11880 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
11890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118a0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
118b0 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
118c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
118d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
118e0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
118f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11900 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
11910 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
11920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11930 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
11940 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
11950 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
11960 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
11970 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
11980 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
11990 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
119a0 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
119b0 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
119c0 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
119d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
119e0 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
119f0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
11a00 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
11a10 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
11a20 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
11a30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11a40 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
11a50 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
11a60 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
11a70 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
11a80 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
11a90 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
11aa0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
11ab0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
11ac0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
11ad0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
11ae0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
11af0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11b00 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
11b10 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20  les.  */.  nCol 
11b20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
11b30 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65  pr;.  while( nSe
11b40 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tP2 ){.    sqlit
11b50 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
11b60 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50  , aSetP2[--nSetP
11b70 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a  2], nCol);.  }..
11b80 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
11b90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
11ba0 20 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20   used by either 
11bb0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11bc0 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61  use or.  ** by a
11bd0 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ny temporary tab
11be0 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
11bf0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
11c00 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
11c10 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
11c20 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
11c30 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
11c40 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20  tables.  Invoke 
11c50 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42  the.  ** ORDER B
11c60 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20  Y processing if 
11c70 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
11c80 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  R BY clause..  *
11c90 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
11ca0 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
11cb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
11cc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
11cd0 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
11ce0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
11cf0 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
11d00 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
11d10 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
11d20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
11d30 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
11d40 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
11d50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11d60 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
11d70 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
11d80 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
11d90 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  ( pOrderBy || p-
11da0 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20  >usesEphm ){.   
11db0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11dd0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11de0 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
11df0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
11e00 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
11e10 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
11e20 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
11e30 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
11e40 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
11e50 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
11e60 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
11e70 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
11e80 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20    int nKeyCol;  
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
11eb0 72 69 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f  ries in pKeyInfo
11ec0 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20  ->aCol[] */.    
11ed0 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
11ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11ef0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
11f00 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
11f10 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  Coll[] */.    Co
11f20 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20  llSeq **aCopy;  
11f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11f40 20 63 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66   copy of pKeyInf
11f50 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20  o->aColl[] */.. 
11f60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
11f70 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
11f80 20 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f     nKeyCol = nCo
11f90 6c 20 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20  l + (pOrderBy ? 
11fa0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
11fb0 3a 20 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  : 0);.    pKeyIn
11fc0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
11fd0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
11fe0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
12000 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b  of(*pKeyInfo)+nK
12010 65 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f  eyCol*(sizeof(Co
12020 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20  llSeq*) + 1));. 
12030 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
12040 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12060 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
12070 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
12080 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
12090 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
120a0 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  >db);.    pKeyIn
120b0 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f  fo->nField = nCo
120c0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  l;..    for(i=0,
120d0 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
120e0 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
120f0 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
12100 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
12110 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
12120 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
12130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
12140 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
12150 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61     *apColl = pPa
12160 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
12170 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
12180 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
12190 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
121a0 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
121b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
121c0 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
121d0 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
121e0 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
121f0 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
12200 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
12210 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
12220 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
12230 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
12240 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
12250 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
12260 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
12270 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
12280 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
12290 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
122a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
122b0 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
122c0 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
122d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
122e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
122f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
12300 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
12310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12320 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
12330 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
12340 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
12350 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
12360 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12370 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
12380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
12390 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
123a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
123b0 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d  t_item *pOTerm =
123c0 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20   pOrderBy->a;.  
123d0 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79      int nOrderBy
123e0 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
123f0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
12400 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38  t addr;.      u8
12410 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20   *pSortOrder;.. 
12420 20 20 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68       /* Reuse th
12430 65 20 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20  e same pKeyInfo 
12440 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
12450 20 61 73 20 77 61 73 20 75 73 65 64 20 61 62 6f   as was used abo
12460 76 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ve for.      ** 
12470 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
12480 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
12490 20 45 78 63 65 70 74 20 77 65 20 68 61 76 65 20   Except we have 
124a0 74 6f 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68  to change out th
124b0 65 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49  e.      ** pKeyI
124c0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c  nfo->aColl[] val
124d0 75 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68  ues.  Some of th
124e0 65 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73  e aColl[] values
124f0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a   will be.      *
12500 2a 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f  * reused when co
12510 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 70  nstructing the p
12520 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20  KeyInfo for the 
12530 4f 52 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b  ORDER BY, so mak
12540 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70  e.      ** a cop
12550 79 2e 20 20 53 75 66 66 69 63 69 65 6e 74 20 73  y.  Sufficient s
12560 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74  pace to hold bot
12570 68 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69  h the nCol entri
12580 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  es for.      ** 
12590 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
125a0 65 63 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64  ect and the nOrd
125b0 65 72 62 79 45 78 70 72 20 65 6e 74 72 69 65 73  erbyExpr entries
125c0 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
125d0 59 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61  Y.      ** was a
125e0 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20  llocated above. 
125f0 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   But we need to 
12600 6d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e  move the compoun
12610 64 20 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a  d select.      *
12620 2a 20 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66  * entries out of
12630 20 74 68 65 20 77 61 79 20 62 65 66 6f 72 65 20   the way before 
12640 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
12650 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65   ORDER BY entrie
12660 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65  s..      ** Move
12670 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
12680 6c 65 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74  lect entries int
12690 6f 20 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20  o aCopy[] where 
126a0 74 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20  they can be.    
126b0 20 20 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e    ** accessed an
126c0 64 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f  d reused when co
126d0 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f  nstructing the O
126e0 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e  RDER BY entries.
126f0 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
12700 65 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20  e nCol might be 
12710 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
12720 6c 65 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72  less than nOrder
12730 42 79 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20  ByExpr.      ** 
12740 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d  we have to use m
12750 65 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f  emmove() when do
12760 69 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ing the copy..  
12770 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f      */.      aCo
12780 70 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e  py = &pKeyInfo->
12790 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78  aColl[nOrderByEx
127a0 70 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  pr];.      pSort
127b0 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
127c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
127d0 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d  u8*)&aCopy[nCol]
127e0 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
127f0 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d  aCopy, pKeyInfo-
12800 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a  >aColl, nCol*siz
12810 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a  eof(CollSeq*));.
12820 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20  .      apColl = 
12830 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
12840 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12850 69 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20  i<nOrderByExpr; 
12860 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61  i++, pOTerm++, a
12870 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72  pColl++, pSortOr
12880 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  der++){.        
12890 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
128a0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
128b0 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
128c0 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
128d0 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20  ollate) ){.     
128e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
128f0 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pr->pColl!=0 );.
12900 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
12910 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
12920 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12930 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f  .          *apCo
12940 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72  ll = aCopy[pExpr
12950 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20  ->iColumn];.    
12960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
12970 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65  SortOrder = pOTe
12980 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
12990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
129a0 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
129b0 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61  st==p );.      a
129c0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
129d0 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a  enEphm[2]>=0 );.
129e0 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e        addr = p->
129f0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b  addrOpenEphm[2];
12a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12a10 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
12a20 64 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  dr, p->pOrderBy-
12a30 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20  >nExpr+2);.     
12a40 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
12a50 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72  d = nOrderByExpr
12a60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12a70 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
12a80 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
12a90 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
12aa0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
12ab0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20   pKeyInfo = 0;. 
12ac0 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
12ad0 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
12ae0 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
12af0 45 78 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  Expr, &dest);.  
12b00 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
12b10 5f 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b  _free(pKeyInfo);
12b20 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65  .  }..multi_sele
12b30 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d  ct_end:.  pDest-
12b40 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65  >iMem = dest.iMe
12b50 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  m;.  pDest->nMem
12b60 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20   = dest.nMem;.  
12b70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
12b80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12b90 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
12ba0 43 54 20 2a 2f 0a 0a 23 69 66 20 30 20 2f 2a 2a  CT */..#if 0 /**
12bb0 2a 2a 2a 2a 20 23 23 23 23 23 23 23 23 23 23 23  **** ###########
12bc0 23 23 23 23 23 20 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ##### ******/./*
12bd0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
12be0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
12bf0 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
12c00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
12c10 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
12c20 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
12c30 69 6e 74 20 6f 75 74 70 75 74 53 75 62 72 6f 75  int outputSubrou
12c40 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
12c50 50 61 72 73 65 2c 0a 20 20 53 65 6c 65 63 74 44  Parse,.  SelectD
12c60 65 73 74 20 2a 70 49 6e 0a 20 20 53 65 6c 65 63  est *pIn.  Selec
12c70 74 44 65 73 74 20 2a 70 44 65 73 74 0a 29 7b 0a  tDest *pDest.){.
12c80 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
12c90 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
12ca0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
12cb0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d  .  if( pDest->iM
12cc0 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65  em==0 ){.    pDe
12cd0 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74  st->iMem = sqlit
12ce0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
12cf0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  Parse, pIn->nMem
12d00 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d  );.    pDest->nM
12d10 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  em = nResultCol;
12d20 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
12d30 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
12d40 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
12d50 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
12d60 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
12d70 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
12d80 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
12d90 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
12da0 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
12db0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
12dc0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12dd0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
12de0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12df0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
12e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e10 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
12e20 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
12e30 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
12e40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
12e60 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
12e70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12e80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12e90 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
12ea0 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
12eb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12ec0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
12ed0 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
12ee0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12ef0 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
12f00 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
12f10 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12f20 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
12f30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
12f40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f50 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
12f60 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
12f70 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
12f80 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
12f90 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
12fa0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
12fb0 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
12fc0 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
12fd0 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
12fe0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
12ff0 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
13000 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
13010 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
13020 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
13030 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 32  .      int addr2
13040 2c 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  , r1;.      asse
13050 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
13060 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
13070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13080 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
13090 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
130a0 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
130b0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
130c0 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
130d0 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
130e0 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
130f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
13100 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13120 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13130 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
13140 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26  Result, 1, r1, &
13150 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
13160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13170 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
13180 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
13190 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
131a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
131b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
131c0 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
131d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
131e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
131f0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
13200 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13210 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
13220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13230 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
13240 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
13250 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
13260 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
13270 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
13280 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
13290 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
132a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
132b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
132c0 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
132d0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
132e0 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
132f0 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
13300 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
13310 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
13320 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
13330 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
13340 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
13350 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
13360 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
13370 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
13380 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
13390 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
133a0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
133b0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
133c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
133d0 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
133e0 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
133f0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
13400 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
13410 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
13420 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  lt, iParm, 1);. 
13430 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
13440 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
13450 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
13460 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
13470 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13480 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
13490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
134a0 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
134b0 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20  * Send the data 
134c0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
134d0 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61  function or to a
134e0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e   subroutine.  In
134f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65   the.    ** case
13500 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
13510 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
13520 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f   itself is respo
13530 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a  nsible for.    *
13540 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61  * popping the da
13550 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ta from the stac
13560 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  k..    */.    ca
13570 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
13580 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  :.    case SRT_C
13590 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20  allback: {.     
135a0 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
135b0 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
135c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
135d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
135e0 6c 64 2c 20 70 44 65 73 74 2d 3e 72 65 67 43 6f  ld, pDest->regCo
135f0 72 6f 75 74 69 6e 65 29 3b 0a 20 20 20 20 20 20  routine);.      
13600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
13610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13620 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
13630 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
13640 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
13650 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
13660 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
13670 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
13680 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
13690 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
136a0 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
136b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
136c0 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
136d0 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
136e0 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
136f0 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
13700 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
13710 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
13720 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
13730 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
13740 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
13750 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
13760 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
13770 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
13780 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
13790 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
137a0 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
137b0 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
137c0 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
137d0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
137e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
137f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
13800 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
13810 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
13820 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
13830 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
13840 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
13850 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13860 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
13870 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
13880 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
13890 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
138a0 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
138b0 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
138c0 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
138d0 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
138e0 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
138f0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
13900 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
13910 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
13920 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
13930 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
13940 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
13950 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
13960 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
13970 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
13980 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
13990 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
139a0 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
139b0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
139c0 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
139d0 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
139e0 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
139f0 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
13a00 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
13a10 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
13a20 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
13a30 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
13a40 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
13a50 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
13a60 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
13a70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
13a80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
13a90 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
13aa0 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
13ab0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
13ac0 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
13ad0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
13ae0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13af0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
13b00 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
13b10 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
13b20 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
13b30 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
13b40 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
13b50 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
13b60 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
13b70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
13b80 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
13b90 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
13ba0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
13bb0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
13bc0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
13bd0 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
13be0 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
13bf0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
13c00 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
13c10 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
13c20 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
13c30 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
13c40 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
13c50 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
13c60 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
13c70 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
13c80 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
13c90 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
13ca0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
13cb0 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
13cc0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
13cd0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
13ce0 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
13cf0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
13d00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
13d10 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
13d20 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
13d30 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
13d40 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
13d50 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
13d60 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
13d70 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
13d80 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
13d90 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
13da0 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
13db0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
13dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
13df0 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
13e00 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
13e10 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
13e20 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
13e30 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
13e40 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
13e50 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
13e60 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
13e70 78 74 41 20 20 20 20 20 20 20 20 20 20 20 6f 75  xtA           ou
13e80 74 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  tA.**           
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 6e 65 78 74 41 20 77 68 69 6c 65 20 41 3d 3d   nextA while A==
13ed0 42 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  B.**.**   AgtB: 
13ee0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
13ef0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
13f00 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
13f10 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
13f20 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
13f30 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 41  tB, nextB      A
13f40 3c 2d 42 2c 20 6f 75 74 42 2c 20 20 20 20 20 20  <-B, outB,      
13f50 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
13f60 20 20 20 20 68 61 6c 74 0a 2a 2a 20 20 20 20 20      halt.**     
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 20 20 20 20 20 6e 65 78 74 42 20 77 68 69 6c 65       nextB while
13f90 20 41 3d 3d 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   A==B.**.**   Eo
13fa0 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
13fb0 41 20 20 20 20 20 20 42 3c 2d 41 2c 20 6f 75 74  A      B<-A, out
13fc0 41 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  A        outA, n
13fd0 65 78 74 41 20 20 20 20 20 20 20 20 68 61 6c 74  extA        halt
13fe0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
14000 74 41 20 77 68 69 6c 65 20 41 3d 3d 42 0a 2a 2a  tA while A==B.**
14010 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
14020 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
14030 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
14040 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
14050 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
14060 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
14070 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
14080 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
14090 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
140a0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
140b0 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
140c0 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
140d0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
140e0 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
140f0 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
14100 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
14110 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
14120 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
14130 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
14140 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
14150 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
14160 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
14170 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
14180 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
14190 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
141a0 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
141b0 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
141c0 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
141d0 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
141e0 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
141f0 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
14200 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
14210 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
14220 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
14230 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
14240 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
14250 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
14260 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
14270 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
14280 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
14290 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
142a0 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
142b0 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
142c0 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
142d0 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
142e0 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
142f0 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
14300 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
14310 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
14320 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
14330 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
14340 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
14350 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
14360 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
14370 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
14380 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
14390 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
143a0 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
143b0 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 73 74 61 74  or EofB..*/.stat
143c0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
143d0 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
143e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
143f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
14400 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
14410 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
14420 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
14430 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
14440 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
14450 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
14460 2c 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20  ,    /* What to 
14470 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
14480 73 75 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  sults */.  char 
14490 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
144a0 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
144b0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
144c0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
144d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
144e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
144f0 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
14500 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
14510 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
14520 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
14530 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
14540 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
14550 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
14560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14570 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14580 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
14590 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
145a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
145b0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
145c0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
145d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
145e0 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
145f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14600 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61   on p */.  int a
14610 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20  SetP2[2];       
14620 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65   /* Set P2 value
14630 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20   of these op to 
14640 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
14650 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50  s */.  int nSetP
14660 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  2 = 0;       /* 
14670 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
14680 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64  in aSetP2[] used
14690 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
146a0 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
146b0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
146c0 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
146d0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
146e0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
146f0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
14700 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
14710 67 41 64 64 72 41 3b 0a 20 20 69 6e 74 20 72 65  gAddrA;.  int re
14720 67 45 6f 66 41 3b 0a 20 20 69 6e 74 20 72 65 67  gEofA;.  int reg
14730 41 64 64 72 42 3b 0a 20 20 69 6e 74 20 72 65 67  AddrB;.  int reg
14740 45 6f 66 42 3b 0a 20 20 69 6e 74 20 61 64 64 72  EofB;.  int addr
14750 53 65 6c 65 63 74 41 3b 0a 20 20 69 6e 74 20 61  SelectA;.  int a
14760 64 64 72 53 65 6c 65 63 74 42 3b 0a 20 20 69 6e  ddrSelectB;.  in
14770 74 20 72 65 67 4f 75 74 41 3b 0a 20 20 69 6e 74  t regOutA;.  int
14780 20 72 65 67 4f 75 74 42 3b 0a 20 20 69 6e 74 20   regOutB;.  int 
14790 61 64 64 72 4f 75 74 41 3b 0a 20 20 69 6e 74 20  addrOutA;.  int 
147a0 61 64 64 72 4f 75 74 42 3b 0a 20 20 69 6e 74 20  addrOutB;.  int 
147b0 61 64 64 72 45 6f 66 41 3b 0a 20 20 69 6e 74 20  addrEofA;.  int 
147c0 61 64 64 72 45 6f 66 42 3b 0a 20 20 69 6e 74 20  addrEofB;.  int 
147d0 61 64 64 72 41 6c 74 42 3b 0a 20 20 69 6e 74 20  addrAltB;.  int 
147e0 61 64 64 72 41 65 71 42 3b 0a 20 20 69 6e 74 20  addrAeqB;.  int 
147f0 61 64 64 72 41 67 74 42 3b 0a 20 20 69 6e 74 20  addrAgtB;.  int 
14800 6c 61 62 65 6c 43 6d 70 72 3b 0a 20 20 69 6e 74  labelCmpr;.  int
14810 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 69 6e 74   labelEnd;.  int
14820 20 6a 31 2c 20 6a 32 2c 20 6a 33 3b 0a 20 20 0a   j1, j2, j3;.  .
14830 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
14840 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14850 65 20 2a 2f 0a 0a 20 20 70 50 72 69 6f 72 20 3d  e */..  pPrior =
14860 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 72 65   p->pPrior;.  re
14870 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
14880 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
14890 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fA = ++pParse->n
148a0 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
148b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
148c0 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b  ;.  regEofB = ++
148d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
148e0 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
148f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
14900 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
14910 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
14920 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
14930 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
14940 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
14950 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14960 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
14970 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
14980 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 6a 31 20  egAddrB);..  j1 
14990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
149a0 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
149b0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
149c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
149d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64  entAddr(v);.  Vd
149e0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
149f0 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69  , "Begin corouti
14a00 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
14a10 43 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  CT"));.  sqlite3
14a20 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
14a30 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
14a40 74 69 6e 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  tine, 0);.  sqli
14a50 74 65 33 53 65 6c 65 63 74 28 29 3b 0a 20 20 73  te3Select();.  s
14a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14a70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14a80 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  1, regEofA);.  s
14a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14aa0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
14ab0 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e  gAddrA);.  VdbeN
14ac0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
14ad0 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
14ae0 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
14af0 3b 0a 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  ;..  addrSelectB
14b00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
14b10 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
14b20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14b30 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
14b40 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
14b50 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 71 6c 69  ELECT"));.  sqli
14b60 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14b70 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
14b80 72 6f 75 74 69 6e 65 2c 20 30 29 3b 0a 20 20 73  routine, 0);.  s
14b90 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 3b 0a  qlite3Select();.
14ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bb0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
14bc0 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 1, regEofB);.
14bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14be0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
14bf0 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64   regAddrB);.  Vd
14c00 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14c10 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
14c20 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
14c30 54 22 29 29 3b 0a 0a 20 20 56 64 62 65 4e 6f 6f  T"));..  VdbeNoo
14c40 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
14c50 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
14c60 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
14c70 41 20 3d 20 6f 75 74 70 75 74 53 75 62 72 6f 75  A = outputSubrou
14c80 74 69 6e 65 28 70 50 61 72 73 65 2c 20 26 64 65  tine(pParse, &de
14c90 73 74 41 2c 20 70 44 65 73 74 29 3b 0a 20 20 0a  stA, pDest);.  .
14ca0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14cb0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
14cc0 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
14cd0 20 20 61 64 64 72 4f 75 74 42 20 3d 20 6f 75 74    addrOutB = out
14ce0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
14cf0 61 72 73 65 2c 20 26 64 65 73 74 42 2c 20 70 44  arse, &destB, pD
14d00 65 73 74 29 3b 0a 0a 20 20 69 66 28 20 6f 70 3d  est);..  if( op=
14d10 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
14d20 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
14d30 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d  {.    addrEofA =
14d40 20 69 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20   iEnd;.  }else{ 
14d50 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
14d60 6d 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  mmment((v, "eof-
14d70 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
14d80 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
14d90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14da0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69  ntAddr(v);.    i
14db0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
14dc0 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  .      j2 = sqli
14dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14de0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
14df0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
14e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14e10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
14e20 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
14e30 74 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tB);.      sqlit
14e40 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14e50 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
14e60 72 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rB);.      sqlit
14e70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14e80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b  OP_Goto, 0, j2);
14e90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14ea0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
14eb0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
14ec0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ed0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
14ee0 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  ofB, labelEnd);.
14ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14f00 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
14f10 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 64 65  , destB.iMem, de
14f20 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e  stA.iMem, destB.
14f30 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 6a 32 20  nMem);.      j2 
14f40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14f50 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
14f60 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
14f70 74 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tB);.      sqlit
14f80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14f90 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
14fa0 72 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rB);.      sqlit
14fb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14fc0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20  OP_If, regEofB, 
14fd0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20  labelEnd);.     
14fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ff0 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
15000 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65  , destA.iMem, de
15010 73 74 42 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e  stB.iMem, destB.
15020 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
15030 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15040 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2c 20 6a  , OP_Jump, j2, j
15050 32 2b 31 2c 20 6a 32 29 3b 0a 20 20 20 20 7d 0a  2+1, j2);.    }.
15060 20 20 7d 0a 0a 0a 20 20 69 66 28 20 6f 70 3d 3d    }...  if( op==
15070 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
15080 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 69      addrEofA = i
15090 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
150a0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
150b0 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
150c0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
150d0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
150e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
150f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 66 28  Addr(v);.    if(
15100 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
15110 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
15120 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74        j2 = sqlit
15130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15140 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
15150 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20  labelEnd);.     
15160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15170 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15180 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
15190 41 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  A);.      sqlite
151a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
151b0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
151c0 41 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  A);.      sqlite
151d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
151e0 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a  P_Goto, 0, j2);.
151f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15200 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
15210 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73  UNION );.      s
15220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15230 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
15240 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fA, labelEnd);. 
15250 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15260 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
15270 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73   destA.iMem, des
15280 74 42 2e 69 4d 65 6d 2c 20 64 65 73 74 41 2e 6e  tB.iMem, destA.n
15290 4d 65 6d 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d  Mem);.      j2 =
152a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
152b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
152c0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
152d0 41 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  A);.      sqlite
152e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
152f0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
15300 41 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  A);.      sqlite
15310 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15320 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c  P_If, regEofA, l
15330 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
15340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15350 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
15360 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73   destA.iMem, des
15370 74 42 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e 6e  tB.iMem, destB.n
15380 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
15390 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
153a0 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2c 20 6a 32   OP_Jump, j2, j2
153b0 2b 31 2c 20 6a 32 29 3b 0a 20 20 20 20 7d 0a 20  +1, j2);.    }. 
153c0 20 7d 0a 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   }..  VdbeNoopCo
153d0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
153e0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
153f0 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
15400 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15410 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
15420 70 21 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p!=TK_INTERSECT 
15430 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
15440 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15450 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
15460 64 64 72 4f 75 74 41 29 3b 0a 20 20 7d 0a 20 20  ddrOutA);.  }.  
15470 61 64 64 72 41 65 71 42 20 3d 20 73 71 6c 69 74  addrAeqB = sqlit
15480 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15490 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
154a0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
154b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
154c0 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
154d0 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
154e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
154f0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
15500 6f 6d 70 61 72 65 29 3b 0a 0a 20 20 69 66 28 20  ompare);..  if( 
15510 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
15520 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
15530 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
15540 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
15550 45 43 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ECT ){.    VdbeN
15560 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
15570 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
15580 65 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e"));.    sqlite
15590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
155a0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
155b0 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
155c0 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
155d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
155e0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
155f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15600 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15610 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
15620 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
15630 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15640 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
15650 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
15660 20 64 65 73 74 41 2e 69 4d 65 6d 2c 0a 20 20 20   destA.iMem,.   
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2c 20        pKeyInfo, 
15690 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
156a0 43 29 3b 0a 20 20 20 20 6a 33 20 3d 20 73 71 6c  C);.    j3 = sql
156b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
156c0 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 73 71  ddr(v)+1;.    sq
156d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
156e0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 33 2c 20  v, OP_Jump, j3, 
156f0 6a 32 2c 20 6a 33 29 3b 0a 20 20 20 20 73 71 6c  j2, j3);.    sql
15700 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15710 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
15720 62 65 6c 43 6f 6d 70 61 72 65 29 3b 0a 20 20 7d  belCompare);.  }
15730 0a 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ..  VdbeNoopComm
15740 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
15750 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
15760 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
15770 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15780 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
15790 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
157a0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
157b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
157c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
157d0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
157e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
157f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15800 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
15810 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15830 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
15840 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
15850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15860 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6f 6d 70  to, 0, labelComp
15870 61 72 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  are);..  sqlite3
15880 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15890 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
158a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
158b0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
158c0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
158d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
158e0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f  nteger, 0, regEo
158f0 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
15900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15910 6e 74 65 67 65 72 2c 20 61 64 64 72 53 65 6c 65  nteger, addrSele
15920 63 74 41 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ctA, regAddrA);.
15930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15940 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15950 72 2c 20 61 64 64 72 53 65 6c 65 63 74 42 2c 20  r, addrSelectB, 
15960 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c  regAddrB);.  sql
15970 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15980 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15990 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
159a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
159b0 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
159c0 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
159d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
159e0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
159f0 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rB);.  sqlite3Vd
15a00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15a10 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72  f, regEofB, addr
15a20 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
15a30 56 64 62 65 52 65 73 6f 6c 76 65 28 76 2c 20 6c  VdbeResolve(v, l
15a40 61 62 65 6c 43 6f 6d 70 61 72 65 29 3b 0a 20 20  abelCompare);.  
15a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a60 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
15a70 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73   destA.iMem, des
15a80 74 42 2e 69 4d 65 6d 2c 20 64 65 73 74 41 2e 69  tB.iMem, destA.i
15a90 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
15ab0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
15ac0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73  FO_HANDOFF);.  s
15ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15ae0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
15af0 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
15b00 20 61 64 64 72 41 67 74 42 29 3b 0a 20 20 73 71   addrAgtB);.  sq
15b10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15b20 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
15b30 64 29 3b 0a 20 20 0a 7d 0a 23 65 6e 64 69 66 20  d);.  .}.#endif 
15b40 2f 2a 2a 2a 2a 2a 20 23 23 23 23 23 23 23 23 23  /***** #########
15b50 23 23 20 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 6e 64  ## *****/..#ifnd
15b60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15b70 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  IEW./* Forward D
15b80 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
15b90 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
15ba0 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
15bb0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
15bc0 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
15bd0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
15be0 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
15bf0 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
15c00 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
15c10 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
15c20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15c30 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
15c40 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
15c50 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
15c60 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
15c70 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
15c80 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
15c90 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
15ca0 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
15cb0 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
15cc0 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
15cd0 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
15ce0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
15cf0 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
15d00 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
15d10 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
15d20 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
15d30 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
15d40 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
15d50 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
15d60 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
15d70 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
15d80 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
15d90 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
15da0 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
15db0 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
15dc0 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
15dd0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
15de0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
15df0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
15e00 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
15e10 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
15e20 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
15e30 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
15e40 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
15e50 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
15e60 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
15e70 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
15e80 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
15e90 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
15ea0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
15eb0 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
15ec0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
15ed0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
15ee0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
15ef0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
15f00 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
15f10 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
15f20 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
15f30 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
15f40 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
15f50 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
15f60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
15f70 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
15f80 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
15f90 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
15fa0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
15fb0 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
15fc0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
15fd0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
15fe0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
15ff0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
16000 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
16010 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
16020 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
16030 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
16040 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
16050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16060 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
16070 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
16080 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
16090 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
160a0 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
160b0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
160c0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
160d0 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
160e0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
160f0 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
16100 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16110 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
16120 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
16130 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
16140 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66  p(db, pNew->pLef
16150 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
16160 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
16170 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
16180 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
16190 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
161a0 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
161b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
161c0 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
161d0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
161e0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
161f0 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  istDup(db, pNew-
16200 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
16210 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
16220 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
16230 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
16240 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20   pNew->pTab;.   
16250 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
16260 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
16270 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
16280 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
16290 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
162a0 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
162b0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
162c0 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
162d0 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
162e0 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73  py(db, &pExpr->s
162f0 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e  pan, &pNew->span
16300 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
16310 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
16320 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
16330 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
16340 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
16350 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
16360 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
16370 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
16380 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
16390 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
163a0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
163b0 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
163c0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
163d0 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
163e0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53  ct(db, pExpr->pS
163f0 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
16400 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
16410 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
16420 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
16430 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
16440 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
16450 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
16460 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16470 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
16480 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
16490 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
164a0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
164b0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
164c0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
164d0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
164e0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
164f0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
16500 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
16510 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
16520 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
16530 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
16540 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
16550 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16560 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
16570 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
16580 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
16590 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
165a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
165b0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
165c0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
165d0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
165e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
165f0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
16600 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
16610 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
16620 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
16630 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16640 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
16650 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
16660 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
16670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
16680 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
16690 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
166a0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
166b0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
166c0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20   */.){.  if( !p 
166d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
166e0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
166f0 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
16700 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
16710 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
16720 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
16730 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
16740 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
16750 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
16760 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16770 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
16780 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
16790 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
167a0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
167b0 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
167c0 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
167d0 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
167e0 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
167f0 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  st);.}.#endif /*
16800 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16810 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
16820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16830 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
16840 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
16850 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
16860 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
16870 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
16880 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
16890 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
168a0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
168b0 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
168c0 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
168d0 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
168e0 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
168f0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
16900 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
16910 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
16920 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
16930 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
16940 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
16950 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
16960 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
16970 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
16980 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
16990 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
169a0 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
169b0 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
169c0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
169d0 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
169e0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
169f0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
16a00 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
16a10 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
16a20 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
16a30 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
16a40 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
16a50 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
16a60 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
16a70 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
16a80 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
16a90 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
16aa0 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
16ab0 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
16ac0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16ad0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
16ae0 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
16af0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
16b00 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
16b10 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
16b20 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
16b30 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
16b40 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
16b50 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
16b60 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
16b70 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
16b80 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
16b90 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
16ba0 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
16bb0 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
16bc0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
16bd0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
16be0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
16bf0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
16c00 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
16c10 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
16c20 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
16c30 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
16c40 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
16c50 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
16c60 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16c70 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
16c80 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
16c90 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
16ca0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
16cb0 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
16cc0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
16cd0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
16ce0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
16cf0 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
16d00 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
16d10 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
16d20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
16d30 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
16d40 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
16d50 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72  t outer join, or
16d60 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
16d70 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69  ubquery is not i
16d80 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28  tself a join.  (
16d90 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a  Ticket #306).**.
16da0 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
16db0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
16dc0 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
16dd0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
16de0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
16df0 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
16e00 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
16e10 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
16e20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
16e30 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
16e40 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
16e50 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
16e60 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
16e70 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
16e80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
16e90 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
16ea0 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
16eb0 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
16ec0 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
16ed0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
16ee0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16ef0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
16f00 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
16f10 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
16f20 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
16f30 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
16f40 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
16f50 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
16f60 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
16f70 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
16f80 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
16f90 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
16fa0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
16fb0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
16fc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
16fd0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
16fe0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
16ff0 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
17000 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
17010 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
17020 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
17030 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
17040 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62  *  (12)  The sub
17050 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
17060 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
17070 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
17080 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
17090 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e    subquery has n
170a0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  o WHERE clause. 
170b0 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65   (added by ticke
170c0 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28  t #350).**.**  (
170d0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
170e0 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
170f0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
17100 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28  e LIMIT.**.**  (
17110 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
17120 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
17130 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FFSET.**.**  (15
17140 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
17150 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
17160 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
17170 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
17180 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
17190 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  es not have both
171a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64   an ORDER BY and
171b0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
171c0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
171d0 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a  ticket #2339).**
171e0 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
171f0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
17200 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
17210 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
17220 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
17230 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
17240 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
17250 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
17260 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
17270 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
17280 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
17290 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
172a0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
172b0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
172c0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
172d0 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
172e0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
172f0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
17300 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
17310 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
17320 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
17330 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
17340 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
17350 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
17360 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
17370 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
17380 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
17390 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
173a0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
173b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
173c0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
173d0 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
173e0 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
173f0 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
17400 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
17410 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
17420 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
17430 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
17440 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
17450 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
17460 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
17470 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
17480 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17490 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
174a0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
174c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
174d0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
174e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
174f0 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
17500 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17510 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
17520 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
17530 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
17540 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
17550 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
17560 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
17570 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17580 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
17590 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
175a0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
175b0 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
175c0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
175d0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
175e0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
175f0 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
17600 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
17610 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
17620 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
17630 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
17640 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
17650 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
17660 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
17670 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
17680 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
17690 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
176a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
176b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
176c0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
176d0 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
176e0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
176f0 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
17700 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
17710 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
17720 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
17730 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
17740 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17750 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17760 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
17770 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
17780 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
17790 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
177a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
177b0 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
177c0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
177d0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
177e0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
177f0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
17800 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
17810 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
17820 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
17830 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
17840 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
17850 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
17860 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
17870 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
17880 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
17890 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  ];.  pSub = pSub
178a0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
178b0 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
178c0 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
178d0 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
178e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17900 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20  Restriction (1) 
17910 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65   */.  if( subque
17920 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
17930 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
17940 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
17950 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  Restriction (2) 
17960 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20   */.  pSubSrc = 
17970 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
17980 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
17990 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
179a0 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
179b0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
179c0 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
179d0 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
179e0 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
179f0 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c  ry expresssions,
17a00 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
17a10 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
17a20 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
17a30 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
17a40 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
17a50 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
17a60 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
17a70 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
17a80 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
17a90 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
17aa0 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
17ab0 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
17ac0 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
17ad0 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
17ae0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
17af0 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
17b00 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
17b10 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
17b20 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
17b30 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
17b40 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
17b70 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
17b80 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ( p->pRightmost 
17b90 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  && pSub->pLimit 
17ba0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
17bb0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
17bc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17bf0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
17c00 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
17c10 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
17c20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17c50 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (7)  */.  if( (
17c60 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
17c70 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   || pSub->pLimit
17c80 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
17c90 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
17ca0 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20  isAgg) ){       
17cb0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17cc0 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20  ns (4)(5)(8)(9) 
17cd0 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  */.     return 0
17ce0 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69  ;       .  }.  i
17cf0 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
17d00 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
17d10 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
17d20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17d30 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69  tion (6)  */.  i
17d40 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f  f( (p->disallowO
17d50 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72  rderBy || p->pOr
17d60 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e  derBy) && pSub->
17d70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
17d80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
17dc0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
17dd0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
17de0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
17df0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17e00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
17e10 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
17e20 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
17e30 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
17e40 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
17e50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
17e60 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
17e70 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
17e80 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
17e90 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
17ea0 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
17eb0 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
17ec0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
17ed0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
17ee0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
17ef0 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
17f00 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
17f10 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
17f20 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
17f30 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
17f40 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
17f50 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
17f60 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
17f70 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
17f80 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
17f90 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  */.  if( pSubSrc
17fa0 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75  ->nSrc>1 && (pSu
17fb0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
17fc0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
17fd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
17fe0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
17ff0 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
18000 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
18010 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
18020 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
18030 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
18040 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
18050 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
18060 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
18070 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
18080 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
18090 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
180a0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
180b0 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
180c0 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
180d0 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
180e0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
180f0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
18100 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
18110 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
18120 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
18130 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
18140 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
18150 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
18160 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
18170 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
18180 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
18190 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
181a0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
181b0 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
181c0 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
181d0 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
181e0 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
181f0 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57  )!=0 && pSub->pW
18200 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72  here!=0 ){.    r
18210 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
18220 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
18230 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
18240 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
18250 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
18260 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74  the.  ** iFrom-t
18270 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
18280 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
18290 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
182a0 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61   */..  /* Move a
182b0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
182c0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
182d0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
182e0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
182f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
18300 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
18310 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
18320 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
18330 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
18340 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
18350 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
18360 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
18370 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
18380 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
18390 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
183a0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
183b0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
183c0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
183d0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
183e0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
183f0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
18400 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
18410 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
18420 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
18430 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
18440 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
18450 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
18460 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61  g in..  */.  iPa
18470 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
18480 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20  >iCursor;.  {.  
18490 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20    int nSubSrc = 
184a0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20  pSubSrc->nSrc;. 
184b0 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20     int jointype 
184c0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
184d0 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  type;..    sqlit
184e0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
184f0 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20  ubitem->pTab);. 
18500 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18510 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
18520 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
18530 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d  3_free(pSubitem-
18540 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
18550 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74  ite3_free(pSubit
18560 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
18570 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
18580 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65  = 0;.    pSubite
18590 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
185a0 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  ;.    pSubitem->
185b0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70  zName = 0;.    p
185c0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
185d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 53 75  = 0;.    if( nSu
185e0 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
185f0 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62  int extra = nSub
18600 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66  Src - 1;.      f
18610 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72  or(i=1; i<nSubSr
18620 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
18630 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
18640 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
18650 20 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20   pSrc, 0, 0);.  
18660 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
18670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
18680 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
18690 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
186a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
186b0 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20  }.      p->pSrc 
186c0 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
186d0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
186e0 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
186f0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
18700 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
18710 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
18720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18730 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
18740 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
18750 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
18760 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
18770 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
18780 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
18790 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
187a0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
187b0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
187c0 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
187d0 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
187e0 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
187f0 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
18800 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
18810 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
18820 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
18830 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
18840 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18850 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
18860 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
18870 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
18880 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
18890 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
188a0 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
188b0 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
188e0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
188f0 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
18900 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
18910 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18920 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
18930 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18940 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
18950 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
18960 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
18970 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
18980 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
18990 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
189a0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
189b0 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
189c0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
189d0 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
189e0 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
189f0 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  /.  pList = p->p
18a00 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
18a10 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
18a20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
18a30 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28   *pExpr;.    if(
18a40 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
18a50 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
18a60 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
18a70 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
18a80 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
18a90 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20  a[i].zName = .  
18aa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18ab0 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
18ac0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70  (char*)pExpr->sp
18ad0 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
18ae0 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n.n);.    }.  }.
18af0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18b00 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
18b10 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
18b20 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 69 73 41  List);.  if( isA
18b30 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  gg ){.    substE
18b40 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
18b50 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
18b60 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
18b70 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
18b80 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
18b90 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
18ba0 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
18bb0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18bc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18bd0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
18be0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
18bf0 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
18c00 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  y;.    pSub->pOr
18c10 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
18c20 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  se if( p->pOrder
18c30 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  By ){.    substE
18c40 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
18c50 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
18c60 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
18c70 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
18c80 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
18c90 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
18ca0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
18cb0 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73  >pWhere);.  }els
18cc0 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  e{.    pWhere = 
18cd0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62  0;.  }.  if( sub
18ce0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
18cf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
18d00 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ving==0 );.    p
18d10 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70  ->pHaving = p->p
18d20 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57  Where;.    p->pW
18d30 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
18d40 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
18d50 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61   p->pHaving, iPa
18d60 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
18d70 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  st);.    p->pHav
18d80 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
18d90 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70 48 61 76  rAnd(db, p->pHav
18da0 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ing, .          
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18dd0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
18de0 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73  Having));.    as
18df0 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
18e00 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
18e10 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
18e20 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
18e30 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29   pSub->pGroupBy)
18e40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
18e50 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
18e60 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
18e70 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
18e80 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
18e90 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
18ea0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  b, p->pWhere, pW
18eb0 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
18ec0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
18ed0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
18ee0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
18ef0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
18f00 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
18f10 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
18f20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
18f30 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
18f40 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
18f50 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
18f60 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
18f70 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
18f80 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
18f90 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
18fa0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73    **.  ** One is
18fb0 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
18fc0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
18fd0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
18fe0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
18ff0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
19000 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
19010 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
19020 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
19030 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
19040 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
19050 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
19060 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
19070 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
19080 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
19090 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
190a0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
190b0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
190c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
190d0 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
190e0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
190f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19100 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
19110 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
19120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19130 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
19140 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
19150 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e  f it.** is a min
19160 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
19170 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f  y. Return WHERE_
19180 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
19190 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
191a0 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f   if .** it is, o
191b0 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41  r 0 otherwise. A
191c0 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65  t present, a que
191d0 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ry is considered
191e0 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28   to be.** a min(
191f0 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66  )/max() query if
19200 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
19210 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f  re is a single o
19220 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  bject in the FRO
19230 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
19240 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61 20    2. There is a 
19250 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f  single expressio
19260 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
19270 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a  set, and it is.*
19280 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69  *      either mi
19290 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20  n(x) or max(x), 
192a0 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c  where x is a col
192b0 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  umn reference..*
192c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 69 6e  /.static int min
192d0 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
192e0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
192f0 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  p){.  Expr *pExp
19300 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
19310 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
19320 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t;..  if( pEList
19330 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
19340 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
19350 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70  Y_NORMAL;.  pExp
19360 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
19370 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69 73 74  .pExpr;.  pEList
19380 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
19390 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
193a0 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
193b0 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 7c  N || pEList==0 |
193c0 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
193d0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
193e0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
193f0 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
19400 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  AGG_COLUMN ) ret
19410 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
19420 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20  Y_NORMAL;.  if( 
19430 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
19440 33 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  3 ) return WHERE
19450 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
19460 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
19470 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
19480 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
19490 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
194a0 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
194b0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
194c0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
194d0 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
194e0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
194f0 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ",3)==0 ){.    r
19500 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
19510 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72  RBY_MAX;.  }.  r
19520 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
19530 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f  RBY_NORMAL;.}../
19540 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19550 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e  e resolves any n
19560 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65  ames used in the
19570 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
19580 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53  he.** supplied S
19590 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
195a0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   If the SELECT s
195b0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72  tatement being r
195c0 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20  esolved.** is a 
195d0 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e  sub-select, then
195e0 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70   pOuterNC is a p
195f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61  ointer to the Na
19600 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66  meContext .** of
19610 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45   the parent SELE
19620 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CT..*/.int sqlit
19630 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
19640 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19650 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
19660 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
19670 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
19680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19690 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
196a0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
196b0 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
196c0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
196d0 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63  The outer name c
196e0 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e  ontext. May be N
196f0 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ULL. */.){.  Exp
19700 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
19710 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
19720 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  t set. */.  int 
19730 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
19740 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f         /* For-lo
19750 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64  op variable used
19760 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
19770 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ces */.  NameCon
19780 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
19790 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d      /* Local nam
197a0 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e-context */.  E
197b0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
197c0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  y;        /* The
197d0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
197e0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
197f0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
19800 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  n before, return
19810 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
19820 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f  .  if( p->isReso
19830 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  lved ){.    asse
19840 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b  rt( !pOuterNC );
19850 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19860 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  TE_OK;.  }.  p->
19870 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a  isResolved = 1;.
19880 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68  .  /* If there h
19890 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
198a0 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68   errors, do noth
198b0 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ing. */.  if( pP
198c0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
198d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
198e0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
198f0 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73  /* Prepare the s
19900 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e  elect statement.
19910 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
19920 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72  allocate all cur
19930 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  sors.  ** requir
19940 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
19950 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71   tables and subq
19960 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
19970 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  OM clause..  */.
19980 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
19990 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
199a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
199b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
199c0 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
199d0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
199e0 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
199f0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
19a00 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  hese.  ** are no
19a10 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  t allowed to ref
19a20 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c  er to any names,
19a30 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74   so pass an empt
19a40 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20  y NameContext.. 
19a50 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
19a60 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
19a70 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
19a80 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
19a90 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
19aa0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
19ab0 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20  ->pLimit) ||.   
19ac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
19ad0 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
19ae0 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a   p->pOffset) ){.
19af0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19b00 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
19b10 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
19b20 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
19b30 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72   to pass to Expr
19b40 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74  ResolveNames() t
19b50 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74  o.  ** resolve t
19b60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  he expression-li
19b70 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61  st..  */.  sNC.a
19b80 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73  llowAgg = 1;.  s
19b90 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d  NC.pSrcList = p-
19ba0 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65  >pSrc;.  sNC.pNe
19bb0 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a  xt = pOuterNC;..
19bc0 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
19bd0 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
19be0 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73   set. */.  pELis
19bf0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
19c00 20 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72   if( !pEList ) r
19c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
19c20 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  OR;.  for(i=0; i
19c30 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
19c40 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
19c50 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  pX = pEList->a[i
19c60 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
19c70 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
19c80 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
19c90 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  X) ){.      retu
19ca0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
19cb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19cc0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
19cd0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
19ce0 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
19cf0 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
19d00 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78  ROUP BY .  ** ex
19d10 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
19d20 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
19d30 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
19d40 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
19d50 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
19d60 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20  ( !p->isAgg );. 
19d70 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
19d80 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70  GroupBy;.  if( p
19d90 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
19da0 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
19db0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
19dc0 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
19dd0 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
19de0 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
19df0 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
19e00 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
19e10 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
19e20 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
19e30 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
19e40 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  & !pGroupBy ){. 
19e50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19e60 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
19e70 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
19e80 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
19e90 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72   HAVING");.    r
19ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
19eb0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  OR;.  }..  /* Ad
19ec0 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
19ed0 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d   list to the nam
19ee0 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65  e-context before
19ef0 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a   parsing the.  *
19f00 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  * other expressi
19f10 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ons in the SELEC
19f20 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
19f30 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a  s is so that.  *
19f40 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
19f50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19f60 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
19f70 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
19f80 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65  s by.  ** aliase
19f90 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
19fa0 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  set..  **.  ** M
19fb0 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
19fc0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
19fd0 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
19fe0 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  sion will be.  *
19ff0 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66  * re-evaluated f
1a000 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63  or each referenc
1a010 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
1a020 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e  sNC.pEList = p->
1a030 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
1a040 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
1a050 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
1a060 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73  Where) ||.     s
1a070 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
1a080 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
1a090 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
1a0a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1a0b0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
1a0c0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1a0d0 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72     if( processOr
1a0e0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a0f0 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1a100 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67  y, 1, &sNC.hasAg
1a110 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  g) ){.      retu
1a120 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1a130 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1a140 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
1a150 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1a160 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e  pGroupBy, 0, &sN
1a170 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20  C.hasAgg) ){.   
1a180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1a190 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1a1a0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1a1b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a1c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1a1d0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
1a1e0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52  Make sure the GR
1a1f0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
1a200 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
1a210 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1a220 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
1a230 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
1a240 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1a250 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
1a260 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1a270 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
1a280 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
1a290 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1a2a0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1a2b0 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d  asProperty(pItem
1a2c0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  ->pExpr, EP_Agg)
1a2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a2e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1a2f0 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
1a300 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
1a310 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
1a320 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
1a330 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
1a340 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1a350 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1a360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a370 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1a380 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20  s one SELECT of 
1a390 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73  a compound, be s
1a3a0 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e  ure to resolve n
1a3b0 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ames.  ** in the
1a3c0 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a   other SELECTs..
1a3d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
1a3e0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
1a3f0 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  rn sqlite3Select
1a400 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
1a410 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65  p->pPrior, pOute
1a420 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rNC);.  }else{. 
1a430 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a440 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1a450 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
1a460 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1a470 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
1a480 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1a490 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
1a4a0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
1a4b0 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
1a4c0 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
1a4d0 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
1a4e0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
1a4f0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  his.** routine s
1a500 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c  imply stores NUL
1a510 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
1a520 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e  se memory cells.
1a530 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a540 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
1a550 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a560 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1a570 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1a580 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1a590 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1a5a0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1a5b0 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67  Func;.  if( pAgg
1a5c0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
1a5d0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
1a5e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1a5f0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1a600 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
1a610 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  mn; i++){.    sq
1a620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a630 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1a640 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
1a650 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f  .iMem);.  }.  fo
1a660 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
1a670 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
1a680 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1a690 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
1a6a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a6b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1a6c0 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d  , 0, pFunc->iMem
1a6d0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
1a6e0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1a6f0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1a700 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
1a710 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
1a720 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  List==0 || pE->p
1a730 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
1a740 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a750 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a760 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61  , "DISTINCT in a
1a770 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62 65  ggregate must be
1a780 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20   followed ".    
1a790 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65 78         "by an ex
1a7a0 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
1a7b0 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
1a7c0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
1a7d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a7e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a7f0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1a800 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1a810 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
1a820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a830 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
1a840 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
1a850 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
1a860 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1a880 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1a890 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1a8a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a8b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
1a8c0 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
1a8d0 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
1a8e0 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
1a8f0 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
1a900 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
1a910 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
1a920 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
1a930 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
1a940 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1a950 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1a960 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1a970 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1a980 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1a990 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1a9a0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1a9b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1a9c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1a9d0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1a9e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1a9f0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
1aa00 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
1aa10 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1aa20 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
1aa30 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
1aa40 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
1aa50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aa60 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1aa70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1aa80 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
1aa90 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
1aaa0 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
1aab0 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
1aac0 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
1aad0 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
1aae0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1aaf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ab00 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1ab10 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1ab20 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1ab30 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1ab40 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1ab50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1ab60 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1ab70 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
1ab80 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
1ab90 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
1aba0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
1abb0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1abc0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1abd0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1abe0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
1abf0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
1ac00 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
1ac10 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
1ac20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1ac30 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70  t = pF->pExpr->p
1ac40 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  List;.    if( pL
1ac50 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
1ac60 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
1ac70 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1ac80 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1ac90 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
1aca0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1acb0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1acc0 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
1acd0 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20   regAgg, 0);.   
1ace0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
1acf0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
1ad00 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
1ad10 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
1ad20 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1ad30 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
1ad40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1ad50 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
1ad60 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
1ad70 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
1ad80 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
1ad90 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
1ada0 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
1adb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
1adc0 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c  >pFunc->needColl
1add0 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  Seq ){.      Col
1ade0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
1adf0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1ae00 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1ae10 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
1ae20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ae30 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
1ae40 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
1ae50 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  Func->needCollSe
1ae60 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20  q is true */.   
1ae70 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
1ae80 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
1ae90 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
1aea0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1aeb0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1aec0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1aed0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1aee0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
1aef0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1af00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
1af10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
1af20 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1af30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1af40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1af50 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1af60 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1af70 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1af80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1af90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1afa0 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
1afb0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
1afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afd0 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
1afe0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
1aff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1b000 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e 41  beChangeP5(v, nA
1b010 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1b020 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1b030 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1b040 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
1b050 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1b060 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1b070 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1b080 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
1b090 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
1b0a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1b0b0 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
1b0c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
1b0d0 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
1b0e0 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
1b0f0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
1b100 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
1b110 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b120 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
1b130 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
1b140 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
1b150 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
1b160 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
1b170 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b180 73 20 75 73 65 64 20 77 68 65 6e 20 61 20 53 45  s used when a SE
1b190 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1b1a0 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
1b1b0 20 61 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20   a.** temporary 
1b1c0 74 61 62 6c 65 20 66 6f 72 20 69 74 65 72 61 74  table for iterat
1b1d0 69 6e 67 20 74 68 72 6f 75 67 68 20 77 68 65 6e  ing through when
1b1e0 20 72 75 6e 6e 69 6e 67 20 61 6e 20 49 4e 53 54   running an INST
1b1f0 45 41 44 20 4f 46 0a 2a 2a 20 55 50 44 41 54 45  EAD OF.** UPDATE
1b200 20 6f 72 20 49 4e 53 54 45 41 44 20 4f 46 20 44   or INSTEAD OF D
1b210 45 4c 45 54 45 20 74 72 69 67 67 65 72 2e 20 0a  ELETE trigger. .
1b220 2a 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  **.** If possibl
1b230 65 2c 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  e, the SELECT st
1b240 61 74 65 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66  atement is modif
1b250 69 65 64 20 73 6f 20 74 68 61 74 20 4e 55 4c 4c  ied so that NULL
1b260 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 73   values.** are s
1b270 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d  tored in the tem
1b280 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72  porary table for
1b290 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72   all columns for
1b2a0 20 77 68 69 63 68 20 74 68 65 20 0a 2a 2a 20 63   which the .** c
1b2b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
1b2c0 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
1b2d0 6b 20 69 73 20 6e 6f 74 20 73 65 74 2e 20 49 66  k is not set. If
1b2e0 20 6d 61 73 6b 20 74 61 6b 65 73 20 74 68 65 0a   mask takes the.
1b2f0 2a 2a 20 73 70 65 63 69 61 6c 20 76 61 6c 75 65  ** special value
1b300 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1b310 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 61 72  n all columns ar
1b320 65 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2f 0a  e populated..*/.
1b330 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1b340 63 74 4d 61 73 6b 28 50 61 72 73 65 20 2a 70 50  ctMask(Parse *pP
1b350 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
1b360 20 75 33 32 20 6d 61 73 6b 29 7b 0a 20 20 69 66   u32 mask){.  if
1b370 28 20 70 20 26 26 20 21 70 2d 3e 70 50 72 69 6f  ( p && !p->pPrio
1b380 72 20 26 26 20 21 70 2d 3e 69 73 44 69 73 74 69  r && !p->isDisti
1b390 6e 63 74 20 26 26 20 6d 61 73 6b 21 3d 30 78 66  nct && mask!=0xf
1b3a0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 45  fffffff ){.    E
1b3b0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1b3c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1b3d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
1b3e0 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20  olve(pParse, p, 
1b3f0 30 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  0);.    pEList =
1b400 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
1b410 66 6f 72 28 69 3d 30 3b 20 70 45 4c 69 73 74 20  for(i=0; pEList 
1b420 26 26 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  && i<pEList->nEx
1b430 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
1b440 7b 0a 20 20 20 20 20 20 69 66 28 20 21 28 6d 61  {.      if( !(ma
1b450 73 6b 26 28 28 75 33 32 29 31 3c 3c 69 29 29 20  sk&((u32)1<<i)) 
1b460 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b470 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 4c  e3ExprDelete(pEL
1b480 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1b490 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  ;.        pEList
1b4a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
1b4b0 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1b4c0 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  e->db, TK_NULL, 
1b4d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1b4e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
1b4f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
1b500 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1b510 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
1b520 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
1b530 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1b540 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
1b550 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
1b560 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
1b570 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1b580 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
1b590 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1b5a0 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
1b5b0 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
1b5c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
1b5d0 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
1b5e0 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
1b5f0 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1b600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b620 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
1b630 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
1b640 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
1b650 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
1b660 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1b670 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
1b680 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
1b690 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
1b6a0 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69  ry cell pDest->i
1b6b0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
1b6c0 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
1b6d0 74 6f 72 65 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 65  tore non-null re
1b6e0 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
1b6f0 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1b700 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20  arm. .**        
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
1b720 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ly the affinity 
1b730 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20  pDest->affinity 
1b740 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74  before storing t
1b750 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  hem..**.**     S
1b760 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
1b770 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
1b780 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
1b790 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1b7a0 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
1b7b0 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
1b7c0 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
1b7d0 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
1b7e0 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1b7f0 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
1b800 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
1b810 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
1b820 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
1b830 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1b840 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
1b850 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74  phemTab    Creat
1b860 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  e an temporary t
1b870 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
1b880 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20  m and store.**  
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74 68     the result th
1b8b0 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20  ere. The cursor 
1b8c0 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74  is left open aft
1b8d0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
1b8e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b8f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing..**.**     S
1b900 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 49  RT_Coroutine   I
1b910 6e 76 6f 6b 65 20 61 20 63 6f 2d 72 6f 75 74 69  nvoke a co-routi
1b920 6e 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 61 20  ne to compute a 
1b930 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 0a 2a  single row of .*
1b940 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b950 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
1b960 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
1b970 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65  xists      Store
1b980 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63   a 1 in memory c
1b990 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ell pDest->iParm
1b9a0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   if the result.*
1b9b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b9c0 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74        set is not
1b9d0 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   empty..**.**   
1b9e0 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20    SRT_Discard   
1b9f0 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75    Throw the resu
1ba00 6c 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a 20  lts away..**.** 
1ba10 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e  See the selectIn
1ba20 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69  nerLoop() functi
1ba30 6f 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69 63  on for a canonic
1ba40 61 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  al listing of th
1ba50 65 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76 61  e .** allowed va
1ba60 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e  lues of eDest an
1ba70 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73  d their meanings
1ba80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ba90 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1baa0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1bab0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
1bac0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
1bad0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
1bae0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
1baf0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
1bb00 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
1bb10 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
1bb20 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
1bb30 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
1bb40 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
1bb50 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
1bb60 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1bb70 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
1bb80 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  t..**.** The pPa
1bb90 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
1bba0 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67   and *pParentAgg
1bbb0 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c   fields are fill
1bbc0 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ed in if this.**
1bbd0 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62   SELECT is a sub
1bbe0 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75  query.  This rou
1bbf0 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20  tine may try to 
1bc00 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c  combine this SEL
1bc10 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20  ECT.** with its 
1bc20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61  parent to form a
1bc30 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65   single flat que
1bc40 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67  ry.  In so doing
1bc50 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68  , it might.** ch
1bc60 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20  ange the parent 
1bc70 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e  query from a non
1bc80 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e  -aggregate to an
1bc90 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
1bca0 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65  ..** For that re
1bcb0 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e  ason, the pParen
1bcc0 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73  tAgg flag is pas
1bcd0 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
1bce0 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62  , so it.** can b
1bcf0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
1bd00 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68   Example 1:   Th
1bd10 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
1bd20 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
1bd30 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  er..**.**    SEL
1bd40 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f  ECT * FROM t1 JO
1bd50 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f  IN (SELECT x, co
1bd60 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20  unt(*) FROM t2) 
1bd70 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c  JOIN t3;.**    \
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd90 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73        \_______ s
1bda0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f  ubquery _______/
1bdb0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
1bdc0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20          /.**    
1be00 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1be10 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
1be20 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
1be30 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54  _______/.**.** T
1be40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1be50 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75  alled for the ou
1be60 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e  ter query first.
1be70 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c     For that call
1be80 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c  ,.** pParent wil
1be90 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69  l be NULL.  Duri
1bea0 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ng the processin
1beb0 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  g of the outer q
1bec0 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72  uery, this .** r
1bed0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1bee0 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
1bef0 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75  handle the subqu
1bf00 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65  ery.  For the re
1bf10 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c  cursive.** call,
1bf20 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f   pParent will po
1bf30 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72  int to the outer
1bf40 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65   query.  Because
1bf50 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1bf60 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65  .** the second e
1bf70 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65  lement in a thre
1bf80 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20  e-way join, the 
1bf90 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65  parentTab parame
1bfa0 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31  ter will.** be 1
1bfb0 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20   (the 2nd value 
1bfc0 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61  of a 0-indexed a
1bfd0 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  rray.).*/.int sq
1bfe0 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
1bff0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1c010 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1c020 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1c030 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
1c040 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1c050 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
1c060 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
1c070 65 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61 74  est,     /* What
1c080 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
1c090 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
1c0a0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
1c0b0 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  nt,       /* Ano
1c0c0 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20  ther SELECT for 
1c0d0 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20  which this is a 
1c0e0 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69  sub-query */.  i
1c0f0 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20  nt parentTab,   
1c100 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1c110 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  n pParent->pSrc 
1c120 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  of this query */
1c130 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41  .  int *pParentA
1c140 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg,       /* Tru
1c150 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65  e if pParent use
1c160 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1c170 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
1c180 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
1c190 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
1c1a0 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
1c1b0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
1c1c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1c1d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c1e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1c1f0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
1c200 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
1c210 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
1c220 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
1c230 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1c240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c250 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
1c260 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
1c270 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
1c280 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
1c290 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
1c2a0 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
1c2b0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
1c2c0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1c2d0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1c2e0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
1c2f0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
1c300 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
1c310 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1c320 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
1c330 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
1c340 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
1c350 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1c360 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1c370 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c380 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
1c390 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c3a0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1c3b0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1c3c0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
1c3d0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
1c3e0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1c3f0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
1c400 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
1c410 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
1c420 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1c430 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
1c440 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
1c450 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
1c460 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
1c470 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
1c480 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
1c490 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1c4a0 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
1c4b0 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
1c4c0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
1c4d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1c4e0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
1c4f0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
1c500 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
1c510 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  x;     /* Addres
1c520 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45  s of an OP_OpenE
1c530 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
1c540 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66  tion */.  AggInf
1c550 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
1c560 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1c570 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
1c580 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
1c590 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
1c5a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1c5b0 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
1c5c0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
1c5d0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1c5e0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1c5f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c600 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
1c610 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
1c620 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
1c630 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
1c640 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
1c650 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
1c660 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1c670 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1c680 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
1c690 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
1c6a0 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
1c6b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
1c6c0 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65  Info));..  pOrde
1c6d0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
1c6e0 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  y;.  if( Ignorab
1c6f0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
1c700 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   ){.    p->pOrde
1c710 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  rBy = 0;..    /*
1c720 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
1c730 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65  the DISTINCT ope
1c740 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64  rator makes no d
1c750 69 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  ifference to the
1c760 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c  .    ** results,
1c770 20 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66   so remove it if
1c780 20 69 74 20 77 65 72 65 20 73 70 65 63 69 66 69   it were specifi
1c790 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ed..    */.    a
1c7a0 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
1c7b0 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
1c7c0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
1c7d0 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
1c7e0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
1c7f0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
1c800 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
1c810 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b  t==SRT_Discard);
1c820 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e  .    p->isDistin
1c830 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ct = 0;.  }.  if
1c840 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
1c850 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
1c860 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , 0) ){.    goto
1c870 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1c880 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
1c890 20 70 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66 6e   pOrderBy;..#ifn
1c8a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c8b0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1c8c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1c8d0 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
1c8e0 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
1c8f0 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
1c900 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
1c910 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1c920 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
1c930 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
1c940 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
1c950 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
1c960 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1c970 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
1c980 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
1c990 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
1c9a0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
1c9b0 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
1c9c0 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
1c9d0 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
1c9e0 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
1c9f0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1ca00 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
1ca10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1ca20 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
1ca30 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1ca40 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1ca50 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
1ca60 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
1ca70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1ca80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ca90 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1caa0 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
1cab0 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
1cac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1cad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cae0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
1caf0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1cb00 2c 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a 20  , pDest, aff);. 
1cb10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1cb20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
1cb30 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
1cb40 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
1cb50 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
1cb60 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1cb70 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
1cb80 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
1cb90 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
1cba0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
1cbb0 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d  aving;.  isAgg =
1cbc0 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44   p->isAgg;.  isD
1cbd0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
1cbe0 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73  istinct;.  pELis
1cbf0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
1cc00 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
1cc10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1cc20 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
1cc30 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
1cc40 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
1cc50 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
1cc60 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
1cc70 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
1cc80 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
1cc90 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
1cca0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
1ccb0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1ccc0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
1ccd0 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
1cce0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
1ccf0 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
1cd00 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
1cd10 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
1cd20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cd30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1cd40 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
1cd50 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
1cd60 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
1cd70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
1cd80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
1cd90 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
1cda0 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20  dif..  /* ORDER 
1cdb0 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  BY is ignored fo
1cdc0 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69  r some destinati
1cdd0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
1cde0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1cdf0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (pDest) ){.    p
1ce00 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
1ce10 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
1ce20 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
1ce30 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1ce40 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1ce50 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
1ce60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1ce70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1ce80 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
1ce90 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
1cea0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
1ceb0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1cec0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1ced0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1cee0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1cef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1cf00 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1cf10 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1cf20 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
1cf30 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  text = 0;.    in
1cf40 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  t needRestoreCon
1cf50 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74  text;.    struct
1cf60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1cf70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
1cf80 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
1cf90 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20 20  ctDest dest;..  
1cfa0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
1cfb0 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d  lect==0 || pItem
1cfc0 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20  ->isPopulated ) 
1cfd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1cfe0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  ( pItem->zName!=
1cff0 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
1d000 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1d010 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1d020 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
1d030 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1d040 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
1d050 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
1d060 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
1d070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1d080 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
1d090 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
1d0a0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
1d0b0 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
1d0c0 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
1d0d0 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
1d0e0 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
1d0f0 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68  refered to by th
1d100 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
1d110 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
1d120 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
1d130 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
1d140 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
1d150 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
1d160 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
1d170 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
1d180 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
1d190 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
1d1a0 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
1d1b0 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
1d1c0 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
1d1d0 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
1d1e0 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
1d1f0 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
1d200 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1d210 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
1d220 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1d230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1d240 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
1d250 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
1d260 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
1d270 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1d280 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74  lect(pParse, pIt
1d290 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65  em->pSelect, &de
1d2a0 73 74 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67  st, p, i, &isAgg
1d2b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
1d2c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1d2d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
1d2e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
1d2f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
1d300 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
1d310 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
1d320 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65  ;.    if( needRe
1d330 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a  storeContext ){.
1d340 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41        pParse->zA
1d350 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
1d360 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
1d370 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69      }.    pTabLi
1d380 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1d390 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
1d3a0 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49  here;.    if( !I
1d3b0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
1d3c0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
1d3d0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1d3e0 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
1d3f0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
1d400 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48  pGroupBy;.    pH
1d410 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
1d420 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e  ng;.    isDistin
1d430 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
1d440 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ct;.  }.#endif..
1d450 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1d460 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  e if this is a s
1d470 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e  ubquery that can
1d480 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20   be "flattened" 
1d490 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
1d4a0 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  .  ** If flatten
1d4b0 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ing is a possibl
1d4c0 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72  ity, do so and r
1d4d0 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
1d4e0 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  y.  .  */.#ifnde
1d4f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1d500 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  EW.  if( pParent
1d510 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26   && pParentAgg &
1d520 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53  &.      flattenS
1d530 75 62 71 75 65 72 79 28 64 62 2c 20 70 50 61 72  ubquery(db, pPar
1d540 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
1d550 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41  *pParentAgg, isA
1d560 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69  gg) ){.    if( i
1d570 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41  sAgg ) *pParentA
1d580 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  gg = 1;.    goto
1d590 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1d5a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1d5b0 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69   possible, rewri
1d5c0 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  te the query to 
1d5d0 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73  use GROUP BY ins
1d5e0 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54  tead of DISTINCT
1d5f0 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20  ..  ** GROUP BY 
1d600 6d 61 79 20 75 73 65 20 61 6e 20 69 6e 64 65 78  may use an index
1d610 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72  , DISTINCT never
1d620 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
1d630 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  ( p->isDistinct 
1d640 26 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26 20  && !p->isAgg && 
1d650 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  !p->pGroupBy ){.
1d660 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
1d670 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1d680 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
1d690 73 74 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42  st);.    pGroupB
1d6a0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1d6b0 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e  .    p->isDistin
1d6c0 63 74 20 3d 20 30 3b 0a 20 20 20 20 69 73 44 69  ct = 0;.    isDi
1d6d0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a  stinct = 0;.  }.
1d6e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1d6f0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
1d700 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20  ause, then this 
1d710 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  sorting.  ** ind
1d720 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ex might end up 
1d730 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
1d740 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
1d750 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
1d760 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
1d770 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73  der.  If that is
1d780 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
1d790 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e  the.  ** OP_Open
1d7a0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
1d7b0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68  ction will be ch
1d7c0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
1d7d0 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65  oop once.  ** we
1d7e0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
1d7f0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
1d800 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  ex is not needed
1d810 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49  .  The addrSortI
1d820 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62  ndex.  ** variab
1d830 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
1d840 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68  cilitate that ch
1d850 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
1d860 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
1d870 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1d880 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
1d890 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1d8a0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1d8b0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
1d8c0 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1d8d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1d8e0 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
1d8f0 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72  enEphm[2] = addr
1d900 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
1d910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d920 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1d930 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1d960 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
1d970 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1d9a0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1d9b0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1d9c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
1d9d0 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
1d9e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1d9f0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
1da00 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
1da10 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
1da20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
1da30 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
1da40 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
1da50 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
1da60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1da70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1da80 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45  pDest->iParm, pE
1da90 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
1daa0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1dab0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
1dac0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
1dad0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1dae0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1daf0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1db00 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  p, iEnd);..  /* 
1db10 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
1db20 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
1db30 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
1db40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
1db50 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b  istinct ){.    K
1db60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1db70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
1db80 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20  Agg || pGroupBy 
1db90 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  );.    distinct 
1dba0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1dbb0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
1dbc0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1dbd0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
1dbe0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
1dbf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1dc00 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1dc10 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c  al, distinct, 0,
1dc20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1dc40 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1dc50 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1dc60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1dc70 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
1dc80 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
1dc90 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
1dca0 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
1dcb0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
1dcc0 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
1dcd0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
1dce0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1dcf0 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f  s case is for no
1dd00 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1dd10 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e  ies.    ** Begin
1dd20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1dd30 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57  an.    */.    pW
1dd40 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1dd50 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1dd60 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1dd70 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30 29  e, &pOrderBy, 0)
1dd80 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
1dd90 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1dda0 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49  t_end;..    /* I
1ddb0 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
1ddc0 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
1ddd0 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
1dde0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
1ddf0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
1de00 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
1de10 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
1de20 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
1de30 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
1de40 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
1de50 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1de60 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
1de70 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
1de80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1de90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
1dea0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
1deb0 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20  Index, 1);.     
1dec0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1ded0 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
1dee0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
1def0 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
1df00 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  oop.    */.    a
1df10 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63  ssert(!isDistinc
1df20 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e  t);.    selectIn
1df30 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1df40 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
1df50 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70   pOrderBy, -1, p
1df60 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
1df70 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
1df80 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
1df90 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
1dfa0 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
1dfb0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
1dfc0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
1dfd0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1dfe0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
1dff0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
1e000 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  is the processin
1e010 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
1e020 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e  queries */.    N
1e030 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
1e040 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
1e050 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
1e060 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
1e070 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
1e080 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
1e090 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
1e0a0 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
1e0b0 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
1e0c0 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1e0d0 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
1e0e0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
1e0f0 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
1e100 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
1e110 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
1e120 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
1e130 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
1e140 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
1e150 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e170 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
1e180 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
1e190 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
1e1a0 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1e1c0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1e1d0 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
1e1e0 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
1e1f0 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
1e200 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
1e210 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
1e220 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
1e230 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
1e240 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
1e250 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
1e260 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  */...    /* The 
1e270 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
1e280 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73  les hold address
1e290 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72  es or labels for
1e2a0 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20   parts of the.  
1e2b0 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
1e2c0 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20  hine program we 
1e2d0 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65  are putting toge
1e2e0 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ther */.    int 
1e2f0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
1e300 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1e310 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1e320 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
1e330 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
1e340 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
1e350 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
1e360 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1e370 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
1e380 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tine */.    int 
1e390 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
1e3a0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61      /* Set the a
1e3b0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
1e3c0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  turn */.    int 
1e3d0 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
1e3e0 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  op; /* Start of 
1e3f0 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61  code that initia
1e400 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20  lizes the input 
1e410 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20  loop */.    int 
1e420 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
1e430 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1e440 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
1e450 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
1e460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1e470 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73  nd of all proces
1e480 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
1e490 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
1e4a0 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70      /* The OP_Op
1e4b0 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
1e4c0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
1e4d0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  x */.    int add
1e4e0 72 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20  rReset;         
1e4f0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
1e500 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
1e510 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
1e520 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
1e530 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1e540 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
1e550 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
1e560 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
1e570 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
1e580 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1e590 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
1e5a0 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
1e5b0 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
1e5c0 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
1e5d0 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
1e5e0 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
1e5f0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
1e600 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
1e610 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
1e620 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
1e630 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
1e640 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
1e650 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
1e660 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
1e670 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
1e680 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
1e690 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
1e6a0 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
1e6b0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
1e6c0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
1e6d0 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
1e6e0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1e6f0 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  +1 : 0;.    sAgg
1e700 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
1e710 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71  pGroupBy;.    sq
1e720 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1e730 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
1e740 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
1e750 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1e760 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65  List(&sNC, pOrde
1e770 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48  rBy);.    if( pH
1e780 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
1e790 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1e7a0 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
1e7b0 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
1e7c0 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
1e7d0 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
1e7e0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
1e7f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1e800 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
1e810 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1e820 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1e830 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
1e840 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
1e850 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
1e860 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1e870 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
1e880 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1e890 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
1e8a0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
1e8b0 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
1e8c0 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
1e8d0 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
1e8e0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
1e8f0 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  n aggregates wit
1e900 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
1e910 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e920 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1e930 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1e940 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
1e950 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1e960 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
1e970 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
1e980 20 6a 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   j1;..      /* C
1e990 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61  reate labels tha
1e9a0 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65  t we will be nee
1e9b0 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ding.      */.  
1e9c0 20 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69      addrInitiali
1e9d0 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  zeLoop = sqlite3
1e9e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1e9f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
1ea00 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
1ea10 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
1ea20 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
1ea30 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
1ea40 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
1ea50 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
1ea60 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
1ea70 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
1ea80 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
1ea90 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
1eaa0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
1eab0 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  the OpenEphemera
1eac0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  l instruction.  
1ead0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
1eae0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1eaf0 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
1eb00 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
1eb10 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
1eb20 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1eb30 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1eb40 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1eb50 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
1eb60 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  By);.      addrS
1eb70 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
1eb80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1eb90 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1eba0 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41  l, .          sA
1ebb0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1ebc0 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72  x, sAggInfo.nSor
1ebd0 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20  tingColumn, .   
1ebe0 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a         0, (char*
1ebf0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1ec00 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1ec10 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
1ec20 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
1ec30 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
1ec40 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
1ec50 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
1ec60 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
1ec70 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
1ec80 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
1ec90 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
1eca0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
1ecb0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
1ecc0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
1ecd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
1ece0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
1ecf0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
1ed00 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
1ed10 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1ed20 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
1ed30 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
1ed40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ed50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1ed60 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
1ed70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ed80 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
1ed90 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
1eda0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1edb0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1edc0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
1edd0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1ede0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
1edf0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
1ee00 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1ee10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ee20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
1ee30 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b  InitializeLoop);
1ee40 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
1ee50 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1ee60 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
1ee70 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
1ee80 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
1ee90 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
1eea0 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
1eeb0 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
1eec0 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
1eed0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
1eee0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1eef0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
1ef00 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
1ef10 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
1ef20 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
1ef30 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
1ef40 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
1ef50 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
1ef60 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
1ef70 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
1ef80 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
1ef90 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
1efa0 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
1efb0 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
1efc0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
1efd0 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
1efe0 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
1eff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1f000 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1f010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f020 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1f030 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
1f040 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1f050 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
1f060 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
1f070 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
1f080 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1f090 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1f0a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1f0b0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
1f0c0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
1f0d0 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
1f0e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1f0f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
1f100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f110 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
1f120 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
1f130 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
1f140 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1f150 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
1f160 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
1f170 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
1f180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f190 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
1f1a0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
1f1b0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
1f1c0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
1f1d0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
1f1e0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
1f1f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f200 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1f210 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
1f220 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
1f230 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1f240 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
1f250 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1f260 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
1f270 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
1f280 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1f2a0 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2c0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
1f2d0 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
1f2e0 72 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20  rt, aff);.      
1f2f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f300 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
1f310 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
1f320 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1f330 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
1f340 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
1f350 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1f360 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1f370 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
1f380 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
1f390 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
1f3a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1f3b0 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
1f3c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1f3d0 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  r(v);.      regR
1f3e0 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
1f3f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 73  >nMem;.      res
1f400 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
1f410 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1f420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f430 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1f440 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
1f450 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
1f460 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
1f470 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
1f480 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
1f490 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
1f4a0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
1f4b0 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
1f4c0 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
1f4d0 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
1f4e0 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
1f4f0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
1f500 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
1f510 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
1f520 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
1f530 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
1f540 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
1f550 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
1f560 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
1f570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1f580 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1f590 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
1f5a0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1f5b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f5c0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
1f5d0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
1f5e0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
1f5f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1f600 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1f610 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75  , pWhere, &pGrou
1f620 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  pBy, 0);.      i
1f630 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
1f640 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1f650 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
1f660 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
1f670 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
1f680 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
1f690 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
1f6a0 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
1f6b0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
1f6c0 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
1f6d0 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
1f6e0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
1f6f0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
1f700 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
1f710 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
1f720 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
1f730 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
1f740 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47     */.        pG
1f750 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
1f760 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72  upBy;.        gr
1f770 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
1f780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f790 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
1f7a0 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
1f7b0 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
1f7c0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
1f7d0 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
1f7e0 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
1f7f0 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
1f800 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
1f810 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
1f820 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
1f830 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
1f840 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
1f850 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
1f860 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
1f870 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
1f880 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1f890 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
1f8a0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
1f8b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
1f8c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
1f8d0 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
1f8e0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
1f8f0 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
1f900 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
1f910 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
1f920 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20  ol = nGroupBy + 
1f930 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  1;.        j = n
1f940 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
1f950 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1f960 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
1f970 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1f980 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
1f990 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
1f9a0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
1f9b0 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
1f9c0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
1f9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f9e0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
1f9f0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
1fa00 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1fa10 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
1fa20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fa30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1fa40 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
1fa50 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  se, 0);.        
1fa60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fa70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
1fa80 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1fa90 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47  ngIdx,regBase+nG
1faa0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
1fab0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
1fac0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1fad0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
1fae0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1faf0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1fb00 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
1fb10 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
1fb20 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
1fb30 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
1fb40 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
1fb50 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
1fb60 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
1fb70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
1fb80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fb90 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1fba0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
1fbd0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
1fbe0 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
1fbf0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1fc00 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1fc20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fc30 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
1fc40 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
1fc50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
1fc60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
1fc70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fc80 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
1fc90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1fca0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1fcb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fcc0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
1fcd0 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
1fce0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
1fcf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1fd00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1fd10 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49  IdxInsert, sAggI
1fd20 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1fd30 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
1fd40 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1fd50 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1fd60 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
1fd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1fd80 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1fd90 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
1fda0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
1fdb0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
1fdc0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
1fdd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fde0 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67  (v, OP_Sort, sAg
1fdf0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
1fe00 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
1fe10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1fe20 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
1fe30 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
1fe40 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
1fe50 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
1fe60 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
1fe70 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
1fe80 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
1fe90 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
1fea0 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
1feb0 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
1fec0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
1fed0 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
1fee0 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
1fef0 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
1ff00 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
1ff10 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
1ff20 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
1ff30 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
1ff40 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
1ff50 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
1ff60 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1ff70 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
1ff80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1ff90 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
1ffa0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ffb0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66  Addr(v);.      f
1ffc0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
1ffd0 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
1ffe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
1fff0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
20000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20010 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
20020 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73  lumn, sAggInfo.s
20030 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42  ortingIdx, j, iB
20040 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
20050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20060 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
20070 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
20080 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20090 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
200a0 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
200b0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
200c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
200d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
200e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
200f0 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
20100 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
20110 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
20130 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
20140 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
20150 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
20160 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
20170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20180 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
20190 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a  Jump, j1+1, 0, j
201a0 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  1+1);..      /* 
201b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
201c0 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
201d0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
201e0 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
201f0 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
20200 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
20210 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
20220 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
20230 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
20240 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
20250 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
20260 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
20270 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
20280 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
20290 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
202a0 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
202b0 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
202c0 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
202d0 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
202e0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
202f0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
20300 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
20310 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
20320 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
20330 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
20340 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
20350 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
20360 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
20370 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20380 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
20390 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
203a0 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
203b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
203c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
203d0 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
203e0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
203f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
20400 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
20410 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
20420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20430 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
20440 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
20450 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  End);.      Vdbe
20460 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
20470 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
20480 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20490 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
204a0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
204b0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
204c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
204d0 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75  v, "reset accumu
204e0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
204f0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
20500 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
20510 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
20520 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
20530 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
20540 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
20550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20560 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
20570 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
20580 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
20590 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
205a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
205b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
205c0 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
205d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
205e0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
205f0 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
20600 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
20610 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
20620 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
20630 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
20640 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
20650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20660 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67  (v, OP_Next, sAg
20670 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
20680 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
20690 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
206a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
206b0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
206c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
206d0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
206e0 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
206f0 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  x, 1);.      }..
20700 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
20710 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
20720 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
20730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20740 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
20750 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
20760 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
20770 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
20780 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
20790 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
207a0 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20        .    } /* 
207b0 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a  endif pGroupBy *
207c0 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
207d0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
207e0 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
207f0 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
20800 20 30 3b 0a 20 20 20 20 20 20 75 38 20 66 6c 61   0;.      u8 fla
20810 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  g;..      /* Che
20820 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
20830 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
20840 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
20850 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
20860 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e   **   SELECT min
20870 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
20880 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
20890 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
208a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
208b0 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
208c0 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
208d0 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
208e0 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
208f0 74 73 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  ts.      ** as i
20900 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
20910 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22  ORDER ON x" or "
20920 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22  ORDER ON x DESC"
20930 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20   clause. .      
20940 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
20950 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
20960 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
20970 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
20980 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64 64  hen.      ** add
20990 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
209a0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
209b0 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
209c0 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
209d0 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
209e0 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
209f0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
20a00 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
20a10 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
20a20 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  d to operate on 
20a30 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  the row with the
20a40 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69   minimum or maxi
20a50 6d 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76 61  mum .      ** va
20a60 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
20a70 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
20a80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
20a90 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
20aa0 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
20ab0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
20ac0 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
20ad0 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  htly.      ** mo
20ae0 64 69 66 79 20 62 65 68 61 76 69 6f 75 72 20 61  dify behaviour a
20af0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
20b00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b   **.      **   +
20b10 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
20b20 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
20b30 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
20b40 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
20b50 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
20b60 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
20b70 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
20b80 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
20b90 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  alue.      **   
20ba0 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a    for x..      *
20bb0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54  *.      **   + T
20bc0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
20bd0 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
20be0 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
20bf0 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
20c00 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
20c10 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
20c20 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
20c30 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
20c40 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ty on .      ** 
20c50 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74      satisfying t
20c60 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c  he 'ORDER BY' cl
20c70 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65  ause than it doe
20c80 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73  s in other cases
20c90 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  ..      **     R
20ca0 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
20cb0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
20cc0 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
20cd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20ce0 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75   flag = minMaxQu
20cf0 65 72 79 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ery(pParse, p);.
20d00 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
20d10 7b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d  {.        pDel =
20d20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
20d30 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
20d40 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  , p->pEList->a[0
20d50 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  ].pExpr->pList);
20d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69  .        if( pMi
20d70 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nMax && !db->mal
20d80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
20d90 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
20da0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
20db0 20 28 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f   ((flag==WHERE_O
20dc0 52 44 45 52 42 59 5f 4d 49 4e 29 3f 30 3a 31 29  RDERBY_MIN)?0:1)
20dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  ;.          pMin
20de0 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
20df0 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
20e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20e10 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   }..      /* Thi
20e20 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
20e30 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
20e40 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
20e50 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
20e60 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
20e70 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
20e80 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
20e90 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
20ea0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
20eb0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
20ec0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
20ed0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
20ee0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49  Info);.      pWI
20ef0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
20f00 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
20f10 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
20f20 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67  , &pMinMax, flag
20f30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
20f40 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
20f50 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
20f60 74 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  tDelete(pDel);. 
20f70 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
20f80 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
20f90 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
20fa0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
20fb0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
20fc0 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20 26    if( !pMinMax &
20fd0 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  & flag ){.      
20fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20ff0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
21000 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  0, pWInfo->iBrea
21010 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
21020 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
21030 29 20 62 79 20 69 6e 64 65 78 22 2c 28 66 6c 61  ) by index",(fla
21040 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
21050 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
21060 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
21070 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
21080 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
21090 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
210a0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
210b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
210c0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
210d0 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
210e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
210f0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
21100 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
21110 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
21120 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
21130 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
21140 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
21150 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
21160 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20   0, 0, 0, -1, . 
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
21190 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66  End, addrEnd, af
211a0 66 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  f);..      sqlit
211b0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
211c0 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pDel);.    }.  
211d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
211e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
211f0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
21200 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
21210 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
21220 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
21230 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
21240 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
21250 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
21260 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
21270 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
21280 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
21290 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
212a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
212b0 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
212c0 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
212d0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
212e0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
212f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21300 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69  UERY.  /* If thi
21310 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
21320 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
21330 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
21340 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
21350 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
21360 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72  .  So set the Sr
21370 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70  cList_item.isPop
21380 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70  ulated flag to p
21390 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73  revent.  ** this
213a0 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
213b0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
213c0 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
213d0 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a  e the use of.  *
213e0 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
213f0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
21400 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
21410 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
21420 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
21430 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
21440 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
21450 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
21460 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
21470 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
21480 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
21490 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
214a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
214b0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
214c0 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
214d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
214e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
214f0 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
21500 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
21510 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
21520 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
21530 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
21540 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
21550 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
21560 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
21570 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
21580 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
21590 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
215a0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
215b0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
215c0 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
215d0 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
215e0 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd:..  /* Identi
215f0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
21600 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
21610 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
21620 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
21630 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
21640 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
21650 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
21660 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
21670 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
21680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21690 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
216a0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
216b0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
216c0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
216d0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
216e0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
216f0 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  _free(sAggInfo.a
21700 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Col);.  sqlite3_
21710 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46  free(sAggInfo.aF
21720 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
21730 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
21740 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
21750 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
21760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
217a0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
217b0 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64  ing code is used
217c0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
217d0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
217e0 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68    The code.** th
217f0 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20  at follows does 
21800 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f  not appear in no
21810 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a  rmal builds..**.
21820 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
21830 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72  s are used to pr
21840 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74  int out the cont
21850 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61  ent of all or pa
21860 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73  rt of a .** pars
21870 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63  e structures suc
21880 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45  h as Select or E
21890 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74  xpr.  Such print
218a0 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a  outs are useful.
218b0 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74  ** for helping t
218c0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61  o understand wha
218d0 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69  t is happening i
218e0 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67  nside the code g
218f0 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69  enerator.** duri
21900 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
21910 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45   of complex SELE
21920 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
21930 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
21940 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65  ne are not calle
21950 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20  d anywhere from 
21960 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61  within the norma
21970 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20  l.** code base. 
21980 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64   Then are intend
21990 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
219a0 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
219b0 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66  debugger.** or f
219c0 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70  rom temporary "p
219d0 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74  rintf" statement
219e0 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64  s inserted for d
219f0 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  ebugging..*/.voi
21a00 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
21a10 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  pr(Expr *p){.  i
21a20 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  f( p->token.z &&
21a30 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b   p->token.n>0 ){
21a40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
21a50 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c  gPrintf("(%.*s",
21a60 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e   p->token.n, p->
21a70 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73  token.z);.  }els
21a80 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
21a90 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c  bugPrintf("(%d",
21aa0 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69   p->op);.  }.  i
21ab0 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  f( p->pLeft ){. 
21ac0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21ad0 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
21ae0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
21af0 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  (p->pLeft);.  }.
21b00 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
21b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
21b20 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
21b30 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
21b40 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b  Expr(p->pRight);
21b50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
21b60 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a  bugPrintf(")");.
21b70 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
21b80 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  intExprList(Expr
21b90 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
21ba0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
21bb0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
21bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
21bd0 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69  te3PrintExpr(pLi
21be0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
21bf0 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74  .    if( i<pList
21c00 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
21c10 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21c20 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20  rintf(", ");.   
21c30 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
21c40 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
21c50 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
21c60 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74  indent){.  sqlit
21c70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
21c80 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20  *sSELECT(%p) ", 
21c90 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a  indent, "", p);.
21ca0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
21cb0 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
21cc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
21cd0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
21ce0 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a   if( p->pSrc ){.
21cf0 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69      char *zPrefi
21d00 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  x;.    int i;.  
21d10 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f    zPrefix = "FRO
21d20 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  M";.    for(i=0;
21d30 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
21d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
21d50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
21d60 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
21d70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
21d80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
21d90 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65  ntf("%*s ", inde
21da0 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a  nt+6, zPrefix);.
21db0 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20        zPrefix = 
21dc0 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  "";.      if( pI
21dd0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
21de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
21df0 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22  ebugPrintf("(\n"
21e00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21e10 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49  e3PrintSelect(pI
21e20 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e  tem->pSelect, in
21e30 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20  dent+10);.      
21e40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
21e50 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64  intf("%*s)", ind
21e60 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20  ent+8, "");.    
21e70 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
21e80 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
21e90 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
21ea0 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74  Printf("%s", pIt
21eb0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
21ec0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
21ed0 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
21ee0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
21ef0 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a  gPrintf("(table:
21f00 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54   %s)", pItem->pT
21f10 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
21f20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
21f30 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
21f40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
21f50 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25  bugPrintf(" AS %
21f60 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
21f70 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
21f80 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d    if( i<p->pSrc-
21f90 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20  >nSrc-1 ){.     
21fa0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21fb0 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20  rintf(",");.    
21fc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
21fd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
21fe0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
21ff0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
22000 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
22010 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45  gPrintf("%*s WHE
22020 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  RE ", indent, ""
22030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
22040 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  intExpr(p->pWher
22050 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
22060 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
22070 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
22080 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
22090 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
220a0 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20  f("%*s GROUP BY 
220b0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
220c0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
220d0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
220e0 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
220f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
22100 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
22110 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
22120 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22130 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20  ntf("%*s HAVING 
22140 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
22150 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
22160 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29  Expr(p->pHaving)
22170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
22180 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
22190 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
221a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
221b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
221c0 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c  "%*s ORDER BY ",
221d0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
221e0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
221f0 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
22200 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
22210 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
22220 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20  );.  }.}./* End 
22230 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
22240 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20   debug printing 
22250 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code.***********
22260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222a0 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  **/.#endif /* de
222b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
222c0 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
222d0 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a     LITE_DEBUG) */.