/ Hex Artifact Content
Login

Artifact a1c18cab14b49f28ed7629a53fe02adeb13083d2:


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 31 36 31  select.c,v 1.161
0200: 2e 32 2e 34 20 32 30 30 34 2f 30 37 2f 32 30 20  .2.4 2004/07/20 
0210: 30 31 3a 34 35 3a 34 39 20 64 72 68 20 45 78 70  01:45:49 drh Exp
0220: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0230: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f  sqliteInt.h".../
0240: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
0250: 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75 63  new Select struc
0260: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
0270: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
0280: 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  t.** structure..
0290: 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  */.Select *sqlit
02a0: 65 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 45 78  eSelectNew(.  Ex
02b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
02c0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
02d0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
02e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
02f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0300: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0310: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0320: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0330: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0340: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0350: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0360: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0370: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0380: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0390: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
03a0: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
03b0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
03c0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
03d0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
03e0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
03f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
0400: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
0410: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
0420: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0430: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0440: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 20 20    int nLimit,   
0450: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0460: 20 76 61 6c 75 65 2e 20 20 2d 31 20 6d 65 61 6e   value.  -1 mean
0470: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  s not used */.  
0480: 69 6e 74 20 6e 4f 66 66 73 65 74 20 20 20 20 20  int nOffset     
0490: 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20        /* OFFSET 
04a0: 76 61 6c 75 65 2e 20 20 30 20 6d 65 61 6e 73 20  value.  0 means 
04b0: 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a  no offset */.){.
04c0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
04d0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
04e0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
04f0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
0500: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
0510: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
0520: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  e(pEList);.    s
0530: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
0540: 74 65 28 70 53 72 63 29 3b 0a 20 20 20 20 73 71  te(pSrc);.    sq
0550: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
0560: 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
0570: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
0580: 28 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  (pGroupBy);.    
0590: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
05a0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
05b0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
05c0: 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a 20  ete(pOrderBy);. 
05d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
05e0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
05f0: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0600: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
0610: 28 30 2c 20 73 71 6c 69 74 65 45 78 70 72 28 54  (0, sqliteExpr(T
0620: 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29  K_ALL,0,0,0), 0)
0630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
0640: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
0650: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72  t;.    pNew->pSr
0660: 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 4e  c = pSrc;.    pN
0670: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
0680: 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ere;.    pNew->p
0690: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
06a0: 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48  By;.    pNew->pH
06b0: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
06c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  .    pNew->pOrde
06d0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
06e0: 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74      pNew->isDist
06f0: 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69 6e 63  inct = isDistinc
0700: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  t;.    pNew->op 
0710: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 20  = TK_SELECT;.   
0720: 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20   pNew->nLimit = 
0730: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e 65 77  nLimit;.    pNew
0740: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
0750: 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  set;.    pNew->i
0760: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
0770: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
0780: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
0790: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
07a0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
07b0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 65 64  ntifiers preceed
07c0: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
07d0: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
07e0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
07f0: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
0800: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
0810: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
0820: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
0830: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
0840: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
0850: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
0860: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
0870: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
0880: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
0890: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
08a0: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
08b0: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
08c0: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
08d0: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
08e0: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
08f0: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
0900: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
0910: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
0920: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
0930: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
0940: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
0950: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
0960: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
0970: 69 6e 74 20 73 71 6c 69 74 65 4a 6f 69 6e 54 79  int sqliteJoinTy
0980: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
0990: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
09a0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
09b0: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
09c0: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
09d0: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
09e0: 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20  en *p;.  static 
09f0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
0a00: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 77 6f 72  st char *zKeywor
0a10: 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68 61 72  d;.    int nChar
0a20: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  ;.    int code;.
0a30: 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d    } keywords[] =
0a40: 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61   {.    { "natura
0a50: 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  l", 7, JT_NATURA
0a60: 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74  L },.    { "left
0a70: 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54  ",    4, JT_LEFT
0a80: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0a90: 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c   { "right",   5,
0aa0: 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54   JT_RIGHT|JT_OUT
0ab0: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c  ER },.    { "ful
0ac0: 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  l",    4, JT_LEF
0ad0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
0ae0: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75  TER },.    { "ou
0af0: 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55  ter",   5, JT_OU
0b00: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e  TER },.    { "in
0b10: 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e  ner",   5, JT_IN
0b20: 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72  NER },.    { "cr
0b30: 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e  oss",   5, JT_IN
0b40: 4e 45 52 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  NER },.  };.  in
0b50: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
0b60: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
0b70: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
0b80: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
0b90: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
0ba0: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
0bb0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
0bc0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69     for(j=0; j<si
0bd0: 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73  zeof(keywords)/s
0be0: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30  izeof(keywords[0
0bf0: 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); j++){.      
0c00: 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72  if( p->n==keywor
0c10: 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  ds[j].nChar .   
0c20: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
0c30: 53 74 72 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b  StrNICmp(p->z, k
0c40: 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77  eywords[j].zKeyw
0c50: 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b  ord, p->n)==0 ){
0c60: 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  .        jointyp
0c70: 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d  e |= keywords[j]
0c80: 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62  .code;.        b
0c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
0ca0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73    }.    if( j>=s
0cb0: 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f  izeof(keywords)/
0cc0: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b  sizeof(keywords[
0cd0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  0]) ){.      joi
0ce0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
0cf0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
0d00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
0d10: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
0d20: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
0d30: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
0d40: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
0d50: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
0d60: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
0d70: 0a 20 20 20 20 73 74 61 74 69 63 20 54 6f 6b 65  .    static Toke
0d80: 6e 20 64 75 6d 6d 79 20 3d 20 7b 20 30 2c 20 30  n dummy = { 0, 0
0d90: 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   };.    char *zS
0da0: 70 31 20 3d 20 22 20 22 2c 20 2a 7a 53 70 32 20  p1 = " ", *zSp2 
0db0: 3d 20 22 20 22 3b 0a 20 20 20 20 69 66 28 20 70  = " ";.    if( p
0dc0: 42 3d 3d 30 20 29 7b 20 70 42 20 3d 20 26 64 75  B==0 ){ pB = &du
0dd0: 6d 6d 79 3b 20 7a 53 70 31 20 3d 20 30 3b 20 7d  mmy; zSp1 = 0; }
0de0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
0df0: 7b 20 70 43 20 3d 20 26 64 75 6d 6d 79 3b 20 7a  { pC = &dummy; z
0e00: 53 70 32 20 3d 20 30 3b 20 7d 0a 20 20 20 20 73  Sp2 = 0; }.    s
0e10: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
0e20: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
0e30: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
0e40: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e50: 79 70 65 3a 20 22 2c 20 30 2c 0a 20 20 20 20 20  ype: ", 0,.     
0e60: 20 20 70 41 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20    pA->z, pA->n, 
0e70: 7a 53 70 31 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20  zSp1, 1, pB->z, 
0e80: 70 42 2d 3e 6e 2c 20 7a 53 70 32 2c 20 31 2c 20  pB->n, zSp2, 1, 
0e90: 70 43 2d 3e 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29  pC->z, pC->n, 0)
0ea0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
0eb0: 72 72 2b 2b 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  rr++;.    jointy
0ec0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0ed0: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74   }else if( joint
0ee0: 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29  ype & JT_RIGHT )
0ef0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
0f00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
0f10: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
0f20: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
0f30: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
0f40: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
0f50: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
0f60: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
0f70: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
0f80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0f90: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
0fa0: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
0fb0: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
0fc0: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
0fd0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
0fe0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
0ff0: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1000: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1010: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1020: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1040: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1050: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
1060: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
1070: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
1080: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1090: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
10a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65  ../*.** Add a te
10b0: 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  rm to the WHERE 
10c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70  expression in *p
10d0: 70 45 78 70 72 20 74 68 61 74 20 72 65 71 75 69  pExpr that requi
10e0: 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20  res the.** zCol 
10f0: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75  column to be equ
1100: 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61  al in the two ta
1110: 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20 70  bles pTab1 and p
1120: 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Tab2..*/.static 
1130: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
1140: 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  m(.  const char 
1150: 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *zCol,        /*
1160: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1170: 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  umn */.  const T
1180: 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20  able *pTab1,    
1190: 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65    /* First table
11a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
11b0: 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f  e *pTab2,      /
11c0: 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a  * Second table *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70  /.  Expr **ppExp
11e0: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
11f0: 41 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79  Add the equality
1200: 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78   term to this ex
1210: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  pression */.){. 
1220: 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20   Token dummy;.  
1230: 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31  Expr *pE1a, *pE1
1240: 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72  b, *pE1c;.  Expr
1250: 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a   *pE2a, *pE2b, *
1260: 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE2c;.  Expr *pE
1270: 3b 0a 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a  ;..  dummy.z = z
1280: 43 6f 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d  Col;.  dummy.n =
1290: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20   strlen(zCol);. 
12a0: 20 64 75 6d 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a   dummy.dyn = 0;.
12b0: 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 45    pE1a = sqliteE
12c0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
12d0: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61   &dummy);.  pE2a
12e0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
12f0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
1300: 79 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20  y);.  dummy.z = 
1310: 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab1->zName;.  
1320: 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e  dummy.n = strlen
1330: 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31  (dummy.z);.  pE1
1340: 62 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  b = sqliteExpr(T
1350: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
1360: 6d 79 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d  my);.  dummy.z =
1370: 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab2->zName;. 
1380: 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65   dummy.n = strle
1390: 6e 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45  n(dummy.z);.  pE
13a0: 32 62 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  2b = sqliteExpr(
13b0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
13c0: 6d 6d 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73  mmy);.  pE1c = s
13d0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54  qliteExpr(TK_DOT
13e0: 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29  , pE1b, pE1a, 0)
13f0: 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74  ;.  pE2c = sqlit
1400: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  eExpr(TK_DOT, pE
1410: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
1420: 70 45 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  pE = sqliteExpr(
1430: 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32  TK_EQ, pE1c, pE2
1440: 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74  c, 0);.  ExprSet
1450: 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1460: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28  FromJoin);.  if(
1470: 20 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20 20   *ppExpr ){.    
1480: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1490: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70  Expr(TK_AND, *pp
14a0: 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20  Expr, pE, 0);.  
14b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 45 78  }else{.    *ppEx
14c0: 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a  pr = pE;.  }.}..
14d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
14e0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
14f0: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
1500: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1510: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ression..**.** T
1520: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1530: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
1540: 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65  on terms of an e
1550: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c  xpression to tel
1560: 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55  l.** the LEFT OU
1570: 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73  TER JOIN process
1580: 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74  ing logic that t
1590: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
15a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20   of the.** join 
15b0: 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63  restriction spec
15c0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  ified in the ON 
15d0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
15e0: 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a  and not a part.*
15f0: 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65  * of the more ge
1600: 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75  neral WHERE clau
1610: 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  se.  These terms
1620: 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20   are moved over 
1630: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
1640: 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f  clause during jo
1650: 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75  in processing bu
1660: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d  t we need to rem
1670: 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a  ember that they.
1680: 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  ** originated in
1690: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
16a0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
16b0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
16c0: 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
16d0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
16e0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
16f0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
1700: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
1710: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  (p->pLeft);.    
1720: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
1730: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
1740: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
1750: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
1760: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
1770: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1780: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
1790: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
17a0: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
17b0: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
17c0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
17d0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
17e0: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
17f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1800: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1810: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1820: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1830: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
1840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1850: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
1860: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1870: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
1880: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69  cList *pSrc;.  i
1890: 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72 63 20  nt i, j;.  pSrc 
18a0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72  = p->pSrc;.  for
18b0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
18c0: 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rc-1; i++){.    
18d0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18e0: 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 53  tem *pTerm = &pS
18f0: 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  rc->a[i];.    st
1900: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1910: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 53 72  m *pOther = &pSr
1920: 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20  c->a[i+1];..    
1930: 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61 62 3d  if( pTerm->pTab=
1940: 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 54  =0 || pOther->pT
1950: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
1960: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
1970: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
1980: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
1990: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
19a0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
19b0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
19c0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
19d0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
19e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19f0: 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pTerm->jointype
1a00: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
1a10: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
1a20: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ab;.      if( pT
1a30: 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65 72  erm->pOn || pTer
1a40: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1a50: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
1a60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e  Msg(pParse, "a N
1a70: 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20  ATURAL join may 
1a80: 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20  not have ".     
1a90: 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20        "an ON or 
1aa0: 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30  USING clause", 0
1ab0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1ac0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1ad0: 20 20 20 70 54 61 62 20 3d 20 70 54 65 72 6d 2d     pTab = pTerm-
1ae0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 66 6f 72  >pTab;.      for
1af0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1b00: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1b10: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
1b20: 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20  x(pOther->pTab, 
1b30: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
1b40: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
1b50: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
1b60: 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  m(pTab->aCol[j].
1b70: 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20 70 4f 74  zName, pTab, pOt
1b80: 68 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70  her->pTab, &p->p
1b90: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
1ba0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1bb0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
1bc0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1bd0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
1be0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
1bf0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1c00: 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72 6d 2d 3e  ->pOn && pTerm->
1c10: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
1c20: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
1c30: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
1c40: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
1c50: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
1c60: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
1c70: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
1c80: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1c90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
1ca0: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
1cb0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
1cc0: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
1cd0: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
1ce0: 20 61 6e 64 20 41 4e 44 20 6f 70 65 72 61 74 6f   and AND operato
1cf0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
1d00: 28 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a  ( pTerm->pOn ){.
1d10: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
1d20: 72 28 70 54 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20  r(pTerm->pOn);. 
1d30: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57 68 65       if( p->pWhe
1d40: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  re==0 ){.       
1d50: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 54 65   p->pWhere = pTe
1d60: 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20 20 20 20 7d  rm->pOn;.      }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
1d80: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1d90: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e  Expr(TK_AND, p->
1da0: 70 57 68 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70  pWhere, pTerm->p
1db0: 4f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  On, 0);.      }.
1dc0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e        pTerm->pOn
1dd0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
1de0: 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61   /* Create extra
1df0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48   terms on the WH
1e00: 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
1e10: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  ach column named
1e20: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55  .    ** in the U
1e30: 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78  SING clause.  Ex
1e40: 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77  ample: If the tw
1e50: 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  o tables to be j
1e60: 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a  oined are .    *
1e70: 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68  * A and B and th
1e80: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e  e USING clause n
1e90: 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a  ames X, Y, and Z
1ea0: 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a  , then add this.
1eb0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48      ** to the WH
1ec0: 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41  ERE clause:    A
1ed0: 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42  .X=B.X AND A.Y=B
1ee0: 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20  .Y AND A.Z=B.Z. 
1ef0: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
1f00: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c  error if any col
1f10: 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  umn mentioned in
1f20: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
1f30: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  e is.    ** not 
1f40: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74  contained in bot
1f50: 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  h tables to be j
1f60: 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  oined..    */.  
1f70: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 55 73    if( pTerm->pUs
1f80: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
1f90: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  ist *pList;.    
1fa0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
1fb0: 73 73 65 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e  ssert( i<pSrc->n
1fc0: 53 72 63 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  Src-1 );.      p
1fd0: 4c 69 73 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55  List = pTerm->pU
1fe0: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
1ff0: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
2000: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
2010: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
2020: 28 70 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c  (pTerm->pTab, pL
2030: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29  ist->a[j].zName)
2040: 3c 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  <0 ||.          
2050: 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f    columnIndex(pO
2060: 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73  ther->pTab, pLis
2070: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30  t->a[j].zName)<0
2080: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2090: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
20a0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
20b0: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
20c0: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
20d0: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
20e0: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
20f0: 62 6c 65 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  bles", pList->a[
2100: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  j].zName);.     
2110: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2130: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 4c   addWhereTerm(pL
2140: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ist->a[j].zName,
2150: 20 70 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f   pTerm->pTab, pO
2160: 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e  ther->pTab, &p->
2170: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
2180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2190: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
21a0: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
21b0: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
21c0: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
21d0: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
21e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65  */.void sqliteSe
21f0: 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c 65 63  lectDelete(Selec
2200: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
2210: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
2220: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
2230: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
2240: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
2250: 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20  lete(p->pSrc);. 
2260: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
2270: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
2280: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
2290: 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  lete(p->pGroupBy
22a0: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44  );.  sqliteExprD
22b0: 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69 6e 67  elete(p->pHaving
22c0: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c  );.  sqliteExprL
22d0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72  istDelete(p->pOr
22e0: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
22f0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e  SelectDelete(p->
2300: 70 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74  pPrior);.  sqlit
2310: 65 46 72 65 65 28 70 2d 3e 7a 53 65 6c 65 63 74  eFree(p->zSelect
2320: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2330: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  p);.}../*.** Del
2340: 65 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ete the aggregat
2350: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
2360: 6f 6d 20 74 68 65 20 70 61 72 73 65 20 73 74 72  om the parse str
2370: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
2380: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 41 67 67  c void sqliteAgg
2390: 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28  regateInfoReset(
23a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
23b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
23c0: 72 73 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50  rse->aAgg);.  pP
23d0: 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a  arse->aAgg = 0;.
23e0: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
23f0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 75 73   0;.  pParse->us
2400: 65 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eAgg = 0;.}../*.
2410: 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
2420: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
2430: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
2440: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
2450: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
2460: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
2470: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
2480: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73  hOntoSorter(Pars
2490: 65 20 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20  e *pParse, Vdbe 
24a0: 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *v, ExprList *pO
24b0: 72 64 65 72 42 79 29 7b 0a 20 20 63 68 61 72 20  rderBy){.  char 
24c0: 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 69  *zSortOrder;.  i
24d0: 6e 74 20 69 3b 0a 20 20 7a 53 6f 72 74 4f 72 64  nt i;.  zSortOrd
24e0: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
24f0: 63 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  c( pOrderBy->nEx
2500: 70 72 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  pr + 1 );.  if( 
2510: 7a 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 29 20  zSortOrder==0 ) 
2520: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2530: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
2540: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2550: 69 6e 74 20 6f 72 64 65 72 20 3d 20 70 4f 72 64  int order = pOrd
2560: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
2570: 72 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 74 79  rder;.    int ty
2580: 70 65 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  pe;.    int c;. 
2590: 20 20 20 69 66 28 20 28 6f 72 64 65 72 20 26 20     if( (order & 
25a0: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
25b0: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  SK)==SQLITE_SO_T
25c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 74 79 70  EXT ){.      typ
25d0: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  e = SQLITE_SO_TE
25e0: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
25f0: 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54  ( (order & SQLIT
2600: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d  E_SO_TYPEMASK)==
2610: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b  SQLITE_SO_NUM ){
2620: 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51  .      type = SQ
2630: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
2640: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73   }else if( pPars
2650: 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e->db->file_form
2660: 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 74  at>=4 ){.      t
2670: 79 70 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ype = sqliteExpr
2680: 54 79 70 65 28 70 4f 72 64 65 72 42 79 2d 3e 61  Type(pOrderBy->a
2690: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
26a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74 79 70  }else{.      typ
26b0: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  e = SQLITE_SO_NU
26c0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
26d0: 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54 45   (order & SQLITE
26e0: 5f 53 4f 5f 44 49 52 4d 41 53 4b 29 3d 3d 53 51  _SO_DIRMASK)==SQ
26f0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
2700: 20 20 20 20 20 63 20 3d 20 74 79 70 65 3d 3d 53       c = type==S
2710: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f 20  QLITE_SO_TEXT ? 
2720: 27 41 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20 7d  'A' : '+';.    }
2730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 20 3d 20  else{.      c = 
2740: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  type==SQLITE_SO_
2750: 54 45 58 54 20 3f 20 27 44 27 20 3a 20 27 2d 27  TEXT ? 'D' : '-'
2760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72  ;.    }.    zSor
2770: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 63 3b 0a 20  tOrder[i] = c;. 
2780: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
2790: 65 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  e(pParse, pOrder
27a0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
27b0: 0a 20 20 7d 0a 20 20 7a 53 6f 72 74 4f 72 64 65  .  }.  zSortOrde
27c0: 72 5b 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  r[pOrderBy->nExp
27d0: 72 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  r] = 0;.  sqlite
27e0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  VdbeOp3(v, OP_So
27f0: 72 74 4d 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65  rtMakeKey, pOrde
2800: 72 42 79 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 7a  rBy->nExpr, 0, z
2810: 53 6f 72 74 4f 72 64 65 72 2c 20 50 33 5f 44 59  SortOrder, P3_DY
2820: 4e 41 4d 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  NAMIC);.  sqlite
2830: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2840: 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a  SortPut, 0, 0);.
2850: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2860: 75 74 69 6e 65 20 61 64 64 73 20 61 20 50 33 20  utine adds a P3 
2870: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
2880: 6c 61 73 74 20 56 44 42 45 20 6f 70 63 6f 64 65  last VDBE opcode
2890: 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 69 6e 73   that was.** ins
28a0: 65 72 74 65 64 2e 20 54 68 65 20 50 33 20 61 72  erted. The P3 ar
28b0: 67 75 6d 65 6e 74 20 61 64 64 65 64 20 69 73 20  gument added is 
28c0: 61 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  a string suitabl
28d0: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 4f 50  e for the .** OP
28e0: 5f 4d 61 6b 65 4b 65 79 20 6f 72 20 4f 50 5f 4d  _MakeKey or OP_M
28f0: 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65  akeIdxKey opcode
2900: 73 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 63  s.  The string c
2910: 6f 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 63 68  onsists of.** ch
2920: 61 72 61 63 74 65 72 73 20 27 74 27 20 6f 72 20  aracters 't' or 
2930: 27 6e 27 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  'n' depending on
2940: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2950: 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
2960: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
2970: 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
2980: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74   should be treat
2990: 65 64 20 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a  ed as numeric.**
29a0: 20 6f 72 20 61 73 20 74 65 78 74 2e 20 20 53 65   or as text.  Se
29b0: 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 4b 65 79  e the OP_MakeKey
29c0: 20 61 6e 64 20 4f 50 5f 4d 61 6b 65 49 64 78 4b   and OP_MakeIdxK
29d0: 65 79 20 6f 70 63 6f 64 65 0a 2a 2a 20 64 6f 63  ey opcode.** doc
29e0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61  umentation for a
29f0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2a00: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
2a10: 50 33 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 53 65  P3 string..** Se
2a20: 65 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74  e also the sqlit
2a30: 65 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 29  eAddIdxKeyType()
2a40: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69   routine..*/.voi
2a50: 64 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79  d sqliteAddKeyTy
2a60: 70 65 28 56 64 62 65 20 2a 76 2c 20 45 78 70 72  pe(Vdbe *v, Expr
2a70: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
2a80: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70   int nColumn = p
2a90: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
2aa0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 73 71  char *zType = sq
2ab0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c  liteMalloc( nCol
2ac0: 75 6d 6e 2b 31 20 29 3b 0a 20 20 69 6e 74 20 69  umn+1 );.  int i
2ad0: 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30  ;.  if( zType==0
2ae0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
2af0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
2b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 54 79 70 65   i++){.    zType
2b10: 5b 69 5d 20 3d 20 73 71 6c 69 74 65 45 78 70 72  [i] = sqliteExpr
2b20: 54 79 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Type(pEList->a[i
2b30: 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45  ].pExpr)==SQLITE
2b40: 5f 53 4f 5f 4e 55 4d 20 3f 20 27 6e 27 20 3a 20  _SO_NUM ? 'n' : 
2b50: 27 74 27 3b 0a 20 20 7d 0a 20 20 7a 54 79 70 65  't';.  }.  zType
2b60: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
2b70: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
2b80: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50 33 5f 44   -1, zType, P3_D
2b90: 59 4e 41 4d 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  YNAMIC);.}../*.*
2ba0: 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d  * Add code to im
2bb0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53  plement the OFFS
2bc0: 45 54 20 61 6e 64 20 4c 49 4d 49 54 0a 2a 2f 0a  ET and LIMIT.*/.
2bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
2be0: 4c 69 6d 69 74 65 72 28 0a 20 20 56 64 62 65 20  Limiter(.  Vdbe 
2bf0: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *v,          /* 
2c00: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
2c10: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
2c20: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
2c30: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2c40: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2c50: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
2c60: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20  Continue,    /* 
2c70: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
2c80: 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  p the current re
2c90: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42  cord */.  int iB
2ca0: 72 65 61 6b 2c 20 20 20 20 20 20 20 2f 2a 20 4a  reak,       /* J
2cb0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64 20  ump here to end 
2cc0: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
2cd0: 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20 20  t nPop          
2ce0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
2cf0: 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b 20  es to pop stack 
2d00: 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a  when jumping */.
2d10: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  ){.  if( p->iOff
2d20: 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  set>=0 ){.    in
2d30: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
2d40: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2d50: 29 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6e  ) + 2;.    if( n
2d60: 50 6f 70 3e 30 20 29 20 61 64 64 72 2b 2b 3b 0a  Pop>0 ) addr++;.
2d70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2d80: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
2d90: 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61  r, p->iOffset, a
2da0: 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 50  ddr);.    if( nP
2db0: 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  op>0 ){.      sq
2dc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2dd0: 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30   OP_Pop, nPop, 0
2de0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2df0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2e00: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2e10: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 20 20 69 66  tinue);.  }.  if
2e20: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
2e30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
2e40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
2e50: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
2e60: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  iBreak);.  }.}..
2e70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e80: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
2e90: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
2ea0: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
2eb0: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
2ec0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
2ed0: 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75  srcTab and nColu
2ee0: 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f  mn are both zero
2ef0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
2f00: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
2f10: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
2f20: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2f30: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
2f40: 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d   row.  If nColum
2f50: 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61  n>0.** then data
2f60: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
2f70: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
2f80: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  t is used only t
2f90: 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74  o get the.** dat
2fa0: 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20  atypes for each 
2fb0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
2fc0: 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65  c int selectInne
2fd0: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
2fe0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2ff0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
3000: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
3010: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
3020: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
3030: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
3040: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
3050: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3060: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
3070: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
3080: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
3090: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b0: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
30c0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
30d0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
30e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
3100: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
3110: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3120: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
3130: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72  If not NULL, sor
3140: 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20  t results using 
3150: 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  this key */.  in
3160: 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20  t distinct,     
3170: 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c        /* If >=0,
3180: 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c   make sure resul
3190: 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  ts are distinct 
31a0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
31d0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
31e0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
31f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
3200: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
3210: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
3220: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
3230: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
3240: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
3250: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
3260: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
3270: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
3280: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3290: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
32a0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
32b0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
32c0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
32d0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
32e0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
32f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3300: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
3310: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
3320: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
3330: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
3340: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
3350: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
3360: 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
3370: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3380: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64  tatement, then d
3390: 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a  o the check.  **
33a0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
33b0: 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75  row should be ou
33c0: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73  tput..  */.  has
33d0: 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69  Distinct = disti
33e0: 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74  nct>=0 && pEList
33f0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
3400: 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  r>0;.  if( pOrde
3410: 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69  rBy==0 && !hasDi
3420: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f  stinct ){.    co
3430: 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20  deLimiter(v, p, 
3440: 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61  iContinue, iBrea
3450: 6b 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k, 0);.  }..  /*
3460: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
3470: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
3480: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
3490: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
34a0: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
34b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
34c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
34d0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
34e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
34f0: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
3500: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3510: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
3520: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3530: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
3540: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3550: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3560: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3570: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3580: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3590: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
35a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
35b0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
35c0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
35d0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
35e0: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
35f0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3600: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3610: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3620: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
3630: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
3640: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3650: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
3660: 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c   -pEList->nExpr,
3670: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
3680: 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a 23 65  ntAddr(v)+7);.#e
3690: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 56  ndif.    sqliteV
36a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
36b0: 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e  akeKey, pEList->
36c0: 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
36d0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
36e0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20  ile_format>=4 ) 
36f0: 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65  sqliteAddKeyType
3700: 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  (v, pEList);.   
3710: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3720: 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c  (v, OP_Distinct,
3730: 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69 74   distinct, sqlit
3740: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
3750: 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
3760: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3770: 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e  P_Pop, pEList->n
3780: 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20  Expr+1, 0);.    
3790: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
37a0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
37b0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
37c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
37d0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
37e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
37f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3800: 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63  tStrKey, distinc
3810: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  t, 0);.    if( p
3820: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
3830: 20 20 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28      codeLimiter(
3840: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
3850: 20 69 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e   iBreak, nColumn
3860: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
3870: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
3880: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
3890: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
38a0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
38b0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
38c0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
38d0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
38e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
38f0: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
3900: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3910: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3920: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
3930: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
3940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3950: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3960: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
3970: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3980: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
3990: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
39a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
39b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   }..    /* Store
39c0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
39d0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
39e0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
39f0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
3a00: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
3a10: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
3a20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3a30: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3a40: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
3a50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3a60: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3a70: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3a80: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3a90: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3aa0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3ab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3ac0: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
3ad0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3ae0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3af0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
3b00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3b10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3b20: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
3b30: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
3b40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3b50: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
3b60: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
3b70: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
3b80: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
3b90: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
3ba0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
3bb0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
3bc0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
3bd0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
3be0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
3bf0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
3c00: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
3c10: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
3c20: 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
3c30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3c40: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3c50: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3c60: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3c70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3c80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
3c90: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
3ca0: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
3cb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3cc0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
3cd0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
3ce0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3cf0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
3d00: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
3d10: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
3d20: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
3d30: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
3d40: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
3d50: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
3d60: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
3d70: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
3d80: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
3d90: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
3da0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
3db0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
3dc0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
3dd0: 72 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  r1 = sqliteVdbeC
3de0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
3df0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a       int addr2;.
3e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
3e10: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
3e20: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3e30: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3e40: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3e50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3e60: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
3e70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  1, 0);.      add
3e80: 72 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  r2 = sqliteVdbeA
3e90: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3ea0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3eb0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
3ec0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
3ed0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
3ee0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
3ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3f00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3f10: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
3f20: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3f30: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3f40: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50  OP_PutStrKey, iP
3f50: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
3f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3f70: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3f80: 72 32 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75  r2, sqliteVdbeCu
3f90: 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
3fa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3fb0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
3fc0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
3fd0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
3fe0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
3ff0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
4000: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
4010: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
4020: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
4030: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
4040: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
4050: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
4060: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
4070: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
4080: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
4090: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
40a0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
40b0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
40c0: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
40d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
40e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
40f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4100: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4110: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4120: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4130: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
4140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4160: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
4170: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
4180: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ck function..   
4190: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
41a0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
41b0: 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20  ase SRT_Sorter: 
41c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
41d0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
41e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
41f0: 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65  v, OP_SortMakeRe
4200: 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  c, nColumn, 0);.
4210: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4220: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4230: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
4240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4250: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
4260: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b  =SRT_Callback );
4270: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4280: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4290: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
42a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
42b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
42c0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
42d0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
42e0: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c  handle the resul
42f0: 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74  ts.  The subrout
4300: 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ine itself.    *
4310: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
4320: 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65   for popping the
4330: 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20   results off of 
4340: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
4350: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
4360: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
4370: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4380: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4390: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
43a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
43b0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
43c0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
43d0: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
43e0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
43f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4400: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4410: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4420: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4440: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
4450: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
4460: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
4470: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
4480: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
4490: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
44a0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
44b0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
44c0: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
44d0: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
44e0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
44f0: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
4500: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4510: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4520: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4530: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
4540: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
4550: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
4560: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
4570: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
4580: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4590: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
45a0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
45b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
45c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
45d0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
45e0: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
45f0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
4600: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
4610: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
4620: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
4630: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
4640: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
4650: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
4660: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
4670: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
4680: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
4690: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
46a0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
46b0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
46c0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
46d0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
46e0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
46f0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 53 65 6c  eSortTail(.  Sel
4700: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4710: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4720: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
4730: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
4740: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4750: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
4760: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4770: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4780: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
4790: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
47a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
47b0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
47c0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
47d0: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
47e0: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
47f0: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4800: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4810: 69 6e 74 20 65 6e 64 31 20 3d 20 73 71 6c 69 74  int end1 = sqlit
4820: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
4830: 29 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20 3d 20  );.  int end2 = 
4840: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
4850: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
4860: 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  dr;.  if( eDest=
4870: 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65  =SRT_Sorter ) re
4880: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64  turn;.  sqliteVd
4890: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
48a0: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64  rt, 0, 0);.  add
48b0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
48c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65  dOp(v, OP_SortNe
48d0: 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20  xt, 0, end1);.  
48e0: 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70  codeLimiter(v, p
48f0: 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20 31 29  , addr, end2, 1)
4900: 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ;.  switch( eDes
4910: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
4920: 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
4930: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4940: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 43 61  dOp(v, OP_SortCa
4950: 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c  llback, nColumn,
4960: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4980: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
4990: 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62  case SRT_TempTab
49a0: 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  le: {.      sqli
49b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
49c0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72  P_NewRecno, iPar
49d0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
49e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
49f0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
4a00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4a10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
4a20: 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  ntKey, iParm, 0)
4a30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4a40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
4a50: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
4a60: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4a70: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4a80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4a90: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
4aa0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
4ab0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
4ac0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4ad0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4ae0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4af0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4b00: 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 56 64  oto, 0, sqliteVd
4b10: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4b20: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4b30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4b40: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4b50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
4b70: 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  trKey, iParm, 0)
4b80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4b90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
4ba0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
4bb0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4bc0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4bd0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4be0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
4bf0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4c00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4c10: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29  P_Goto, 0, end1)
4c20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
4c40: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4c50: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
4c60: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
4c70: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
4c80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4c90: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
4ca0: 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20  n, -1-i, i);.   
4cb0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4cc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4cd0: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
4ce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4cf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4d00: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
4d10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4d20: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4d30: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
4d40: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
4d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4d60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4d70: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
4d80: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52  );.  sqliteVdbeR
4d90: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
4da0: 6e 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  nd2);.  sqliteVd
4db0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4dc0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, 1, 0);.  sqli
4dd0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
4de0: 65 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20 73  el(v, end1);.  s
4df0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4e00: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
4e10: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
4e20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4e30: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
4e40: 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74 79   VDBE the dataty
4e50: 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  pes of.** column
4e60: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4e70: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  set..**.** This 
4e80: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e  routine only gen
4e90: 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20 74  erates code if t
4ea0: 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77 5f  he "PRAGMA show_
4eb0: 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a  datatypes=on".**
4ec0: 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75 74   has been execut
4ed0: 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79 70  ed.  The datatyp
4ee0: 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  es are reported 
4ef0: 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  out in the azCol
4f00: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f  .** parameter to
4f10: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4f20: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 72  nction.  The fir
4f30: 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74  st N azCol[] ent
4f40: 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  ries.** are the 
4f50: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
4f60: 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 65  umns, and the se
4f70: 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20 61  cond N entries a
4f80: 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  re the.** dataty
4f90: 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  pes for the colu
4fa0: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  mns..**.** The "
4fb0: 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61 20  datatype" for a 
4fc0: 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20 61  result that is a
4fd0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70   column of a typ
4fe0: 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  e is the.** data
4ff0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
5000: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
5010: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
5020: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
5030: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61  e datatype for a
5040: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5050: 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20 4e  either TEXT or N
5060: 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20  UMERIC.  The.** 
5070: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20 52  datatype for a R
5080: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
5090: 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  TEGER..*/.static
50a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
50b0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
50c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
50d0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
50e0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
50f0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
5100: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
5110: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
5120: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
5130: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
5140: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
5150: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
5160: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5170: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
5180: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
5190: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
51a0: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
51b0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
51c0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
51d0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   0;.    if( p==0
51e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
51f0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
5200: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
5210: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
5220: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e   *pTab;.      in
5230: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
5240: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
5250: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
5260: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
5270: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
5280: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
5290: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
52a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
52b0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
52c0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
52d0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
52e0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
52f0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
5300: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
5310: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5320: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5330: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5340: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
5350: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
5360: 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  GER";.      }els
5370: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
5380: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
5390: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
53a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
53b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
53c0: 70 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54  prType(p)==SQLIT
53d0: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
53e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
53f0: 58 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  XT";.      }else
5400: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
5410: 3d 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20  = "NUMERIC";.   
5420: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5430: 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20  qliteVdbeOp3(v, 
5440: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
5450: 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   + pEList->nExpr
5460: 2c 20 30 2c 20 7a 54 79 70 65 2c 20 30 29 3b 0a  , 0, zType, 0);.
5470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
5480: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
5490: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
54a0: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
54b0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
54c0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
54d0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
54e0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
54f0: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
5500: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
5510: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
5520: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
5530: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
5540: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5550: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
5560: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
5570: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
5580: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
5590: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
55a0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
55b0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
55c0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
55d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
55e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
55f0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
5600: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
5610: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
5620: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
5630: 61 6d 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  ames;..  assert(
5640: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
5650: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
5660: 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71  et || v==0 || sq
5670: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
5680: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
5690: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
56a0: 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
56b0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
56c0: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
56d0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68  lNames)!=0;.  sh
56e0: 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ortNames = (db->
56f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
5700: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
5710: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5720: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
5730: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
5740: 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 69 3d  .    int p2 = i=
5750: 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  =pEList->nExpr-1
5760: 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  ;.    p = pEList
5770: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5780: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e    if( p==0 ) con
5790: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
57a0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
57b0: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
57c0: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
57d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
57e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33     sqliteVdbeOp3
57f0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
5800: 65 2c 20 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c  e, i, p2, zName,
5810: 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69   0);.      conti
5820: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
5830: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
5840: 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20  UMN && pTabList 
5850: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
5860: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
5870: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
5880: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
5890: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
58a0: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
58b0: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
58c0: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
58d0: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
58e0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
58f0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
5900: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
5910: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
5920: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
5930: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
5940: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
5950: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
5960: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5970: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5980: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5990: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
59a0: 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49     zCol = "_ROWI
59b0: 44 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  D_";.      }else
59c0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
59d0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
59e0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
59f0: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
5a00: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
5a10: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
5a20: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
5a30: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ] ){.        int
5a40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
5a50: 62 65 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d  beOp3(v,OP_Colum
5a60: 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 70 2d  nName, i, p2, p-
5a70: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
5a80: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  .n);.        sql
5a90: 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53  iteVdbeCompressS
5aa0: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
5ab0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
5ac0: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
5ad0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
5ae0: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
5af0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5b00: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
5b10: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
5b20: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
5b30: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
5b40: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
5b50: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
5b60: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
5b70: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
5b80: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
5b90: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61  ring(&zName, zTa
5ba0: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29  b, ".", zCol, 0)
5bb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5bc0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
5bd0: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c  lumnName, i, p2,
5be0: 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d   zName, P3_DYNAM
5bf0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
5c00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5c10: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
5c20: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c  lumnName, i, p2,
5c30: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zCol, 0);.     
5c40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
5c50: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
5c60: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
5c70: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
5c80: 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 4f  qliteVdbeOp3(v,O
5c90: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
5ca0: 20 70 32 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   p2, p->span.z, 
5cb0: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
5cc0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
5cd0: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
5ce0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
5cf0: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
5d00: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
5d10: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
5d20: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
5d30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
5d40: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
5d50: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
5d60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33     sqliteVdbeOp3
5d70: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
5d80: 65 2c 20 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c  e, i, p2, zName,
5d90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   0);.    }.  }.}
5da0: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
5db0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
5dc0: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
5dd0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
5de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
5df0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
5e00: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
5e10: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
5e20: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
5e30: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
5e40: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
5e50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5e60: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
5e70: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
5e80: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
5e90: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
5ea0: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
5eb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ec0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
5ed0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
5ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
5ef0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
5f00: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
5f10: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
5f20: 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f  tic int fillInCo
5f30: 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c  lumnList(Parse*,
5f40: 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a   Select*);../*.*
5f50: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
5f60: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
5f70: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
5f80: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
5f90: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
5fa0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
5fb0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
5fc0: 20 2a 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65   *sqliteResultSe
5fd0: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
5fe0: 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a  *pParse, char *z
5ff0: 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20  TabName, Select 
6000: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
6010: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
6020: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
6030: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75   *pEList;.  Colu
6040: 6d 6e 20 2a 61 43 6f 6c 3b 0a 0a 20 20 69 66 28  mn *aCol;..  if(
6050: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
6060: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6070: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
6080: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
6090: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
60a0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
60b0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
60c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60d0: 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   }.  pTab->zName
60e0: 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71   = zTabName ? sq
60f0: 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e  liteStrDup(zTabN
6100: 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69  ame) : 0;.  pELi
6110: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
6120: 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43  List;.  pTab->nC
6130: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
6140: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
6150: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
6160: 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f  pTab->aCol = aCo
6170: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
6180: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
6190: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
61a0: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ol );.  for(i=0;
61b0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
61c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
61d0: 2c 20 2a 70 52 3b 0a 20 20 20 20 69 66 28 20 70  , *pR;.    if( p
61e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
61f0: 65 20 29 7b 0a 20 20 20 20 20 20 61 43 6f 6c 5b  e ){.      aCol[
6200: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
6210: 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  eStrDup(pEList->
6220: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
6230: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70 45   }else if( (p=pE
6240: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6250: 29 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20  )->op==TK_DOT . 
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
6270: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
6280: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
6290: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
62a0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
62b0: 20 63 6e 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   cnt;.      sqli
62c0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 61 43  teSetNString(&aC
62d0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d  ol[i].zName, pR-
62e0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f  >token.z, pR->to
62f0: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ken.n, 0);.     
6300: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
6310: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  i; j++){.       
6320: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
6330: 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  mp(aCol[j].zName
6340: 2c 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  , aCol[i].zName)
6350: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6360: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
6370: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
6380: 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e  .          sprin
6390: 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 2b 2b  tf(zBuf,"_%d",++
63a0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  cnt);.          
63b0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  n = strlen(zBuf)
63c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
63d0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 61 43  teSetNString(&aC
63e0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d  ol[i].zName, pR-
63f0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f  >token.z, pR->to
6400: 6b 65 6e 2e 6e 2c 20 7a 42 75 66 2c 20 6e 2c 30  ken.n, zBuf, n,0
6410: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d  );.          j =
6420: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
6430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
6440: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
6450: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
6460: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
6470: 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d 3e  tNString(&pTab->
6480: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[i].zName, p
6490: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
64a0: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  n.n, 0);.    }el
64b0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
64c0: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73  Buf[30];.      s
64d0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f  printf(zBuf, "co
64e0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
64f0: 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61       aCol[i].zNa
6500: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
6510: 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  p(zBuf);.    }. 
6520: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
6530: 28 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  (aCol[i].zName);
6540: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
6550: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
6560: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
6570: 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   For the given S
6580: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
6590: 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73   do three things
65a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
65b0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
65c0: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
65d0: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
65e0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
65f0: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74 68        defines th
6600: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
6610: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
6620: 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69 65  canned.  For vie
6630: 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ws,.**         f
6640: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
6650: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
6660: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
6670: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
6680: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
6690: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
66a0: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
66b0: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
66c0: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
66d0: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
66e0: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
66f0: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
6700: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
6710: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
6720: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
6730: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
6740: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
6750: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
6760: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
6770: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
6780: 32 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  2)  Add terms to
6790: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
67a0: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
67b0: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
67c0: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
67d0: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
67e0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
67f0: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
6800: 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e  .**    (3)  Scan
6810: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
6820: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
6830: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
6840: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
6850: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
6860: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
6870: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
6880: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
6890: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
68a0: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
68b0: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
68c0: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
68d0: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
68e0: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
68f0: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
6900: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
6910: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
6920: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
6930: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
6940: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
6950: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
6960: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
6970: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
6980: 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  nt fillInColumnL
6990: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
69a0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
69b0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63   int i, j, k, rc
69c0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
69d0: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
69e0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62  t *pEList;.  Tab
69f0: 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28  le *pTab;..  if(
6a00: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
6a10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6a20: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
6a30: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
6a40: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
6a50: 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
6a60: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
6a70: 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  le list..  */.  
6a80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
6a90: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
6aa0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
6ab0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a  t->a[i].pTab ){.
6ac0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f        /* This ro
6ad0: 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
6ae0: 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74  fore!  No need t
6af0: 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20  o continue */.  
6b00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6b10: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
6b20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
6b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6b40: 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
6b50: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
6b60: 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
6b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
6b80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6b90: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
6ba0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
6bb0: 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20  ].zAlias==0 ){. 
6bc0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b         char zFak
6bd0: 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20  eName[60];.     
6be0: 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65     sprintf(zFake
6bf0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75  Name, "sqlite_su
6c00: 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20  bquery_%p_",.   
6c10: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
6c20: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6c30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
6c40: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
6c50: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e  &pTabList->a[i].
6c60: 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d  zAlias, zFakeNam
6c70: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6c80: 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61       pTabList->a
6c90: 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20  [i].pTab = pTab 
6ca0: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
6cb0: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
6cc0: 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ct(pParse, pTabL
6cd0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
6ce0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69            pTabLi
6d10: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6d20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
6d30: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
6d40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6d50: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
6d60: 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20  sTransient flag 
6d70: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
6d80: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
6d90: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
6da0: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
6db0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
6dc0: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
6dd0: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
6de0: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
6df0: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
6e00: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
6e10: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
6e20: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
6e30: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
6e40: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
6e50: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
6e60: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
6e70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6e80: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
6e90: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
6ea0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
6eb0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
6ec0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6ed0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
6ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 4c 6f 63         sqliteLoc
6ef0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
6f00: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6f10: 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61  Name,pTabList->a
6f20: 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
6f30: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
6f40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
6f50: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6f60: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
6f70: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
6f80: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
6f90: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
6fa0: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
6fb0: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
6fc0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 56 69      if( sqliteVi
6fd0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
6fe0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
6ff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
7000: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
7010: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54          /* If pT
7020: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
7030: 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73  lect!=0 it means
7040: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
7050: 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a  with a.        *
7060: 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20  * view within a 
7070: 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43  view.  The SELEC
7080: 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  T structure has 
7090: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
70a0: 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62       ** copied b
70b0: 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77  y the outer view
70c0: 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20   so we can skip 
70d0: 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65  the copy step he
70e0: 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  re.        ** in
70f0: 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e   the inner view.
7100: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
7110: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
7120: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[i].pSelect==
7130: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
7140: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
7150: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65  elect = sqliteSe
7160: 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53  lectDup(pTab->pS
7170: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7180: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7190: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
71a0: 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
71b0: 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
71c0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
71d0: 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
71e0: 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  ( sqliteProcessJ
71f0: 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
7200: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a   return 1;..  /*
7210: 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
7220: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
7230: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
7240: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
7250: 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
7260: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
7270: 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
7280: 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
7290: 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
72a0: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
72b0: 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
72c0: 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
72d0: 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
72e0: 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
72f0: 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
7300: 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
7310: 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
7320: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
7330: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
7340: 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
7350: 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
7360: 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
7370: 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
7380: 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
7390: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
73a0: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
73b0: 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
73c0: 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
73d0: 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
73e0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
73f0: 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
7400: 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
7410: 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
7420: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
7430: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
7440: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
7450: 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
7460: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
7470: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
7480: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  ak;.    if( pE->
7490: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
74a0: 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e  ->pRight && pE->
74b0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
74c0: 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  LL.         && p
74d0: 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e  E->pLeft && pE->
74e0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
74f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
7500: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c  rc = 0;.  if( k<
7510: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
7520: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
7530: 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
7540: 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
7550: 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
7560: 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
7570: 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
7580: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
7590: 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
75a0: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
75b0: 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
75c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
75d0: 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
75e0: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
75f0: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
7600: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
7610: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
7620: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
7630: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
7640: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
7650: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
7660: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
7670: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
7680: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
7690: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
76a0: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
76b0: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
76c0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
76d0: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
76e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
76f0: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
7700: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
7710: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
7720: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7730: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
7740: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7750: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
7760: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   0);.        pNe
7770: 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
7780: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
7790: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
77a0: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
77b0: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
77c0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
77d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
77e0: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
77f0: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
7800: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
7810: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
7820: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
7830: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
7840: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
7850: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
7860: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
7870: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
7880: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
7890: 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
78a0: 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
78b0: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
78c0: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
78d0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
78e0: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69     zTName = sqli
78f0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
7900: 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d  oken(&pE->pLeft-
7910: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
7920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7930: 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20    zTName = 0;.  
7940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7950: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
7960: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
7970: 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
7980: 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73   *pTab = pTabLis
7990: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20  t->a[i].pTab;.  
79a0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
79b0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69 73  abName = pTabLis
79c0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[i].zAlias;.
79d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
79e0: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
79f0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
7a10: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
7a20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
7a30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
7a40: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
7a50: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
7a60: 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  [0]==0 || .     
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7a80: 74 65 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  teStrICmp(zTName
7a90: 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20  , zTabName)!=0) 
7aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
7ab0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7ac0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
7ad0: 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ableSeen = 1;.  
7ae0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7af0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
7b00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
7b10: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70   Expr *pExpr, *p
7b20: 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20  Left, *pRight;. 
7b30: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
7b40: 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
7b50: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  Col[j].zName;.. 
7b60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
7b70: 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d  >0 && (pTabList-
7b80: 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
7b90: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
7ba0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
7bb0: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
7bc0: 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  (pTabList->a[i-1
7bd0: 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ].pTab, zName)>=
7be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7bf0: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
7c00: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
7c10: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
7c20: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
7c30: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
7c40: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7c60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7c80: 20 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c    if( i>0 && sql
7c90: 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 70  iteIdListIndex(p
7ca0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7cb0: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
7cc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7cd0: 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
7ce0: 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
7cf0: 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
7d00: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
7d10: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
7d20: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
7d30: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
7d40: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
7d50: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7d60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7d70: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
7d80: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
7d90: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
7da0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
7db0: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
7dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7dd0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  ght->token.z = z
7de0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7df0: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7e00: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
7e10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
7e20: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  Right->token.dyn
7e30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7e40: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26    if( zTabName &
7e50: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
7e60: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
7e70: 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
7e80: 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  teExpr(TK_ID, 0,
7e90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
7ea0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
7eb0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c  liteExpr(TK_DOT,
7ec0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
7ed0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7ee0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
7ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7f00: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
7f10: 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b  en.z = zTabName;
7f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7f30: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Left->token.n = 
7f40: 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29  strlen(zTabName)
7f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7f60: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pLeft->token.dyn
7f70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7f80: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
7f90: 69 6e 67 28 28 63 68 61 72 2a 2a 29 26 70 45 78  ing((char**)&pEx
7fa0: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a 54 61 62  pr->span.z, zTab
7fb0: 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e 61 6d 65  Name, ".", zName
7fc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7fd0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
7fe0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 45 78 70 72  n = strlen(pExpr
7ff0: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20  ->span.z);.     
8000: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8010: 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  span.dyn = 1;.  
8020: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8030: 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a  r->token.z = 0;.
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8050: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30  xpr->token.n = 0
8060: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8070: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pExpr->token.dyn
8080: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
8090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
80a0: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
80b0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
80c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
80d0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b   = pExpr->token;
80e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
80f0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
8100: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
8110: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78  Append(pNew, pEx
8120: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
8130: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8140: 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
8150: 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
8160: 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
8170: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8180: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
8190: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
81a0: 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
81b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
81c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
81d0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
81e0: 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
81f0: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
8200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8210: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
8220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
8230: 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b  iteFree(zTName);
8240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8250: 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73     sqliteExprLis
8260: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
8270: 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
8280: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74   pNew;.  }.  ret
8290: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
82a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
82b0: 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b  cursively unlink
82c0: 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  s the Select.pSr
82d0: 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74  c.a[].pTab point
82e0: 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65  ers.** in a sele
82f0: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ct structure.  I
8300: 74 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  t just sets the 
8310: 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c  pointers to NULL
8320: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
8330: 6e 65 20 69 73 20 72 65 63 75 72 73 69 76 65 20  ne is recursive 
8340: 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61  in the sense tha
8350: 74 20 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e  t if the Select.
8360: 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74  pSrc.a[].pSelect
8370: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  .** pointer is n
8380: 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f  ot NULL, this ro
8390: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
83a0: 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
83b0: 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  hat pointer..**.
83c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
83d0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
83e0: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
83f0: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
8400: 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65  .** VIEW in orde
8410: 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69  r to undo any bi
8420: 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73  ndings to tables
8430: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
8440: 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20  sary.** because 
8450: 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67  those tables mig
8460: 68 74 20 62 65 20 44 52 4f 50 65 64 20 62 79 20  ht be DROPed by 
8470: 61 20 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c  a subsequent SQL
8480: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20   command..** If 
8490: 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65  the bindings are
84a0: 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68   not removed, th
84b0: 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  en the Select.pS
84c0: 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  rc->a[].pTab fie
84d0: 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65  ld.** will be le
84e0: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ft pointing to a
84f0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62   deallocated Tab
8500: 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 66 74  le structure aft
8510: 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61  er the.** DROP a
8520: 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69  nd a coredump wi
8530: 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78  ll occur the nex
8540: 74 20 74 69 6d 65 20 74 68 65 20 56 49 45 57 20  t time the VIEW 
8550: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  is used..*/.void
8560: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62   sqliteSelectUnb
8570: 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ind(Select *p){.
8580: 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
8590: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
85a0: 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  rc;.  Table *pTa
85b0: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
85c0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
85d0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
85e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28   i++){.    if( (
85f0: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69  pTab = pSrc->a[i
8600: 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20  ].pTab)!=0 ){.  
8610: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
8620: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
8630: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
8640: 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b  eTable(0, pTab);
8650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
8660: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  Src->a[i].pTab =
8670: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   0;.      if( pS
8680: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
8690: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
86a0: 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  teSelectUnbind(p
86b0: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
86c0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
86d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
86e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f  his routine asso
86f0: 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69  ciates entries i
8700: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78  n an ORDER BY ex
8710: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69  pression list wi
8720: 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  th.** columns in
8730: 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20   a result.  For 
8740: 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78  each ORDER BY ex
8750: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70  pression, the op
8760: 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  code of.** the t
8770: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
8780: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
8790: 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43  OLUMN and the iC
87a0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a  olumn value of.*
87b0: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
87c0: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69  node is filled i
87d0: 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75  n with column nu
87e0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61  mber and the iTa
87f0: 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ble.** value of 
8800: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
8810: 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  de is filled wit
8820: 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74  h iTable paramet
8830: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
8840: 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c  re are prior SEL
8850: 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65  ECT clauses, the
8860: 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  y are processed 
8870: 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a  first.  A match.
8880: 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72  ** in an earlier
8890: 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72   SELECT takes pr
88a0: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20  ecedence over a 
88b0: 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a  later SELECT..**
88c0: 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68  .** Any entry th
88d0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  at does not matc
88e0: 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20  h is flagged as 
88f0: 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e  an error.  The n
8900: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
8910: 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  rs is returned..
8920: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8930: 6e 65 20 64 6f 65 73 20 4e 4f 54 20 63 6f 72 72  ne does NOT corr
8940: 65 63 74 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  ectly initialize
8950: 20 74 68 65 20 45 78 70 72 2e 64 61 74 61 54 79   the Expr.dataTy
8960: 70 65 20 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20  pe  field.** of 
8970: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
8980: 72 65 73 73 69 6f 6e 73 2e 20 20 54 68 65 20 6d  ressions.  The m
8990: 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72  ultiSelectSortOr
89a0: 64 65 72 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  der() routine.**
89b0: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
89c0: 74 6f 20 64 6f 20 74 68 61 74 20 61 66 74 65 72  to do that after
89d0: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
89e0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
89f0: 73 0a 2a 2a 20 68 61 76 65 20 61 6c 6c 20 62 65  s.** have all be
8a00: 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 20 20 54 68  en analyzed.  Th
8a10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e  is routine is un
8a20: 61 62 6c 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  able to compute 
8a30: 45 78 70 72 2e 64 61 74 61 54 79 70 65 0a 2a 2a  Expr.dataType.**
8a40: 20 62 65 63 61 75 73 65 20 69 74 20 6d 75 73 74   because it must
8a50: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
8a60: 65 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  e the individual
8a70: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
8a80: 74 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  ts.** have been 
8a90: 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61  analyzed..*/.sta
8aa0: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
8ab0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
8ac0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8ad0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
8ae0: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
8af0: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
8b00: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
8b10: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
8b20: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
8b30: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
8b40: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
8b50: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
8b60: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
8b70: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
8b80: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
8b90: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8bb0: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
8bc0: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
8bd0: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
8be0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
8bf0: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
8c00: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
8c10: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
8c20: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
8c30: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
8c40: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
8c50: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
8c60: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
8c70: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
8c80: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
8c90: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8ca0: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
8cb0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
8cc0: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
8cd0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
8ce0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
8cf0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8d00: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  1;.  }.  if( pSe
8d10: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
8d20: 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64      if( matchOrd
8d30: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
8d40: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
8d50: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
8d60: 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
8d70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8d80: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
8d90: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
8da0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
8db0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
8dc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8dd0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
8de0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8df0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
8e00: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
8e10: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
8e20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8e30: 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
8e40: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
8e50: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
8e60: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
8e70: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
8e80: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
8e90: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
8ea0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
8eb0: 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75  position %d shou
8ec0: 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  ld be between 1 
8ed0: 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  and %d",.       
8ee0: 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d     iCol, pEList-
8ef0: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
8f00: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
8f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8f20: 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43        if( !mustC
8f30: 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e  omplete ) contin
8f40: 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d  ue;.      iCol--
8f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
8f60: 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a  j=0; iCol<0 && j
8f70: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8f80: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
8f90: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
8fa0: 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54  me && (pE->op==T
8fb0: 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d  K_ID || pE->op==
8fc0: 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20  TK_STRING) ){.  
8fd0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
8fe0: 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20  e, *zLabel;.    
8ff0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
9000: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
9010: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9020: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20  pE->token.z );. 
9030: 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20         zLabel = 
9040: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45  sqliteStrNDup(pE
9050: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74  ->token.z, pE->t
9060: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  oken.n);.       
9070: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
9080: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
9090: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
90a0: 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29  p(zName, zLabel)
90b0: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
90c0: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
90d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
90e0: 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29  liteFree(zLabel)
90f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9100: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71  if( iCol<0 && sq
9110: 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28  liteExprCompare(
9120: 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  pE, pEList->a[j]
9130: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
9140: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
9150: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9160: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
9170: 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f      pE->op = TK_
9180: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45  COLUMN;.      pE
9190: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
91a0: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62  ;.      pE->iTab
91b0: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
91c0: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
91d0: 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ].done = 1;.    
91e0: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  }.    if( iCol<0
91f0: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
9200: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9210: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9220: 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  .        "ORDER 
9230: 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25  BY term number %
9240: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
9250: 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
9260: 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  mn", i+1);.     
9270: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62   nErr++;.      b
9280: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9290: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
92a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
92b0: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
92c0: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
92d0: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
92e0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
92f0: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
9300: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9310: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
9320: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
9330: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
9340: 6c 69 74 65 47 65 74 56 64 62 65 28 50 61 72 73  liteGetVdbe(Pars
9350: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
9360: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9370: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
9380: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
9390: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
93a0: 69 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50  iteVdbeCreate(pP
93b0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
93c0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a   return v;.}../*
93d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
93e0: 20 73 65 74 73 20 74 68 65 20 45 78 70 72 2e 64   sets the Expr.d
93f0: 61 74 61 54 79 70 65 20 66 69 65 6c 64 20 6f 6e  ataType field on
9400: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66   all elements of
9410: 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79  .** the pOrderBy
9420: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9430: 2e 20 20 54 68 65 20 70 4f 72 64 65 72 42 79 20  .  The pOrderBy 
9440: 6c 69 73 74 20 77 69 6c 6c 20 68 61 76 65 20 62  list will have b
9450: 65 65 6e 0a 2a 2a 20 73 65 74 20 75 70 20 62 79  een.** set up by
9460: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
9470: 6f 6c 75 6d 6e 28 29 2e 20 20 48 65 6e 63 65 20  olumn().  Hence 
9480: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
9490: 68 61 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55  has.** a TK_COLU
94a0: 4d 4e 20 61 73 20 69 74 73 20 72 6f 6f 74 20 6e  MN as its root n
94b0: 6f 64 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ode.  The Expr.i
94c0: 43 6f 6c 75 6d 6e 20 72 65 66 65 72 73 20 74 6f  Column refers to
94d0: 20 61 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e   a .** column in
94e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
94f0: 20 20 20 54 68 65 20 64 61 74 61 74 79 70 65 20     The datatype 
9500: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
9510: 5f 53 4f 5f 54 45 58 54 0a 2a 2a 20 69 66 20 74  _SO_TEXT.** if t
9520: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9530: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 20 61 6e 64   column in p and
9540: 20 65 76 65 72 79 20 53 45 4c 45 43 54 20 74 6f   every SELECT to
9550: 20 74 68 65 20 6c 65 66 74 20 6f 66 0a 2a 2a 20   the left of.** 
9560: 70 20 68 61 73 20 61 20 64 61 74 61 74 79 70 65  p has a datatype
9570: 20 6f 66 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45   of SQLITE_SO_TE
9580: 58 54 2e 20 20 49 66 20 74 68 65 20 63 6f 6f 72  XT.  If the coor
9590: 65 73 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  essponding colum
95a0: 6e 0a 2a 2a 20 69 6e 20 70 20 6f 72 20 61 6e 79  n.** in p or any
95b0: 20 6f 66 20 74 68 65 20 6c 65 66 74 20 53 45 4c   of the left SEL
95c0: 45 43 54 73 20 69 73 20 53 51 4c 49 54 45 5f 53  ECTs is SQLITE_S
95d0: 4f 5f 4e 55 4d 2c 20 74 68 65 6e 20 74 68 65 20  O_NUM, then the 
95e0: 64 61 74 61 74 79 70 65 0a 2a 2a 20 6f 66 20 74  datatype.** of t
95f0: 68 65 20 6f 72 64 65 72 2d 62 79 20 65 78 70 72  he order-by expr
9600: 65 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ession is set to
9610: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2e 0a   SQLITE_SO_NUM..
9620: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a  **.** Examples:.
9630: 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45  **.**     CREATE
9640: 20 54 41 42 4c 45 20 6f 6e 65 28 61 20 49 4e 54   TABLE one(a INT
9650: 45 47 45 52 2c 20 62 20 54 45 58 54 29 3b 0a 2a  EGER, b TEXT);.*
9660: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
9670: 4c 45 20 74 77 6f 28 63 20 56 41 52 43 48 41 52  LE two(c VARCHAR
9680: 28 35 29 2c 20 64 20 46 4c 4f 41 54 29 3b 0a 2a  (5), d FLOAT);.*
9690: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
96a0: 62 2c 20 62 20 46 52 4f 4d 20 6f 6e 65 20 55 4e  b, b FROM one UN
96b0: 49 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20 63 20  ION SELECT d, c 
96c0: 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42  FROM two ORDER B
96d0: 59 20 31 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20 54 68  Y 1, 2;.**.** Th
96e0: 65 20 70 72 69 6d 61 72 79 20 73 6f 72 74 20 6b  e primary sort k
96f0: 65 79 20 77 69 6c 6c 20 75 73 65 20 53 51 4c 49  ey will use SQLI
9700: 54 45 5f 53 4f 5f 4e 55 4d 20 62 65 63 61 75 73  TE_SO_NUM becaus
9710: 65 20 74 68 65 20 22 64 22 20 69 6e 0a 2a 2a 20  e the "d" in.** 
9720: 74 68 65 20 73 65 63 6f 6e 64 20 53 45 4c 45 43  the second SELEC
9730: 54 20 69 73 20 6e 75 6d 65 72 69 63 2e 20 20 54  T is numeric.  T
9740: 68 65 20 31 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  he 1st column of
9750: 20 74 68 65 20 66 69 72 73 74 20 53 45 4c 45 43   the first SELEC
9760: 54 0a 2a 2a 20 69 73 20 74 65 78 74 20 62 75 74  T.** is text but
9770: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
9780: 61 74 74 65 72 20 62 65 63 61 75 73 65 20 61 20  atter because a 
9790: 6e 75 6d 65 72 69 63 20 61 6c 77 61 79 73 20 6f  numeric always o
97a0: 76 65 72 72 69 64 65 73 0a 2a 2a 20 61 20 74 65  verrides.** a te
97b0: 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  xt..**.** The se
97c0: 63 6f 6e 64 61 72 79 20 6b 65 79 20 77 69 6c 6c  condary key will
97d0: 20 75 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   use the SQLITE_
97e0: 53 4f 5f 54 45 58 54 20 73 6f 72 74 20 6f 72 64  SO_TEXT sort ord
97f0: 65 72 20 62 65 63 61 75 73 65 0a 2a 2a 20 62 6f  er because.** bo
9800: 74 68 20 74 68 65 20 28 73 65 63 6f 6e 64 29 20  th the (second) 
9810: 22 62 22 20 69 6e 20 74 68 65 20 66 69 72 73 74  "b" in the first
9820: 20 53 45 4c 45 43 54 20 61 6e 64 20 74 68 65 20   SELECT and the 
9830: 22 63 22 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  "c" in the secon
9840: 64 0a 2a 2a 20 53 45 4c 45 43 54 20 68 61 76 65  d.** SELECT have
9850: 20 61 20 64 61 74 61 74 79 70 65 20 6f 66 20 74   a datatype of t
9860: 65 78 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ext..*/ .static 
9870: 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74  void multiSelect
9880: 53 6f 72 74 4f 72 64 65 72 28 53 65 6c 65 63 74  SortOrder(Select
9890: 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
98a0: 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74 20  OrderBy){.  int 
98b0: 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
98c0: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4f 72  EList;.  if( pOr
98d0: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
98e0: 6e 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  n;.  if( p==0 ){
98f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9900: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
9910: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72   i++){.      pOr
9920: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
9930: 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51  r->dataType = SQ
9940: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
9950: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
9960: 20 20 7d 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63    }.  multiSelec
9970: 74 53 6f 72 74 4f 72 64 65 72 28 70 2d 3e 70 50  tSortOrder(p->pP
9980: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 29 3b  rior, pOrderBy);
9990: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
99a0: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
99b0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
99c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
99d0: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
99e0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
99f0: 20 20 20 20 69 66 28 20 70 45 2d 3e 64 61 74 61      if( pE->data
9a00: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  Type==SQLITE_SO_
9a10: 4e 55 4d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NUM ) continue;.
9a20: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
9a30: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20  iColumn>=0 );.  
9a40: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
9a50: 78 70 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20  xpr>pE->iColumn 
9a60: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 64 61 74  ){.      pE->dat
9a70: 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65 45 78  aType = sqliteEx
9a80: 70 72 54 79 70 65 28 70 45 4c 69 73 74 2d 3e 61  prType(pEList->a
9a90: 5b 70 45 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  [pE->iColumn].pE
9aa0: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
9ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
9ac0: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
9ad0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
9ae0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
9af0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69  ed on the.** nLi
9b00: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20  mit and nOffset 
9b10: 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20  fields.  nLimit 
9b20: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
9b30: 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a   the integers.**
9b40: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
9b50: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
9b60: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
9b70: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
9b80: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
9b90: 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64  s.  Or that hold
9ba0: 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f   -1 and 0 if tho
9bb0: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
9bc0: 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d  omitted..** iLim
9bd0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
9be0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
9bf0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
9c00: 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f  umbers for.** co
9c10: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
9c20: 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
9c30: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
9c40: 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   there is no.** 
9c50: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
9c60: 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74  set, then iLimit
9c70: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
9c80: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
9c90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
9ca0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
9cb0: 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   if iLimit and i
9cc0: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
9cd0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
9ce0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
9cf0: 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  y nLimit and nOf
9d00: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
9d10: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
9d20: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
9d30: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
9d40: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
9d50: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
9d60: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
9d70: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
9d80: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
9d90: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d  .** Only if nLim
9da0: 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74  it>=0 or nOffset
9db0: 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  >0 do the limit 
9dc0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
9dd0: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
9de0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
9df0: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
9e00: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
9e10: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
9e20: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
9e30: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
9e40: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
9e50: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
9e60: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
9e70: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
9e80: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
9e90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
9ea0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a  lect *p){.  /* .
9eb0: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70    ** If the comp
9ec0: 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69  arison is p->nLi
9ed0: 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49  mit>0 then "LIMI
9ee0: 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20  T 0" shows.  ** 
9ef0: 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73  all rows.  It is
9f00: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20   the same as no 
9f10: 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f  limit. If the co
9f20: 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a  mparision is.  *
9f30: 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74  * p->nLimit>=0 t
9f40: 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68  hen "LIMIT 0" sh
9f50: 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c  ow no rows at al
9f60: 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  l..  ** "LIMIT -
9f70: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
9f80: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
9f90: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
9fa0: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
9fb0: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
9fc0: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
9fd0: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
9fe0: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
9ff0: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
a000: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
a010: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
a020: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
a030: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
a040: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
a050: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
a060: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
a070: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a080: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
a090: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
a0a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a0b0: 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69  Integer, -p->nLi
a0c0: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mit, 0);.    sql
a0d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a0e0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
a0f0: 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4c  m, 1);.    p->iL
a100: 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d  imit = iMem;.  }
a110: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65  .  if( p->nOffse
a120: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  t>0 ){.    int i
a130: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
a140: 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a  em++;.    Vdbe *
a150: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
a160: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
a170: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
a190: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
a1a0: 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74  ger, -p->nOffset
a1b0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a1c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a1d0: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
a1e0: 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73  1);.    p->iOffs
a1f0: 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d  et = iMem;.  }.}
a200: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
a210: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a220: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
a230: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
a240: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
a250: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
a260: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
a270: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
a280: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
a290: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
a2a0: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
a2b0: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
a2c0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
a2d0: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
a2e0: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
a2f0: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
a300: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
a310: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
a320: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a330: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
a340: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
a350: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
a360: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
a370: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
a380: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
a390: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
a3a0: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
a3b0: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
a3c0: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
a3d0: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
a3e0: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
a3f0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
a400: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
a410: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
a420: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
a430: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
a440: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
a450: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
a460: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
a470: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
a480: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
a490: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
a4a0: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
a4b0: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
a4c0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
a4e0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
a4f0: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
a500: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
a510: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
a520: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
a530: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
a540: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
a550: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a560: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
a570: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
a580: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
a590: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
a5a0: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
a5b0: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
a5c0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
a5d0: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
a5e0: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
a5f0: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
a600: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
a610: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
a620: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
a630: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
a640: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
a650: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
a660: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
a670: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
a680: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
a690: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a6b0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
a6c0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
a6d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
a6e0: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
a6f0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
a700: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
a710: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
a730: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
a740: 69 73 20 56 44 42 45 20 2a 2f 0a 0a 20 20 2f 2a  is VDBE */..  /*
a750: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
a760: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
a770: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
a780: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
a790: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
a7a0: 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69 6e 20   last SELECT in 
a7b0: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
a7c0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
a7d0: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
a7e0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
a7f0: 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
a800: 72 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d  rn 1;.  pPrior =
a810: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66   p->pPrior;.  if
a820: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
a830: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
a840: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a850: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
a860: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
a870: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
a880: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
a890: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
a8a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
a8b0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 6e  .  if( pPrior->n
a8c0: 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20 70 50 72 69  Limit>=0 || pPri
a8d0: 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b  or->nOffset>0 ){
a8e0: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
a8f0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
a900: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
a910: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
a920: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
a930: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
a940: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75 72  >op));.    retur
a950: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  n 1;.  }..  /* M
a960: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
a970: 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65   a valid query e
a980: 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20  ngine.  If not, 
a990: 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
a9a0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
a9b0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
a9c0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
a9d0: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a   return 1;..  /*
a9e0: 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
a9f0: 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
aa00: 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
aa10: 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
aa20: 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
aa30: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
aa40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
aa50: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
aa60: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74  m, 0);.    eDest
aa70: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
aa80: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
aa90: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
aaa0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
aab0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
aac0: 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
aad0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
aae0: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
aaf0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
ab00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
ab10: 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20  Prior->nLimit = 
ab20: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->nLimit;.     
ab30: 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73     pPrior->nOffs
ab40: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
ab50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ab60: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
ab70: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
ab80: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
ab90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
aba0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
abb0: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
abc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
abd0: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
abe0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
abf0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
ac00: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
ac10: 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69          p->nLimi
ac20: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
ac30: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
ac40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ac50: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
ac60: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
ac70: 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  m, 0, 0, 0);.   
ac80: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
ac90: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
aca0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
acb0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65   rc;.        bre
acc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
acd0: 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41    /* For UNION A
ace0: 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  LL ... ORDER BY 
acf0: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
ad00: 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f  the next case */
ad10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ad20: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
ad30: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
ad40: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
ad50: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
ad60: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
ad70: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
ad80: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
ad90: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20  .      int op;  
ada0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
adb0: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
adc0: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
add0: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
ade0: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
adf0: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
ae00: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
ae10: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
ae20: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   */.      int nL
ae30: 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f  imit, nOffset; /
ae40: 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
ae50: 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20  f p->nLimit and 
ae60: 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->nOffset */.  
ae70: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
ae80: 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20  rderBy;  /* The 
ae90: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
aea0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 53 45  for the right SE
aeb0: 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70  LECT */..      p
aec0: 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d  riorOp = p->op==
aed0: 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62  TK_ALL ? SRT_Tab
aee0: 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  le : SRT_Union;.
aef0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
af00: 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70  =priorOp && p->p
af10: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d  OrderBy==0 && p-
af20: 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e  >nLimit<0 && p->
af30: 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  nOffset==0 ){.  
af40: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
af50: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
af60: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
af70: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
af80: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
af90: 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
afa0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
afb0: 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20  ab = iParm;.    
afc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
afd0: 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
afe0: 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
aff0: 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
b000: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
b010: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
b020: 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
b030: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b040: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
b050: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
b060: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
b070: 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26  derBy .        &
b080: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
b090: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
b0a0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75  , p->pOrderBy, u
b0b0: 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20  nionTab, 1) ){. 
b0c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b0d0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
b0e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d       if( p->op!=
b0f0: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
b100: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b110: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
b120: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  mp, unionTab, 1)
b130: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b140: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b150: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69  P_KeyAsData, uni
b160: 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20  onTab, 1);.     
b170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b180: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b190: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
b1a0: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  mp, unionTab, 0)
b1b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b1c0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
b1d0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
b1e0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
b1f0: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
b200: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
b210: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
b220: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
b230: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
b240: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
b250: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
b260: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
b270: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
b280: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
b290: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
b2a0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
b2b0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
b2c0: 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65  :  op = SRT_Exce
b2d0: 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  pt;   break;.   
b2e0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e        case TK_UN
b2f0: 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f  ION:   op = SRT_
b300: 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b  Union;    break;
b310: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
b320: 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20  K_ALL:     op = 
b330: 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72  SRT_Table;    br
b340: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b350: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
b360: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
b370: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
b380: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
b390: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69  y = 0;.      nLi
b3a0: 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b  mit = p->nLimit;
b3b0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
b3c0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66   = -1;.      nOf
b3d0: 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65  fset = p->nOffse
b3e0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66  t;.      p->nOff
b3f0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
b400: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
b410: 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20  (pParse, p, op, 
b420: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
b430: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
b440: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
b450: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
b460: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
b470: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
b480: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
b490: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
b4a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
b4b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
b4c0: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
b4d0: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
b4e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
b4f0: 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
b500: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
b510: 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
b520: 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
b530: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
b540: 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20   eDest!=priorOp 
b550: 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61  || unionTab!=iPa
b560: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
b570: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
b580: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
b590: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
b5a0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
b5b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
b5c0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
b5d0: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
b5e0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
b5f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
b600: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
b610: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
b620: 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e  se, p->pSrc, p->
b630: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
b640: 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
b650: 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  k = sqliteVdbeMa
b660: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
b670: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
b680: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
b690: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
b6a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b6b0: 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
b6c0: 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
b6d0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
b6e0: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
b6f0: 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69  e, p);.        i
b700: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64  Start = sqliteVd
b710: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b720: 3b 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 53  ;.        multiS
b730: 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70  electSortOrder(p
b740: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
b750: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c          rc = sel
b760: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
b770: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
b780: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
b790: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
b7c0: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
b7d0: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
b800: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
b810: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b820: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
b830: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
b840: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
b850: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b860: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
b870: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
b880: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
b890: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b8a0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
b8b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
b8c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
b8d0: 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
b8e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
b8f0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
b900: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
b910: 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70  SortTail(p, v, p
b920: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
b930: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
b940: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b950: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b960: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b970: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20  _INTERSECT: {.  
b980: 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
b990: 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
b9a0: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
b9b0: 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  art;.      int n
b9c0: 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a  Limit, nOffset;.
b9d0: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
b9e0: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
b9f0: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
ba00: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
ba10: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
ba20: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
ba30: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
ba40: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
ba50: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
ba60: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
ba70: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
ba80: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
ba90: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
baa0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
bab0: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
bac0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
bad0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
bae0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
baf0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70  olumn(pParse,p,p
bb00: 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  ->pOrderBy,tab1,
bb10: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  1) ){.        re
bb20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
bb30: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
bb40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
bb50: 54 65 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a  Temp, tab1, 1);.
bb60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
bb70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
bb80: 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b  sData, tab1, 1);
bb90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
bba0: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
bbb0: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
bbc0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
bbd0: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
bbe0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
bbf0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
bc00: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
bc10: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b   tab1, 0, 0, 0);
bc20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
bc30: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
bc40: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
bc50: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
bc60: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
bc70: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
bc80: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  /.      sqliteVd
bc90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
bca0: 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29  enTemp, tab2, 1)
bcb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
bcc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
bcd0: 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31  yAsData, tab2, 1
bce0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
bcf0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c  or = 0;.      nL
bd00: 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74  imit = p->nLimit
bd10: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  ;.      p->nLimi
bd20: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f  t = -1;.      nO
bd30: 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73  ffset = p->nOffs
bd40: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66  et;.      p->nOf
bd50: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
bd60: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
bd70: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
bd80: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
bd90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
bda0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
bdb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  ;.      p->nLimi
bdc0: 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  t = nLimit;.    
bdd0: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e    p->nOffset = n
bde0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
bdf0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
be00: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
be10: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
be20: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
be30: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
be40: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
be50: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
be60: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
be70: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
be80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
be90: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
bea0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
beb0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
bec0: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
bed0: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
bee0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
bef0: 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d  rse, p->pSrc, p-
bf00: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
bf10: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
bf20: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
bf30: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
bf40: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
bf50: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
bf60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
bf70: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
bf80: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
bf90: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
bfa0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
bfb0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
bfc0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
bfd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
bfe0: 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30 29  ullKey, tab1, 0)
bff0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
c000: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
c010: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
c020: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 6d 75 6c 74  ont);.      mult
c030: 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72  iSelectSortOrder
c040: 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  (p, p->pOrderBy)
c050: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
c060: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
c070: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
c080: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
c090: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
c0c0: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
c0d0: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
c100: 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ak);.      if( r
c110: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
c120: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
c130: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
c140: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
c150: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c160: 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
c170: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
c180: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
c190: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
c1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
c1b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
c1c0: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
c1d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c1e0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
c1f0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
c200: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
c210: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  ){.        gener
c220: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76  ateSortTail(p, v
c230: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
c240: 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
c250: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c270: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
c280: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
c290: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
c2a0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
c2b0: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
c2c0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
c2d0: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
c2e0: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
c2f0: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
c300: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
c310: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
c320: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
c330: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
c340: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
c350: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
c360: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
c370: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c380: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
c390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
c3a0: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
c3b0: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
c3c0: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
c3d0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
c3e0: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
c3f0: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
c400: 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
c410: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
c420: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
c430: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
c440: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
c450: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c460: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
c470: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
c480: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
c490: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
c4a0: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
c4b0: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
c4c0: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
c4d0: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
c4e0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
c4f0: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
c500: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
c510: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
c520: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
c530: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
c540: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
c550: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
c560: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
c570: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
c580: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
c590: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
c5a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
c5b0: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
c5c0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
c5d0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
c5e0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
c5f0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
c600: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
c610: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
c620: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
c630: 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72  d substExpr(Expr
c640: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61   *pExpr, int iTa
c650: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
c660: 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45  EList){.  if( pE
c670: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
c680: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
c690: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
c6a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
c6b0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
c6c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
c6d0: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
c6e0: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
c6f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c700: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
c710: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
c720: 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
c730: 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
c740: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
c750: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
c760: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
c770: 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
c780: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
c790: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69       pNew = pELi
c7a0: 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
c7b0: 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
c7c0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
c7d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
c7e0: 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
c7f0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64  ;.      pExpr->d
c800: 61 74 61 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e  ataType = pNew->
c810: 64 61 74 61 54 79 70 65 3b 0a 20 20 20 20 20 20  dataType;.      
c820: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
c830: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
c840: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
c850: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 4e  sqliteExprDup(pN
c860: 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
c870: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
c880: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
c890: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
c8a0: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  t = sqliteExprDu
c8b0: 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  p(pNew->pRight);
c8c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c8d0: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
c8e0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
c8f0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70  List = sqliteExp
c900: 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70  rListDup(pNew->p
c910: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78  List);.      pEx
c920: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
c930: 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  w->iTable;.     
c940: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
c950: 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
c960: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
c970: 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b  gg = pNew->iAgg;
c980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 54 6f 6b  .      sqliteTok
c990: 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74  enCopy(&pExpr->t
c9a0: 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b  oken, &pNew->tok
c9b0: 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
c9c0: 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  eTokenCopy(&pExp
c9d0: 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
c9e0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  span);.    }.  }
c9f0: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
ca00: 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
ca10: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ca20: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
ca30: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
ca40: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ca50: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
ca60: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
ca70: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ca80: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ca90: 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69  oid .substExprLi
caa0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
cab0: 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  st, int iTable, 
cac0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
cad0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
cae0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
caf0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
cb00: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
cb10: 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45  i++){.    substE
cb20: 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
cb30: 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
cb40: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  EList);.  }.}../
cb50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cb60: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
cb70: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
cb80: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
cb90: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
cba0: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
cbb0: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
cbc0: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
cbd0: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
cbe0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
cbf0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
cc00: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
cc10: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
cc20: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
cc30: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
cc40: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
cc50: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
cc60: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
cc70: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
cc80: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
cc90: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
cca0: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
ccb0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
ccc0: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
ccd0: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
cce0: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
ccf0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
cd00: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
cd10: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
cd20: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
cd30: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
cd40: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
cd50: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
cd60: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
cd70: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
cd80: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
cd90: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
cda0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
cdb0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cdc0: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
cdd0: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
cde0: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
cdf0: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
ce00: 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
ce10: 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
ce20: 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
ce30: 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
ce40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ce50: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
ce60: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
ce70: 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
ce80: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
ce90: 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
cea0: 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
ceb0: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
cec0: 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
ced0: 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
cee0: 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
cef0: 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
cf00: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
cf10: 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
cf20: 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
cf30: 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
cf40: 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
cf50: 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
cf60: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
cf70: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
cf80: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
cf90: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
cfa0: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
cfb0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
cfc0: 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
cfd0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
cfe0: 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
cff0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
d000: 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
d010: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
d020: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
d030: 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
d040: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
d050: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
d060: 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
d070: 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
d080: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
d090: 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
d0a0: 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
d0b0: 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
d0c0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
d0d0: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
d0e0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d0f0: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
d100: 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
d110: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
d120: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
d130: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
d140: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
d150: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
d160: 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
d170: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
d180: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
d190: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
d1a0: 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
d1b0: 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
d1c0: 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
d1d0: 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
d1e0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
d1f0: 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
d200: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
d210: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
d220: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
d230: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
d240: 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
d250: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
d260: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
d270: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
d280: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
d290: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
d2a0: 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
d2b0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
d2c0: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
d2d0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
d2e0: 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
d2f0: 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
d300: 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
d310: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
d320: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
d330: 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
d340: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
d350: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
d360: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
d370: 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
d380: 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
d390: 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
d3a0: 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
d3b0: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
d3c0: 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
d3d0: 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
d3e0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
d3f0: 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
d400: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
d410: 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
d420: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
d430: 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
d440: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
d450: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
d460: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
d470: 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
d480: 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
d490: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
d4a0: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
d4b0: 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
d4c0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
d4d0: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
d4e0: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
d4f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
d500: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
d510: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
d520: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
d530: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
d540: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
d550: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
d560: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
d570: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
d580: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
d590: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
d5a0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
d5b0: 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
d5c0: 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
d5d0: 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
d5e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
d5f0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
d600: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
d610: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
d620: 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
d630: 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
d640: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
d650: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
d660: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
d670: 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
d680: 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
d690: 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
d6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d6b0: 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
d6c0: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
d6d0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
d6e0: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
d6f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
d700: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
d710: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
d720: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
d730: 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
d740: 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
d750: 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
d760: 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
d770: 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
d780: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
d790: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d7a0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d7b0: 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
d7c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
d7d0: 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
d7e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d7f0: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
d800: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
d810: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
d820: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
d830: 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
d840: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
d850: 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
d860: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
d870: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
d880: 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68  pWhere;..  /* Ch
d890: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
d8a0: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
d8b0: 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
d8c0: 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
d8d0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
d8e0: 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
d8f0: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
d900: 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
d910: 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
d920: 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20  >nSrc );.  pSub 
d930: 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  = pSrc->a[iFrom]
d940: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  .pSelect;.  asse
d950: 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
d960: 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
d970: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
d980: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75  turn 0;.  if( su
d990: 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
d9a0: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
d9b0: 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72  turn 0;.  pSubSr
d9c0: 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
d9d0: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
d9e0: 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53  c );.  if( pSubS
d9f0: 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
da00: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
da10: 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  Sub->isDistinct 
da20: 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  || pSub->nLimit>
da30: 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e  =0) &&  (pSrc->n
da40: 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
da50: 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
da60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  ;.  }.  if( (p->
da70: 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d  isDistinct || p-
da80: 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73  >nLimit>=0) && s
da90: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
daa0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
dab0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
dac0: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
dad0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52  eturn 0;..  /* R
dae0: 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
daf0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
db00: 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
db10: 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
db20: 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
db30: 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
db40: 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
db50: 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
db60: 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
db70: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
db80: 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
db90: 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
dba0: 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
dbb0: 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
dbc0: 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
dbd0: 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
dbe0: 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
dbf0: 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
dc00: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
dc10: 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
dc20: 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
dc30: 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
dc40: 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  thing..  */.  if
dc50: 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
dc60: 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20  1 && iFrom>0 && 
dc70: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
dc80: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
dc90: 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
dca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
dcb0: 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
dcc0: 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
dcd0: 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
dce0: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
dcf0: 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
dd00: 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
dd10: 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
dd20: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
dd30: 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
dd40: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
dd50: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
dd60: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
dd70: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
dd80: 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
dd90: 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
dda0: 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
ddb0: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
ddc0: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
ddd0: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
dde0: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
ddf0: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
de00: 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
de10: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
de20: 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
de30: 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
de40: 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
de50: 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
de60: 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
de70: 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
de80: 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
de90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72  ..  */.  if( iFr
dea0: 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
deb0: 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
dec0: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
ded0: 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62  0 .      && pSub
dee0: 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
def0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
df00: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
df10: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
df20: 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
df30: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
df40: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72  for the.  ** iFr
df50: 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
df60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
df70: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
df80: 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f  y..  */..  /* Mo
df90: 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
dfa0: 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
dfb0: 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
dfc0: 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
dfd0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
dfe0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
dff0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
e000: 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
e010: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
e020: 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
e030: 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
e040: 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
e050: 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
e060: 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
e070: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
e080: 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
e090: 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
e0a0: 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
e0b0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
e0c0: 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
e0d0: 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
e0e0: 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
e0f0: 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
e100: 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
e110: 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
e120: 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
e130: 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
e140: 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
e150: 20 69 50 61 72 65 6e 74 20 3d 20 70 53 72 63 2d   iParent = pSrc-
e160: 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  >a[iFrom].iCurso
e170: 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e  r;.  {.    int n
e180: 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
e190: 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->nSrc;.    int 
e1a0: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 72 63 2d  jointype = pSrc-
e1b0: 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
e1c0: 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  pe;..    if( pSr
e1d0: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
e1e0: 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f   && pSrc->a[iFro
e1f0: 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m].pTab->isTrans
e200: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
e210: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
e220: 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  0, pSrc->a[iFrom
e230: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
e240: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
e250: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61  rc->a[iFrom].zDa
e260: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
e270: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
e280: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iFrom].zName);. 
e290: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
e2a0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c  rc->a[iFrom].zAl
e2b0: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ias);.    if( nS
e2c0: 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
e2d0: 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
e2e0: 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
e2f0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53  for(i=1; i<nSubS
e300: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
e310: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 53    pSrc = sqliteS
e320: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72  rcListAppend(pSr
e330: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  c, 0, 0);.      
e340: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20  }.      p->pSrc 
e350: 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
e360: 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
e370: 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
e380: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
e390: 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
e3a0: 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
e3b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e3c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
e3d0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
e3e0: 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
e3f0: 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
e400: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
e410: 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
e420: 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
e430: 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
e440: 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
e450: 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f  om+nSubSrc-1].jo
e460: 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
e470: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  e;.  }..  /* Now
e480: 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
e490: 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
e4a0: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
e4b0: 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65  ons for .  ** re
e4c0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
e4d0: 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
e4e0: 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a  uter query..  **
e4f0: 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a   .  ** Example:.
e500: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
e510: 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
e520: 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
e530: 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
e540: 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
e550: 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20  ;.  **   \      
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
e570: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
e580: 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
e590: 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
e5a0: 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
e5b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
e5c0: 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
e5d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e5e0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20  _______/.  **.  
e5f0: 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
e600: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
e610: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
e620: 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
e630: 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61  e we see.  ** "a
e640: 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
e650: 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
e660: 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
e670: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
e680: 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75  y+10"..  */.  su
e690: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
e6a0: 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
e6b0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
e6c0: 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69   pList = p->pELi
e6d0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
e6e0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
e6f0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
e700: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  Expr;.    if( pL
e710: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
e720: 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70  =0 && (pExpr = p
e730: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
e740: 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a  )->span.z!=0 ){.
e750: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
e760: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
e770: 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73  StrNDup(pExpr->s
e780: 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70  pan.z, pExpr->sp
e790: 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  an.n);.    }.  }
e7a0: 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
e7b0: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
e7c0: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  t(p->pGroupBy, i
e7d0: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e7e0: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
e7f0: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
e800: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
e810: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
e820: 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
e830: 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
e840: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
e850: 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
e860: 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
e870: 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  rBy;.    pSub->p
e880: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
e890: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64  else if( p->pOrd
e8a0: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73  erBy ){.    subs
e8b0: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
e8c0: 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
e8d0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
e8e0: 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
e8f0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
e900: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
e910: 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
e920: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e930: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
e940: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
e950: 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
e960: 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
e970: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
e980: 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
e990: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
e9a0: 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
e9b0: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
e9c0: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
e9d0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
e9e0: 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 20  ( pSub->pHaving 
e9f0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ea00: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45  Having = sqliteE
ea10: 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61  xprDup(pSub->pHa
ea20: 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ving);.      if(
ea30: 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
ea40: 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e         p->pHavin
ea50: 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  g = sqliteExpr(T
ea60: 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e  K_AND, p->pHavin
ea70: 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a  g, pHaving, 0);.
ea80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ea90: 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20       p->pHaving 
eaa0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20  = pHaving;.     
eab0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
eac0: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
ead0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47  ==0 );.    p->pG
eae0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 45  roupBy = sqliteE
eaf0: 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d  xprListDup(pSub-
eb00: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
eb10: 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72  lse if( p->pWher
eb20: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  e==0 ){.    p->p
eb30: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
eb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
eb50: 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
eb60: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
eb70: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
eb80: 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( pWhere ){.    
eb90: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
eba0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c  liteExpr(TK_AND,
ebb0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65   p->pWhere, pWhe
ebc0: 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  re, 0);.    }.  
ebd0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  }..  /* The flat
ebe0: 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
ebf0: 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
ec00: 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
ec10: 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  he.  ** outer qu
ec20: 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
ec30: 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69   .  */.  p->isDi
ec40: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
ec50: 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e  stinct || pSub->
ec60: 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
ec70: 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c  * Transfer the l
ec80: 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
ec90: 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72  from the subquer
eca0: 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20  y to the outer. 
ecb0: 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   ** query..  */.
ecc0: 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d    if( pSub->nLim
ecd0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  it>=0 ){.    if(
ece0: 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a   p->nLimit<0 ){.
ecf0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
ed00: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a  = pSub->nLimit;.
ed10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
ed20: 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73  >nLimit+p->nOffs
ed30: 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  et > pSub->nLimi
ed40: 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  t+pSub->nOffset 
ed50: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  ){.      p->nLim
ed60: 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  it = pSub->nLimi
ed70: 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65  t + pSub->nOffse
ed80: 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t - p->nOffset;.
ed90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
eda0: 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e  Offset += pSub->
edb0: 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46  nOffset;..  /* F
edc0: 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
edd0: 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
ede0: 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
edf0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
ee00: 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
ee10: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
ee20: 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
ee30: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
ee40: 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
ee50: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
ee60: 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
ee70: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
ee80: 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
ee90: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
eea0: 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
eeb0: 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
eec0: 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
eed0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
eee0: 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
eef0: 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
ef00: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
ef10: 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
ef20: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
ef30: 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
ef40: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
ef50: 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
ef60: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
ef70: 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
ef80: 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
ef90: 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
efa0: 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
efb0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
efc0: 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
efd0: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
efe0: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
eff0: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
f000: 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
f010: 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
f020: 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
f030: 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
f040: 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
f050: 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
f060: 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
f070: 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
f080: 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
f090: 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
f0a0: 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
f0b0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
f0c0: 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
f0d0: 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
f0e0: 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
f0f0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
f100: 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
f110: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
f120: 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
f130: 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
f140: 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a  qliteSelect()..*
f150: 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  * See the header
f160: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74   comment on that
f170: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
f180: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
f190: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
f1a0: 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  nt simpleMinMaxQ
f1b0: 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
f1c0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
f1d0: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
f1e0: 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45  arm){.  Expr *pE
f1f0: 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  xpr;.  int iCol;
f200: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f210: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f220: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62   int base;.  Vdb
f230: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b  e *v;.  int seek
f240: 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a  Op;.  int cont;.
f250: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
f260: 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73  st, *pList, eLis
f270: 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
f280: 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49  List_item eListI
f290: 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  tem;.  SrcList *
f2a0: 70 53 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 43  pSrc;.  ..  /* C
f2b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
f2c0: 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73  his query is a s
f2d0: 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
f2e0: 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74  ax() query.  Ret
f2f0: 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66  urn.  ** zero if
f300: 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a   it is  not..  *
f310: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  /.  if( p->pGrou
f320: 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e  pBy || p->pHavin
f330: 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29  g || p->pWhere )
f340: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
f350: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  c = p->pSrc;.  i
f360: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
f370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
f380: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
f390: 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  t;.  if( pEList-
f3a0: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
f3b0: 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20  rn 0;.  pExpr = 
f3c0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
f3d0: 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
f3e0: 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
f3f0: 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
f400: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
f410: 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
f420: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74  List==0 || pList
f430: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
f440: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
f450: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29  pr->token.n!=3 )
f460: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f470: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
f480: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
f490: 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
f4a0: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
f4b0: 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
f4c0: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
f4d0: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
f4e0: 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
f4f0: 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
f500: 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
f510: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f520: 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    pExpr = pList-
f530: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
f540: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
f550: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
f560: 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
f570: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
f580: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
f590: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
f5a0: 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20  we get to here, 
f5b0: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65  it means the que
f5c0: 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ry is of the cor
f5d0: 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20  rect form..  ** 
f5e0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
f5f0: 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e  re we have an in
f600: 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64  dex and make pId
f610: 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  x point to the. 
f620: 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
f630: 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d  index.  If the m
f640: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
f650: 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50   on an INTEGER P
f660: 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20  RIMARY.  ** key 
f670: 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78  column, no index
f680: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
f690: 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c   set pIdx to NUL
f6a0: 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75  L.  If no.  ** u
f6b0: 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66  sable index is f
f6c0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ound, return 0..
f6d0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c    */.  if( iCol<
f6e0: 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20  0 ){.    pIdx = 
f6f0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
f700: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
f710: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f720: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
f730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
f740: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29  dx->nColumn>=1 )
f750: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
f760: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
f770: 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Col ) break;.   
f780: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d   }.    if( pIdx=
f790: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f7a0: 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66   }..  /* Identif
f7b0: 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69  y column types i
f7c0: 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
f7d0: 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  ng the callback.
f7e0: 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
f7f0: 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
f800: 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
f810: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72  ng to a table or
f820: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a   a memory cell..
f830: 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    ** The column 
f840: 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  names have alrea
f850: 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  dy been generate
f860: 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  d in the calling
f870: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
f880: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
f890: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
f8a0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
f8b0: 20 30 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d   0;.  if( eDest=
f8c0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
f8d0: 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
f8e0: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
f8f0: 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c   p->pSrc, p->pEL
f900: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
f910: 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
f920: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
f930: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
f940: 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
f950: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
f960: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
f970: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
f980: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
f990: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
f9a0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  0);.  }..  /* Ge
f9b0: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f  nerating code to
f9c0: 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72   find the min or
f9d0: 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63   the max.  Basic
f9e0: 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65  ally all we have
f9f0: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66  .  ** to do is f
fa00: 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72  ind the first or
fa10: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
fa20: 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e  in the chosen in
fa30: 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68  dex.  If.  ** th
fa40: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
fa50: 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47   is on the INTEG
fa60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
fa70: 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69  then find the fi
fa80: 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74  rst.  ** or last
fa90: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61   entry in the ma
faa0: 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  in table..  */. 
fab0: 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66   sqliteCodeVerif
fac0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
fad0: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61  pTab->iDb);.  ba
fae0: 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  se = pSrc->a[0].
faf0: 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75  iCursor;.  compu
fb00: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
fb10: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
fb20: 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
fb30: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
fb40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fb50: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
fb60: 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Tab->iDb, 0);.  
fb70: 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28    sqliteVdbeOp3(
fb80: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
fb90: 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  base, pTab->tnum
fba0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
fbb0: 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20  );.  }.  cont = 
fbc0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
fbd0: 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49  bel(v);.  if( pI
fbe0: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
fbf0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fc00: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
fc10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
fc20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fc30: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
fc40: 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  dx->iDb, 0);.   
fc50: 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76   sqliteVdbeOp3(v
fc60: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62  , OP_OpenRead, b
fc70: 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75  ase+1, pIdx->tnu
fc80: 6d 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  m, pIdx->zName, 
fc90: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
fca0: 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52  if( seekOp==OP_R
fcb0: 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  ewind ){.      s
fcc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fcd0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
fce0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
fcf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fd00: 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30 29 3b 0a  MakeKey, 1, 0);.
fd10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
fd20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 63 72  AddOp(v, OP_Incr
fd30: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
fd40: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f    seekOp = OP_Mo
fd50: 76 65 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  veTo;.    }.    
fd60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fd70: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b  v, seekOp, base+
fd80: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fd90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fda0: 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b  _IdxRecno, base+
fdb0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fdc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fdd0: 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20  _Close, base+1, 
fde0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
fdf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
fe00: 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veTo, base, 0);.
fe10: 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
fe20: 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
fe30: 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
fe40: 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
fe50: 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
fe60: 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
fe70: 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
fe80: 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
fe90: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
fea0: 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
feb0: 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
fec0: 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
fed0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  t);.  sqliteVdbe
fee0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
fef0: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56  cont);.  sqliteV
ff00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
ff10: 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  lose, base, 0);.
ff20: 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d    .  return 1;.}
ff30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ff40: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69   code for the gi
ff50: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
ff60: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
ff70: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
ff80: 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f  ributed in vario
ff90: 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e  us ways dependin
ffa0: 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75  g on the.** valu
ffb0: 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69  e of eDest and i
ffc0: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
ffd0: 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20  eDest Value     
ffe0: 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
fff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
10000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
10030 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20     SRT_Callback 
10040 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61     Invoke the ca
10050 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20  llback for each 
10060 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
10070 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
10080 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f  _Mem         Sto
10090 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  re first result 
100a0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  in memory cell i
100b0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
100c0 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
100d0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
100e0 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20  keys of a table 
100f0 77 69 74 68 20 63 75 72 73 6f 72 20 69 50 61 72  with cursor iPar
10100 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
10110 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
10120 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
10130 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
10140 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
10150 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
10160 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
10170 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
10180 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
10190 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
101a0 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
101b0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
101c0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
101d0 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
101e0 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73  e table above is
101f0 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64   incomplete.  Ad
10200 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76  ditional eDist v
10210 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64  alue have be add
10220 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73  ed.** since this
10230 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69   comment was wri
10240 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73  tten.  See the s
10250 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
10260 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a   function for.**
10270 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74   a complete list
10280 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77  ing of the allow
10290 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65  ed values of eDe
102a0 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61  st and their mea
102b0 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  nings..**.** Thi
102c0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
102d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
102e0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
102f0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
10300 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
10310 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
10320 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
10330 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
10340 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
10350 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
10360 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
10370 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
10380 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
10390 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
103a0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
103b0 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  o that..**.** Th
103c0 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  e pParent, paren
103d0 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65  tTab, and *pPare
103e0 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65  ntAgg fields are
103f0 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68   filled in if th
10400 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20  is.** SELECT is 
10410 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  a subquery.  Thi
10420 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72  s routine may tr
10430 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69  y to combine thi
10440 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  s SELECT.** with
10450 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66   its parent to f
10460 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  orm a single fla
10470 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20  t query.  In so 
10480 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a  doing, it might.
10490 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ** change the pa
104a0 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20  rent query from 
104b0 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
104c0 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  to an aggregate 
104d0 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68  query..** For th
104e0 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70  at reason, the p
104f0 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69  ParentAgg flag i
10500 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f  s passed as a po
10510 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20  inter, so it.** 
10520 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  can be changed..
10530 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
10540 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f     The meaning o
10550 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61  f the pParent pa
10560 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rameter..**.**  
10570 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
10580 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t1 JOIN (SELECT 
10590 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  x, count(*) FROM
105a0 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a   t2) JOIN t3;.**
105b0 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
105c0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
105d0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
105e0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a  ____/        /.*
105f0 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  *     \         
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
10630 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  *      \________
10640 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
10650 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
10660 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
10670 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10680 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
10690 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66  he outer query f
106a0 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74  irst.   For that
106b0 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e   call,.** pParen
106c0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20  t will be NULL. 
106d0 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63   During the proc
106e0 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75  essing of the ou
106f0 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20  ter query, this 
10700 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
10710 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
10720 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  y to handle the 
10730 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74  subquery.  For t
10740 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
10750 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69  call, pParent wi
10760 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
10770 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
10780 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65  cause the subque
10790 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63  ry is.** the sec
107a0 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61  ond element in a
107b0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c   three-way join,
107c0 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70   the parentTab p
107d0 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a  arameter will.**
107e0 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76   be 1 (the 2nd v
107f0 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65  alue of a 0-inde
10800 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69  xed array.).*/.i
10810 6e 74 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28  nt sqliteSelect(
10820 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10830 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
10840 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
10850 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10870 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10880 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
10890 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
108b0 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
108c0 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
108d0 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
108e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
108f0 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79  arameter used by
10900 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f   the eDest dispo
10910 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
10920 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c  Select *pParent,
10930 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
10940 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69  r SELECT for whi
10950 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62  ch this is a sub
10960 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  -query */.  int 
10970 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20  parentTab,      
10980 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
10990 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20  Parent->pSrc of 
109a0 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
109b0 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 20  int *pParentAgg 
109c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
109d0 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61  f pParent uses a
109e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
109f0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ns */.){.  int i
10a00 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
10a10 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76  WInfo;.  Vdbe *v
10a20 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20  ;.  int isAgg = 
10a30 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
10a40 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
10a50 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
10a60 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
10a70 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
10a80 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
10a90 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
10aa0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
10ab0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
10ac0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
10ad0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
10ae0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
10af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
10b00 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
10b10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
10b20 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
10b30 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
10b40 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
10b50 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
10b60 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
10b70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
10b80 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
10b90 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
10ba0 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
10bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
10bc0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
10bd0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
10be0 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
10bf0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
10c00 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
10c10 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
10c20 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
10c30 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
10c40 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
10c50 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
10c60 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
10c70 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
10c80 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
10c90 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
10ca0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  tion */..  if( s
10cb0 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
10cc0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
10cd0 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65  Err || p==0 ) re
10ce0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
10cf0 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
10d00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
10d10 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
10d20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
10d30 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
10d40 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
10d50 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
10d60 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
10d70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
10d80 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
10d90 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
10da0 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
10db0 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a  t, iParm);.  }..
10dc0 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20    /* Make local 
10dd0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
10de0 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69  rameters for thi
10df0 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  s query..  */.  
10e00 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
10e10 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  rc;.  pWhere = p
10e20 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64  ->pWhere;.  pOrd
10e30 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
10e40 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  By;.  pGroupBy =
10e50 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
10e60 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
10e70 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e  ving;.  isDistin
10e80 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
10e90 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  ct;..  /* Alloca
10ea0 74 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  te VDBE cursors 
10eb0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
10ec0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
10ed0 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 53  e.  */.  sqliteS
10ee0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
10ef0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
10f00 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  List);..  /* .  
10f10 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
10f20 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
10f30 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
10f40 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
10f50 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
10f60 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
10f70 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
10f80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10f90 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
10fa0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45  ect_end;..  /* E
10fb0 78 70 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65  xpand any "*" te
10fc0 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  rms in the resul
10fd0 74 20 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61  t set.  (For exa
10fe0 6d 70 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a  mple the "*" in.
10ff0 20 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46    ** "SELECT * F
11000 52 4f 4d 20 74 31 22 29 20 20 54 68 65 20 66 69  ROM t1")  The fi
11010 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29  llInColumnlist()
11020 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
11030 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68  es some.  ** oth
11040 65 72 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20  er housekeeping 
11050 2d 20 73 65 65 20 74 68 65 20 68 65 61 64 65 72  - see the header
11060 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74   comment for det
11070 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ails..  */.  if(
11080 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
11090 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  t(pParse, p) ){.
110a0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
110b0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72  end;.  }.  pWher
110c0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
110d0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
110e0 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
110f0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
11100 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
11110 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
11120 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
11130 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
11140 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
11150 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
11160 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73    */.  if( (eDes
11170 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
11180 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26  est==SRT_Set) &&
11190 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31   pEList->nExpr>1
111a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72   ){.    sqliteEr
111b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
111c0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
111d0 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
111e0 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
111f0 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
11200 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
11210 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  n");.    goto se
11220 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
11230 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20   /* ORDER BY is 
11240 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65  ignored for some
11250 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20   destinations.. 
11260 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44   */.  switch( eD
11270 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
11280 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63  SRT_Union:.    c
11290 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a  ase SRT_Except:.
112a0 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
112b0 63 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64  card:.      pOrd
112c0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
112d0 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
112e0 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt:.      break;
112f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
11300 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f  is point, we sho
11310 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74  uld have allocat
11320 65 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f  ed all the curso
11330 72 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  rs that we.  ** 
11340 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73  need to handle s
11350 75 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d  ubquerys and tem
11360 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
11370 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c  .  **.  ** Resol
11380 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ve the column na
11390 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d  mes and do a sem
113a0 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20  antics check on 
113b0 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
113c0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
113d0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
113e0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
113f0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
11400 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
11410 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45   pTabList, 0, pE
11420 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11430 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11440 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11450 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
11460 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
11470 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
11480 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29  Expr, 1, &isAgg)
11490 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
114a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
114b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72  .  }.  if( pWher
114c0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  e ){.    if( sql
114d0 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
114e0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
114f0 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65  st, pEList, pWhe
11500 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  re) ){.      got
11510 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11520 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
11530 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
11540 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  se, pWhere, 0, 0
11550 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11560 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11570 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76  }.  }.  if( pHav
11580 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ing ){.    if( p
11590 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
115a0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
115b0 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
115c0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
115d0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
115e0 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20   HAVING");.     
115f0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11610 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
11620 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
11630 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
11640 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20  Having) ){.     
11650 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11670 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
11680 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
11690 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20   1, &isAgg) ){. 
116a0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
116b0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
116c0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
116d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
116e0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
116f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
11700 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78  t iCol;.      Ex
11710 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
11720 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
11730 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11740 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
11750 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e   &iCol) && iCol>
11760 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73  0 && iCol<=pELis
11770 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11780 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
11790 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
117a0 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
117b0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
117c0 6c 69 74 65 45 78 70 72 44 75 70 28 70 45 4c 69  liteExprDup(pELi
117d0 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
117e0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
117f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
11800 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
11810 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
11820 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  EList, pE) ){.  
11830 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11840 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
11850 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11860 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
11870 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
11880 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
11890 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
118a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
118b0 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
118c0 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  t(pE) ){.       
118d0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
118e0 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
118f0 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
11900 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
11910 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
11920 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
11930 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74  Y terms must not
11940 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   be non-integer 
11950 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20  constants");.   
11960 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
11970 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
11980 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d  }else if( iCol<=
11990 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
119a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
119b0 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
119c0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
119d0 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
119e0 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   BY column numbe
119f0 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67  r %d out of rang
11a00 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65               "be
11a20 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
11a30 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
11a40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
11a50 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11a60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11a70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
11a80 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
11a90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11aa0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
11ab0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
11ac0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72  iCol;.      Expr
11ad0 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d   *pE = pGroupBy-
11ae0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
11af0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11b00 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
11b10 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20  iCol) && iCol>0 
11b20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d  && iCol<=pEList-
11b30 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
11b40 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
11b50 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
11b60 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61  pE = pGroupBy->a
11b70 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
11b80 74 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  teExprDup(pEList
11b90 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70  ->a[iCol-1].pExp
11ba0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11bb0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11bc0 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11bd0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
11be0 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
11bf0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11c00 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11c10 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11c20 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
11c30 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
11c40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11c50 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
11c60 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11c70 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  eExprIsConstant(
11c80 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pE) ){.        i
11c90 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  f( sqliteExprIsI
11ca0 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
11cb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11cc0 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
11cd0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
11ce0 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 74       "GROUP BY t
11cf0 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65  erms must not be
11d00 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e   non-integer con
11d10 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  stants");.      
11d20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11d30 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  end;.        }el
11d40 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c  se if( iCol<=0 |
11d50 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
11d60 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
11d70 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
11d80 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
11d90 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20        "GROUP BY 
11da0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
11db0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
11dc0 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
11dd0 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
11de0 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f  n 1 and %d", iCo
11df0 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
11e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
11e10 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11e30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11e40 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
11e50 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
11e60 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
11e70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
11e80 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
11e90 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65  t_end;..  /* Ide
11ea0 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
11eb0 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
11ec0 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
11ed0 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
11ee0 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
11ef0 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
11f00 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
11f10 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
11f20 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
11f30 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
11f40 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
11f50 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
11f60 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
11f70 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
11f80 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11f90 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
11fa0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
11fb0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
11fc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
11fd0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
11fe0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
11ff0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
12000 6e 74 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e  ntext;.    int n
12010 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
12020 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62  t;..    if( pTab
12030 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
12040 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ct==0 ) continue
12050 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ;.    if( pTabLi
12060 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d  st->a[i].zName!=
12070 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
12080 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
12090 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
120a0 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
120b0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
120c0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
120d0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65  .zName;.      ne
120e0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
120f0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
12100 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
12110 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  reContext = 0;. 
12120 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53     }.    sqliteS
12130 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
12140 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
12150 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61  lect, SRT_TempTa
12160 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ble, .          
12170 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
12180 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70  >a[i].iCursor, p
12190 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a 20 20  , i, &isAgg);.  
121a0 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
121b0 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
121c0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
121d0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
121e0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
121f0 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
12200 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
12210 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
12220 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21  ;.    if( eDest!
12230 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44  =SRT_Union && eD
12240 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20  est!=SRT_Except 
12250 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69  && eDest!=SRT_Di
12260 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70  scard ){.      p
12270 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
12280 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
12290 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
122a0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
122b0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
122c0 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
122d0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
122e0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  t;.  }..  /* Che
122f0 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
12300 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
12310 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
12320 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
12330 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
12340 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
12350 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
12360 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
12370 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
12380 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
12390 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
123a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
123b0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
123c0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
123d0 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
123e0 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
123f0 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
12400 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
12410 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
12420 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
12430 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
12440 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
12450 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
12460 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
12470 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
12480 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
12490 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
124a0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
124b0 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
124c0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Agg = 1;.    ret
124d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
124e0 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
124f0 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  r..  */.  comput
12500 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12510 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f  pParse, p);..  /
12520 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
12530 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
12540 6c 6c 20 62 65 20 75 73 69 6e 67 20 61 20 63 61  ll be using a ca
12550 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
12560 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
12570 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
12580 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 64   is going to a d
12590 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
125a0 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c  .  ** than a cal
125b0 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
125c0 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74   We have to do t
125d0 68 69 73 20 73 65 70 61 72 61 74 65 6c 79 20 66  his separately f
125e0 72 6f 6d 20 74 68 65 20 63 72 65 61 74 69 6f 6e  rom the creation
125f0 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
12600 0a 20 20 2a 2a 20 61 62 6f 76 65 20 62 65 63 61  .  ** above beca
12610 75 73 65 20 69 66 20 74 68 65 20 70 54 61 62 4c  use if the pTabL
12620 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 76 69 65  ist contains vie
12630 77 73 20 74 68 65 6e 20 74 68 65 79 20 77 69 6c  ws then they wil
12640 6c 20 6e 6f 74 0a 20 20 2a 2a 20 68 61 76 65 20  l not.  ** have 
12650 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 20 61 6e  been resolved an
12660 64 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e  d we will not kn
12670 6f 77 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  ow the column ty
12680 70 65 73 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e  pes until.  ** n
12690 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ow..  */.  if( e
126a0 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
126b0 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
126c0 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
126d0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
126e0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
126f0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
12700 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
12710 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
12720 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
12730 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
12740 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
12750 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
12760 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12770 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
12780 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 0);.  }..  /*
12790 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   Do an analysis 
127a0 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70  of aggregate exp
127b0 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
127c0 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
127d0 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
127e0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c  );.  if( isAgg |
127f0 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  | pGroupBy ){.  
12800 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12810 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20  ->nAgg==0 );.   
12820 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
12830 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
12840 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
12850 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12860 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
12870 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
12880 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
12890 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
128a0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
128b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
128c0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
128d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
128e0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
128f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12900 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e  if( sqliteExprAn
12910 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
12920 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
12930 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
12940 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
12950 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12960 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12970 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76    }.    if( pHav
12980 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45 78 70  ing && sqliteExp
12990 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
129a0 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  es(pParse, pHavi
129b0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
129c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
129d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
129e0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
129f0 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
12a00 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
12a10 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
12a20 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
12a30 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
12a40 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
12a50 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
12a60 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12a70 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
12a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12a90 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20  .  /* Reset the 
12aa0 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a  aggregator.  */.
12ab0 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
12ac0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12ad0 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65  Op(v, OP_AggRese
12ae0 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41  t, 0, pParse->nA
12af0 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  gg);.    for(i=0
12b00 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
12b10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75  ; i++){.      Fu
12b20 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20  ncDef *pFunc;.  
12b30 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d      if( (pFunc =
12b40 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
12b50 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46  .pFunc)!=0 && pF
12b60 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  unc->xFinalize!=
12b70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
12b80 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  iteVdbeOp3(v, OP
12b90 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20  _AggInit, 0, i, 
12ba0 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33  (char*)pFunc, P3
12bb0 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20  _POINTER);.     
12bc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12bd0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
12be0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12bf0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
12c00 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
12c10 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12c20 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
12c30 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
12c40 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
12c50 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  ze the memory ce
12c60 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a  ll to NULL.  */.
12c70 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
12c80 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  _Mem ){.    sqli
12c90 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12ca0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
12cb0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
12cc0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
12cd0 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
12ce0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
12cf0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12d00 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
12d10 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
12d20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
12d30 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69  nct ){.    disti
12d40 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
12d50 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
12d60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12d70 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69 6e  OpenTemp, distin
12d80 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ct, 1);.  }else{
12d90 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
12da0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  -1;.  }..  /* Be
12db0 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
12dc0 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49   scan.  */.  pWI
12dd0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72  nfo = sqliteWher
12de0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
12df0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
12e00 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
12e30 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  &pOrderBy);.  if
12e40 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
12e50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
12e60 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
12e70 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
12e80 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
12e90 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
12ea0 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
12eb0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
12ec0 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
12ed0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
12ee0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
12ef0 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
12f00 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e   iParm, pWInfo->
12f30 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
12f40 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20 20  o->iBreak) ){.  
12f50 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
12f60 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
12f70 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
12f80 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67  dealing with agg
12f90 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f  regates, then do
12fa0 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67   the special agg
12fb0 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63  regate.  ** proc
12fc0 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20  essing.  .  */. 
12fd0 20 65 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78   else{.    AggEx
12fe0 70 72 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 66  pr *pAgg;.    if
12ff0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
13000 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20      int lbl1;.  
13010 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13020 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
13030 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
13040 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
13050 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
13060 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
13070 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13080 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13090 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42  MakeKey, pGroupB
130a0 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
130b0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
130c0 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
130d0 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65  =4 ) sqliteAddKe
130e0 79 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42  yType(v, pGroupB
130f0 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  y);.      lbl1 =
13100 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
13110 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
13120 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
13130 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30  , OP_AggFocus, 0
13140 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66  , lbl1);.      f
13150 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61  or(i=0, pAgg=pPa
13160 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61  rse->aAgg; i<pPa
13170 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20  rse->nAgg; i++, 
13180 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pAgg++){.       
13190 20 69 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67   if( pAgg->isAgg
131a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
131b0 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
131c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67  ode(pParse, pAgg
131d0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
131e0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
131f0 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20  p(v, OP_AggSet, 
13200 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, i);.      }. 
13210 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
13220 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
13230 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bl1);.    }.    
13240 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50  for(i=0, pAgg=pP
13250 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50  arse->aAgg; i<pP
13260 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c  arse->nAgg; i++,
13270 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20   pAgg++){.      
13280 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
13290 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
132a0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
132b0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 2d        if( !pAgg-
132c0 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  >isAgg ) continu
132d0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
132e0 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20   pAgg->pFunc!=0 
132f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13300 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53   pAgg->pFunc->xS
13310 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tep!=0 );.      
13320 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46 75  pDef = pAgg->pFu
13330 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  nc;.      pE = p
13340 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Agg->pExpr;.    
13350 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
13360 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13370 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
13380 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
13390 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65    nExpr = sqlite
133a0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
133b0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
133c0 73 74 2c 20 70 44 65 66 2d 3e 69 6e 63 6c 75 64  st, pDef->includ
133d0 65 54 79 70 65 73 29 3b 0a 20 20 20 20 20 20 73  eTypes);.      s
133e0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
133f0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
13400 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13410 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41  eVdbeOp3(v, OP_A
13420 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72  ggFunc, 0, nExpr
13430 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50  , (char*)pDef, P
13440 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
13450 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20  }.  }..  /* End 
13460 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
13470 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73  n loop..  */.  s
13480 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70 57  qliteWhereEnd(pW
13490 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Info);..  /* If 
134a0 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e  we are processin
134b0 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65  g aggregates, we
134c0 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20   need to set up 
134d0 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20  a second loop.  
134e0 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
134f0 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c  he aggregate val
13500 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20  ues and process 
13510 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  them..  */.  if(
13520 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e   isAgg ){.    in
13530 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74  t endagg = sqlit
13540 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
13550 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  );.    int start
13560 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67  agg;.    startag
13570 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  g = sqliteVdbeAd
13580 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78  dOp(v, OP_AggNex
13590 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20  t, 0, endagg);. 
135a0 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67     pParse->useAg
135b0 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  g = 1;.    if( p
135c0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
135d0 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
135e0 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
135f0 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b  g, startagg, 1);
13600 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
13610 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
13620 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
13630 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
13640 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
13650 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
13660 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 73 74         iParm, st
13670 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67 29 20  artagg, endagg) 
13680 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
13690 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
136a0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
136b0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
136c0 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20  0, startagg);.  
136d0 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
136e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61  lveLabel(v, enda
136f0 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  gg);.    sqliteV
13700 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
13710 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oop, 0, 0);.    
13720 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
13730 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
13740 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
13750 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
13760 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
13770 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
13780 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
13790 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
137a0 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
137b0 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
137c0 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
137d0 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
137e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
137f0 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
13800 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
13810 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20  was a subquery, 
13820 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76  we have now conv
13830 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65  erted the subque
13840 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ry into a.  ** t
13850 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
13860 20 53 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73   So delete the s
13870 75 62 71 75 65 72 79 20 73 74 72 75 63 74 75 72  ubquery structur
13880 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  e from the paren
13890 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  t.  ** to preven
138a0 74 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  t this subquery 
138b0 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75  from being evalu
138c0 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74  ated again and t
138d0 6f 20 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a  o force the.  **
138e0 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   the use of the 
138f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
13900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
13910 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
13920 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
13930 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62  ->nSrc>parentTab
13940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13950 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
13960 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
13970 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71  ect==p );.    sq
13980 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
13990 28 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74  (p);.    pParent
139a0 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
139b0 54 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30  Tab].pSelect = 0
139c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
139d0 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
139e0 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
139f0 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
13a00 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
13a10 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
13a20 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
13a30 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
13a40 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
13a50 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
13a60 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
13a70 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
13a80 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
13a90 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
13aa0 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
13ab0 3a 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67  :.  sqliteAggreg
13ac0 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61  ateInfoReset(pPa
13ad0 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rse);.  return r
13ae0 63 3b 0a 7d 0a                                   c;.}.