/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fb4360976fdf7b73f5252f274f8129540d5cd141:


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 30  select.c,v 1.160
0200: 20 32 30 30 34 2f 30 33 2f 30 32 20 31 38 3a 33   2004/03/02 18:3
0210: 37 3a 34 31 20 64 72 68 20 45 78 70 20 24 0a 2a  7:41 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c  elect *sqliteSel
02a0: 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69  ectNew(.  ExprLi
02b0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
02c0: 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  /* which columns
02d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
02e0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53  he result */.  S
02f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
0300: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
0310: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
0320: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
0330: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0340: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  e,         /* th
0350: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
0360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
0370: 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65  roupBy,   /* the
0380: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0390: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
03a0: 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  ing,        /* t
03b0: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
03c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
03d0: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74  pOrderBy,   /* t
03e0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
03f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  se */.  int isDi
0400: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a  stinct,       /*
0410: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
0420: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
0430: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
0440: 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20  t nLimit,       
0450: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
0460: 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  ue.  -1 means no
0470: 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t used */.  int 
0480: 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  nOffset         
0490: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
04a0: 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20 6f  e.  0 means no o
04b0: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
04c0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
04d0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
04e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
04f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0520: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0530: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
0540: 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Src);.    sqlite
0550: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
0560: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  e);.    sqliteEx
0570: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72  prListDelete(pGr
0580: 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
0590: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61  teExprDelete(pHa
05a0: 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
05b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
05c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c  pOrderBy);.  }el
05d0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  se{.    if( pELi
05e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
05f0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
0600: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
0610: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4c  sqliteExpr(TK_AL
0620: 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20  L,0,0,0), 0);.  
0630: 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45    }.    pNew->pE
0640: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
0650: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
0660: 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pSrc;.    pNew->
0670: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0680: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
0690: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
06a0: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
06b0: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
06c0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
06d0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
06e0: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
06f0: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20   = isDistinct;. 
0700: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b     pNew->op = TK
0710: 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65  _SELECT;.    pNe
0720: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  w->nLimit = nLim
0730: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  it;.    pNew->nO
0740: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
0750: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  .    pNew->iLimi
0760: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  t = -1;.    pNew
0770: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
0780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0790: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  w;.}../*.** Give
07a0: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
07b0: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
07c0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
07d0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
07e0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
07f0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0800: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0810: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0820: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0830: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0840: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0850: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0860: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  R.**     JT_OUTE
0870: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0880: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0890: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
08a0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
08b0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
08c0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
08d0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
08e0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
08f0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0900: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0910: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0920: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0930: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0940: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0950: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0960: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0970: 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 50  sqliteJoinType(P
0980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0990: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
09a0: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
09b0: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
09c0: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
09d0: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
09e0: 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  p;.  static stru
09f0: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0a00: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0a10: 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20     int nChar;.  
0a20: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d 20    int code;.  } 
0a30: 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20  keywords[] = {. 
0a40: 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20     { "natural", 
0a50: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c  7, JT_NATURAL },
0a60: 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20  .    { "left",  
0a70: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0a80: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0a90: 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f  right",   5, JT_
0aa0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0ab0: 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20  ,.    { "full", 
0ac0: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0ad0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0ae0: 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22  },.    { "outer"
0af0: 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  ,   5, JT_OUTER 
0b00: 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22  },.    { "inner"
0b10: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0b20: 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22  },.    { "cross"
0b30: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0b40: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0b50: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0b60: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0b70: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0b80: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0b90: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0ba0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0bb0: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0bc0: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0bd0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0be0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0bf0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0c00: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0c10: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0c20: 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e     && sqliteStrN
0c30: 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f  ICmp(p->z, keywo
0c40: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
0c50: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
0c60: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0c70: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
0c80: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
0c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0ca0: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
0cb0: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0cc0: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
0cd0: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
0ce0: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
0cf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0d00: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
0d10: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
0d20: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
0d30: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
0d40: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
0d50: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
0d60: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
0d70: 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64 75   static Token du
0d80: 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  mmy = { 0, 0 };.
0d90: 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20 3d      char *zSp1 =
0da0: 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22 20   " ", *zSp2 = " 
0db0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0dc0: 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79 3b   ){ pB = &dummy;
0dd0: 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20 20   zSp1 = 0; }.   
0de0: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70 43   if( pC==0 ){ pC
0df0: 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32 20   = &dummy; zSp2 
0e00: 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  = 0; }.    sqlit
0e10: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
0e20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
0e30: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0e40: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0e50: 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70 41   ", 0,.       pA
0e60: 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70 31  ->z, pA->n, zSp1
0e70: 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e  , 1, pB->z, pB->
0e80: 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d 3e  n, zSp2, 1, pC->
0e90: 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20  z, pC->n, 0);.  
0ea0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0eb0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0ec0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
0ed0: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
0ee0: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
0ef0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
0f00: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0f10: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0f20: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0f30: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0f40: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
0f50: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
0f60: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
0f70: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
0f80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
0f90: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
0fa0: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
0fb0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
0fc0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
0fd0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
0fe0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
0ff0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
1000: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
1010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1030: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1040: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1050: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1060: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1070: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1080: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1090: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
10a0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
10b0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
10c0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
10d0: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
10e0: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
10f0: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1100: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1110: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1130: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1150: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  l,        /* Nam
1160: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1170: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1180: 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a   *pTab1,      /*
1190: 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a   First table */.
11a0: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
11b0: 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65  Tab2,      /* Se
11c0: 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  cond table */.  
11d0: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
11e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
11f0: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
1200: 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  m to this expres
1210: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  sion */.){.  Tok
1220: 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72  en dummy;.  Expr
1230: 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a   *pE1a, *pE1b, *
1240: 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE1c;.  Expr *pE
1250: 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63  2a, *pE2b, *pE2c
1260: 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20  ;.  Expr *pE;.. 
1270: 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b   dummy.z = zCol;
1280: 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72  .  dummy.n = str
1290: 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d  len(zCol);.  dum
12a0: 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45  my.dyn = 0;.  pE
12b0: 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  1a = sqliteExpr(
12c0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
12d0: 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73  mmy);.  pE2a = s
12e0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c  qliteExpr(TK_ID,
12f0: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1300: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1310: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
1320: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
1330: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
1340: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
1350: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1360: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1370: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b2->zName;.  dum
1380: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
1390: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20 3d  mmy.z);.  pE2b =
13a0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
13b0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
13c0: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
13d0: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  eExpr(TK_DOT, pE
13e0: 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20  1b, pE1a, 0);.  
13f0: 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78 70  pE2c = sqliteExp
1400: 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  r(TK_DOT, pE2b, 
1410: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
1420: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 45   sqliteExpr(TK_E
1430: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
1440: 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  );.  ExprSetProp
1450: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1460: 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20 2a 70 70  Join);.  if( *pp
1470: 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70 45  Expr ){.    *ppE
1480: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
1490: 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70 72  (TK_AND, *ppExpr
14a0: 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , pE, 0);.  }els
14b0: 65 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  e{.    *ppExpr =
14c0: 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   pE;.  }.}../*.*
14d0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
14e0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
14f0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1500: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1510: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
1520: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1530: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
1540: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
1550: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
1560: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
1570: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
1580: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
1590: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
15a0: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
15b0: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
15c0: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
15d0: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
15e0: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
15f0: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
1600: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
1610: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
1620: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
1630: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
1640: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
1650: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
1660: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
1670: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
1680: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
1690: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
16a0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
16b0: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
16c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c  Expr *p){.  whil
16d0: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
16e0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
16f0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1700: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
1710: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20  pLeft);.    p = 
1720: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1730: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1740: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1750: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1760: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1770: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1780: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1790: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
17a0: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
17b0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
17c0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
17d0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
17e0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
17f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1800: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1810: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
1820: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
1830: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
1840: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1850: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72  eProcessJoin(Par
1860: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1870: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
1880: 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69  t *pSrc;.  int i
1890: 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  , j;.  pSrc = p-
18a0: 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
18b0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
18c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
18d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18e0: 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e  *pTerm = &pSrc->
18f0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
1900: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1910: 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61  Other = &pSrc->a
1920: 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [i+1];..    if( 
1930: 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c  pTerm->pTab==0 |
1940: 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d  | pOther->pTab==
1950: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1960: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1970: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1980: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
1990: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
19a0: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
19b0: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
19c0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
19d0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
19e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65    */.    if( pTe
19f0: 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rm->jointype & J
1a00: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
1a10: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
1a20: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1a30: 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70  >pOn || pTerm->p
1a40: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
1a50: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
1a60: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
1a70: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
1a80: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
1a90: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
1aa0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
1ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61  Tab = pTerm->pTa
1ae0: 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  b;.      for(j=0
1af0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1b00: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1b10: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f  ( columnIndex(pO
1b20: 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62  ther->pTab, pTab
1b30: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
1b40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1b50: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54   addWhereTerm(pT
1b60: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1b70: 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d  e, pTab, pOther-
1b80: 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72  >pTab, &p->pWher
1b90: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1ba0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1bb0: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
1bc0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
1bd0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
1be0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
1bf0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f     if( pTerm->pO
1c00: 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69  n && pTerm->pUsi
1c10: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1c20: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
1c30: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1c40: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1c50: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1c60: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1c70: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
1c80: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1c90: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
1ca0: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
1cb0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
1cc0: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
1cd0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64  ed by.    ** and
1ce0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1cf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1d00: 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  erm->pOn ){.    
1d10: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 54    setJoinExpr(pT
1d20: 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  erm->pOn);.     
1d30: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
1d40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1d50: 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e  pWhere = pTerm->
1d60: 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pOn;.      }else
1d70: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1d80: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
1d90: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65  (TK_AND, p->pWhe
1da0: 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c 20  re, pTerm->pOn, 
1db0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1dc0: 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20 30    pTerm->pOn = 0
1dd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1de0: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
1df0: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
1e00: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
1e10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
1e20: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
1e30: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
1e40: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
1e50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1e60: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
1e70: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
1e80: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
1e90: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
1ea0: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
1eb0: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
1ec0: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
1ed0: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
1ee0: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
1ef0: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
1f00: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
1f10: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
1f20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
1f30: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
1f40: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
1f50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1f60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1f70: 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67 20  ( pTerm->pUsing 
1f80: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
1f90: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  *pList;.      in
1fa0: 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1fb0: 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  t( i<pSrc->nSrc-
1fc0: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
1fd0: 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67   = pTerm->pUsing
1fe0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1ff0: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
2000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2010: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 65   columnIndex(pTe
2020: 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d  rm->pTab, pList-
2030: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 7c  >a[j].zName)<0 |
2040: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  |.            co
2050: 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65 72  lumnIndex(pOther
2060: 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61  ->pTab, pList->a
2070: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  [j].zName)<0 ){.
2080: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2090: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20a0: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
20b0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
20c0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
20d0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
20e0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
20f0: 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ", pList->a[j].z
2100: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2110: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
2130: 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74 2d  WhereTerm(pList-
2140: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 65  >a[j].zName, pTe
2150: 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65 72  rm->pTab, pOther
2160: 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ->pTab, &p->pWhe
2170: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2180: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2190: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
21a0: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
21b0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
21c0: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
21d0: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
21e0: 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74  oid sqliteSelect
21f0: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
2200: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
2210: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2220: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2230: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
2240: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
2250: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c  (p->pSrc);.  sql
2260: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
2270: 3e 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  >pWhere);.  sqli
2280: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
2290: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
22a0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
22b0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
22c0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
22d0: 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42  elete(p->pOrderB
22e0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  y);.  sqliteSele
22f0: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
2300: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  or);.  sqliteFre
2310: 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20  e(p->zSelect);. 
2320: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
2330: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2340: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e  the aggregate in
2350: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2360: 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75  he parse structu
2370: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
2380: 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  id sqliteAggrega
2390: 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73  teInfoReset(Pars
23a0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
23b0: 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d  liteFree(pParse-
23c0: 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65  >aAgg);.  pParse
23d0: 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
23e0: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
23f0: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
2400: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2410: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
2420: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
2430: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
2440: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
2450: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
2460: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
2470: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
2480: 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70  oSorter(Parse *p
2490: 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20  Parse, Vdbe *v, 
24a0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
24b0: 42 79 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f  By){.  char *zSo
24c0: 72 74 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69  rtOrder;.  int i
24d0: 3b 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d  ;.  zSortOrder =
24e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
24f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
2500: 20 31 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72   1 );.  if( zSor
2510: 74 4f 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75  tOrder==0 ) retu
2520: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
2530: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
2540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2550: 6f 72 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79  order = pOrderBy
2560: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2570: 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a  ;.    int type;.
2580: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
2590: 66 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49  f( (order & SQLI
25a0: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d  TE_SO_TYPEMASK)=
25b0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
25c0: 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  ){.      type = 
25d0: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
25e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f      }else if( (o
25f0: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
2600: 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49  _TYPEMASK)==SQLI
2610: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
2620: 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45     type = SQLITE
2630: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c  _SO_NUM;.    }el
2640: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  se if( pParse->d
2650: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
2660: 34 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20  4 ){.      type 
2670: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
2680: 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2690: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pExpr);.    }els
26a0: 65 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  e{.      type = 
26b0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
26c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72     }.    if( (or
26d0: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
26e0: 44 49 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  DIRMASK)==SQLITE
26f0: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  _SO_ASC ){.     
2700: 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54   c = type==SQLIT
2710: 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20  E_SO_TEXT ? 'A' 
2720: 3a 20 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65  : '+';.    }else
2730: 7b 0a 20 20 20 20 20 20 63 20 3d 20 74 79 70 65  {.      c = type
2740: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  ==SQLITE_SO_TEXT
2750: 20 3f 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20   ? 'D' : '-';.  
2760: 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64    }.    zSortOrd
2770: 65 72 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73  er[i] = c;.    s
2780: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
2790: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
27a0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[i].pExpr);.  }
27b0: 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f  .  zSortOrder[pO
27c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d  rderBy->nExpr] =
27d0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
27e0: 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  Op3(v, OP_SortMa
27f0: 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d  keKey, pOrderBy-
2800: 3e 6e 45 78 70 72 2c 20 30 2c 20 7a 53 6f 72 74  >nExpr, 0, zSort
2810: 4f 72 64 65 72 2c 20 50 33 5f 44 59 4e 41 4d 49  Order, P3_DYNAMI
2820: 43 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  C);.  sqliteVdbe
2830: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
2840: 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  Put, 0, 0);.}../
2850: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2860: 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67 75  e adds a P3 argu
2870: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74  ment to the last
2880: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61   VDBE opcode tha
2890: 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65  t was.** inserte
28a0: 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d 65  d. The P3 argume
28b0: 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73 74  nt added is a st
28c0: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
28d0: 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b  r the .** OP_Mak
28e0: 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49  eKey or OP_MakeI
28f0: 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20  dxKey opcodes.  
2900: 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  The string consi
2910: 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  sts of.** charac
2920: 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20  ters 't' or 'n' 
2930: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
2940: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2950: 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64  various.** field
2960: 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20  s of the key to 
2970: 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f  be generated sho
2980: 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61  uld be treated a
2990: 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20  s numeric.** or 
29a0: 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74 68  as text.  See th
29b0: 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64  e OP_MakeKey and
29c0: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f   OP_MakeIdxKey o
29d0: 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e  pcode.** documen
29e0: 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  tation for addit
29f0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2a00: 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20 73  n about the P3 s
2a10: 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c  tring..** See al
2a20: 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64  so the sqliteAdd
2a30: 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f 75  IdxKeyType() rou
2a40: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
2a50: 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 56  liteAddKeyType(V
2a60: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
2a70: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
2a80: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
2a90: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61 72  t->nExpr;.  char
2aa0: 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65   *zType = sqlite
2ab0: 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b  Malloc( nColumn+
2ac0: 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  1 );.  int i;.  
2ad0: 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72  if( zType==0 ) r
2ae0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
2af0: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
2b00: 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  ){.    zType[i] 
2b10: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
2b20: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
2b30: 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  xpr)==SQLITE_SO_
2b40: 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27 3b  NUM ? 'n' : 't';
2b50: 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d 20  .  }.  zType[i] 
2b60: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  = 0;.  sqliteVdb
2b70: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
2b80: 20 7a 54 79 70 65 2c 20 50 33 5f 44 59 4e 41 4d   zType, P3_DYNAM
2b90: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IC);.}../*.** Th
2ba0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2bb0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
2bc0: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2bd0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2be0: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2bf0: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2c00: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2c10: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2c20: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2c30: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2c40: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2c50: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2c60: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2c70: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2c80: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2c90: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2ca0: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2cb0: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
2cc0: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2cd0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2ce0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2cf0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2d00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d20: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2d30: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d50: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2d60: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2d70: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2d80: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2d90: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2da0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2db0: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2dc0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2dd0: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2de0: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2df0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2e00: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2e10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2e20: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2e30: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2e40: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2e50: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2e60: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2e70: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2e80: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2e90: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2ea0: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2eb0: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2ec0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2ed0: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2ee0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2ef0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2f00: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2f10: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2f20: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2f30: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2f40: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2f50: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2f60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2f70: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2f80: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2f90: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
2fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2fb0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2fc0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2fd0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
2fe0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2ff0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
3000: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
3010: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
3020: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
3030: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
3040: 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
3050: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3060: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64  tatement, then d
3070: 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a  o the check.  **
3080: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
3090: 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75  row should be ou
30a0: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
30b0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
30c0: 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73      if( p->iOffs
30d0: 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  et>=0 ){.      i
30e0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
30f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
3100: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
3110: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3120: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66  MemIncr, p->iOff
3130: 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  set, addr+2);.  
3140: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3150: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3160: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
3170: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
3180: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
3190: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
31a0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
31b0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
31c0: 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  eak);.    }.  }.
31d0: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
31e0: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
31f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ..  */.  if( nCo
3200: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
3210: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
3220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
3230: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3240: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
3250: 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, i);.    }.  
3260: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75  }else{.    nColu
3270: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
3280: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
3290: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
32a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
32b0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
32c0: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
32d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
32e0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
3300: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
3310: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
3320: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
3330: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
3340: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
3350: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
3360: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
3370: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
3380: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74  .  */.  if( dist
3390: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
33a0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
33b0: 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c  pr>0 ){.#if NULL
33c0: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
33d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
33e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  ddOp(v, OP_IsNul
33f0: 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l, -pEList->nExp
3400: 72 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72  r, sqliteVdbeCur
3410: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
3420: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
3430: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3440: 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74  _MakeKey, pEList
3450: 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  ->nExpr, 1);.   
3460: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
3470: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
3480: 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79  ) sqliteAddKeyTy
3490: 70 65 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a 20  pe(v, pEList);. 
34a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
34b0: 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63  Op(v, OP_Distinc
34c0: 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c  t, distinct, sql
34d0: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
34e0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71  dr(v)+3);.    sq
34f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3500: 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d   OP_Pop, pEList-
3510: 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20  >nExpr+1, 0);.  
3520: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3530: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3540: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
3550: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3560: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
3570: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3580: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3590: 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69  PutStrKey, disti
35a0: 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  nct, 0);.  }..  
35b0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
35c0: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
35d0: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
35e0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
35f0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
3600: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
3610: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
3620: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
3630: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
3640: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3650: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3660: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
3670: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
3680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
36a0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
36b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
36c0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
36d0: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
36e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   }..    /* Store
3700: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
3710: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
3720: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
3730: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
3740: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
3750: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
3760: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3770: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3780: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
3790: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
37a0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
37b0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
37c0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
37d0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
37e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3800: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
3810: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3820: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3830: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
3840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3860: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
3870: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
3880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3890: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
38a0: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
38b0: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
38c0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
38d0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
38e0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
38f0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
3900: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
3910: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
3920: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
3930: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
3940: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
3950: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
3960: 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
3970: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3980: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3990: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
39a0: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
39b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
39c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
39d0: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
39e0: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
39f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3a00: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
3a10: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
3a20: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3a30: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
3a40: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
3a50: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
3a60: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
3a70: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
3a80: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
3a90: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
3aa0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
3ab0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
3ac0: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
3ad0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
3ae0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
3af0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
3b00: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
3b10: 72 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  r1 = sqliteVdbeC
3b20: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
3b30: 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a       int addr2;.
3b40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
3b50: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
3b60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3b70: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3b80: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3b90: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3ba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
3bb0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  1, 0);.      add
3bc0: 72 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  r2 = sqliteVdbeA
3bd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3be0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3bf0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
3c00: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
3c10: 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20  rter(pParse, v, 
3c20: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
3c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3c40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3c50: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
3c60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3c70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3c80: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50  OP_PutStrKey, iP
3c90: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
3ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3cb0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
3cc0: 72 32 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75  r2, sqliteVdbeCu
3cd0: 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
3ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3cf0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
3d00: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
3d10: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
3d20: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
3d30: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
3d40: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
3d50: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
3d60: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
3d70: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
3d80: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
3d90: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
3da0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
3db0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
3dc0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
3dd0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
3de0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
3df0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3e00: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3e10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3e20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
3e30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
3e40: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
3e50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3e60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3e70: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
3e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3ea0: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
3eb0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
3ec0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ck function..   
3ed0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3ee0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
3ef0: 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20  ase SRT_Sorter: 
3f00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
3f10: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3f20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3f30: 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65  v, OP_SortMakeRe
3f40: 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  c, nColumn, 0);.
3f50: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3f60: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3f70: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3f80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3f90: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
3fa0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b  =SRT_Callback );
3fb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3fc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3fd0: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
3fe0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4000: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
4010: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
4020: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c  handle the resul
4030: 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74  ts.  The subrout
4040: 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ine itself.    *
4050: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
4060: 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65   for popping the
4070: 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20   results off of 
4080: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
4090: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
40a0: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
40b0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
40c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
40d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
40e0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
40f0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4100: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4110: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
4120: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
4130: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4140: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4150: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4160: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4180: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
4190: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
41a0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
41b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
41c0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
41d0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
41e0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
41f0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
4200: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
4210: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
4220: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4230: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
4240: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4250: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4260: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4270: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
4280: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
4290: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
42a0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
42b0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
42c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
42d0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
42e0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
42f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4300: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4310: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
4320: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
4330: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
4340: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
4350: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
4360: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
4370: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
4380: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
4390: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
43a0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
43b0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
43c0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
43d0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
43e0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
43f0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
4400: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
4410: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
4420: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
4430: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 53 65 6c  eSortTail(.  Sel
4440: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4450: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4460: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
4470: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
4480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4490: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
44a0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
44b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
44c0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
44d0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
44e0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
44f0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
4500: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
4510: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
4520: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
4530: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4540: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4550: 69 6e 74 20 65 6e 64 31 20 3d 20 73 71 6c 69 74  int end1 = sqlit
4560: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
4570: 29 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20 3d 20  );.  int end2 = 
4580: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
4590: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
45a0: 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  dr;.  if( eDest=
45b0: 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65  =SRT_Sorter ) re
45c0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64  turn;.  sqliteVd
45d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
45e0: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64  rt, 0, 0);.  add
45f0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
4600: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65  dOp(v, OP_SortNe
4610: 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20  xt, 0, end1);.  
4620: 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d  if( p->iOffset>=
4630: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
4640: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4650: 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f 66 66 73  emIncr, p->iOffs
4660: 65 74 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20  et, addr+4);.   
4670: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4680: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4690: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
46a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
46b0: 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d  o, 0, addr);.  }
46c0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
46d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
46e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
46f0: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69  _MemIncr, p->iLi
4700: 6d 69 74 2c 20 65 6e 64 32 29 3b 0a 20 20 7d 0a  mit, end2);.  }.
4710: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
4720: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
4730: 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20  Callback: {.    
4740: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4750: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 43 61 6c 6c  p(v, OP_SortCall
4760: 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  back, nColumn, 0
4770: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4780: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4790: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
47a0: 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  se SRT_TempTable
47b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
47c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
47d0: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
47e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
47f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4800: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
4810: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4820: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
4830: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
4840: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4850: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
4860: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
4870: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
4880: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4890: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
48a0: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69  otNull, -1, sqli
48b0: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
48c0: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
48d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
48e0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
48f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4900: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
4910: 6f 2c 20 30 2c 20 73 71 6c 69 74 65 56 64 62 65  o, 0, sqliteVdbe
4920: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
4930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4940: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4950: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
4960: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4970: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
4980: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
4990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
49a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
49b0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
49c0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
49d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
49e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
49f0: 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
4a00: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4a10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4a20: 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Goto, 0, end1);.
4a30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4a40: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
4a50: 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  Subroutine: {.  
4a60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
4a70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
4a80: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
4a90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4aa0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
4ab0: 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20   -1-i, i);.     
4ac0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
4ad0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4ae0: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
4af0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4b00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4b10: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 1, 0);.      b
4b20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4b30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4b40: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
4b50: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
4b60: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4b70: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4b80: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
4b90: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73  .  sqliteVdbeRes
4ba0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
4bb0: 32 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  2);.  sqliteVdbe
4bc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4bd0: 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   1, 0);.  sqlite
4be0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
4bf0: 28 76 2c 20 65 6e 64 31 29 3b 0a 20 20 73 71 6c  (v, end1);.  sql
4c00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4c10: 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c  OP_SortReset, 0,
4c20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
4c30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
4c40: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
4c50: 44 42 45 20 74 68 65 20 64 61 74 61 74 79 70 65  DBE the datatype
4c60: 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  s of.** columns 
4c70: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
4c80: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
4c90: 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e 65 72  utine only gener
4ca0: 61 74 65 73 20 63 6f 64 65 20 69 66 20 74 68 65  ates code if the
4cb0: 20 22 50 52 41 47 4d 41 20 73 68 6f 77 5f 64 61   "PRAGMA show_da
4cc0: 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a 20 68  tatypes=on".** h
4cd0: 61 73 20 62 65 65 6e 20 65 78 65 63 75 74 65 64  as been executed
4ce0: 2e 20 20 54 68 65 20 64 61 74 61 74 79 70 65 73  .  The datatypes
4cf0: 20 61 72 65 20 72 65 70 6f 72 74 65 64 20 6f 75   are reported ou
4d00: 74 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c 0a 2a  t in the azCol.*
4d10: 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  * parameter to t
4d20: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
4d30: 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 72 73 74  tion.  The first
4d40: 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74 72 69   N azCol[] entri
4d50: 65 73 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  es.** are the na
4d60: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
4d70: 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  ns, and the seco
4d80: 6e 64 20 4e 20 65 6e 74 72 69 65 73 20 61 72 65  nd N entries are
4d90: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
4da0: 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  s for the column
4db0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 64 61  s..**.** The "da
4dc0: 74 61 74 79 70 65 22 20 66 6f 72 20 61 20 72 65  tatype" for a re
4dd0: 73 75 6c 74 20 74 68 61 74 20 69 73 20 61 20 63  sult that is a c
4de0: 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70 65 20  olumn of a type 
4df0: 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  is the.** dataty
4e00: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
4e10: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4e20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4e30: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  atement..** The 
4e40: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 6e 20  datatype for an 
4e50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
4e60: 74 68 65 72 20 54 45 58 54 20 6f 72 20 4e 55 4d  ther TEXT or NUM
4e70: 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20 64 61  ERIC.  The.** da
4e80: 74 61 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  tatype for a ROW
4e90: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
4ea0: 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  GER..*/.static v
4eb0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
4ec0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
4ed0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
4ee0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
4ef0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
4f00: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
4f10: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
4f20: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
4f30: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
4f40: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
4f50: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
4f60: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4f70: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
4f80: 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
4f90: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
4fa0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
4fb0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
4fc0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
4fd0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
4fe0: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
4ff0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
5000: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
5010: 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20  UMN && pTabList 
5020: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
5030: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
5040: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
5050: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
5060: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
5070: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
5080: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
5090: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
50a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
50b0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
50c0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
50d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
50e0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
50f0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
5100: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
5110: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
5120: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
5130: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
5140: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
5150: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
5160: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
5170: 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  R";.      }else{
5180: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
5190: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
51a0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d  ].zType;.      }
51b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
51c0: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
51d0: 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Type(p)==SQLITE_
51e0: 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  SO_TEXT ){.     
51f0: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
5200: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
5210: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
5220: 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20 20  "NUMERIC";.     
5230: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5240: 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  iteVdbeOp3(v, OP
5250: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b  _ColumnName, i +
5260: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
5270: 30 2c 20 7a 54 79 70 65 2c 20 30 29 3b 0a 20 20  0, zType, 0);.  
5280: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
5290: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
52a0: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
52b0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
52c0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
52d0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
52e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
52f0: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
5300: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
5310: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
5320: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
5330: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
5340: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
5350: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5360: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5370: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
5380: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
5390: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
53a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
53b0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
53c0: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
53d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
53e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
53f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5400: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
5410: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
5420: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
5430: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
5440: 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76  es;..  assert( v
5450: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
5460: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
5470: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69   || v==0 || sqli
5480: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
5490: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61   ) return;.  pPa
54a0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
54b0: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
54c0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
54d0: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
54e0: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
54f0: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
5500: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
5510: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
5520: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
5530: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
5540: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
5550: 20 20 20 69 6e 74 20 70 32 20 3d 20 69 3d 3d 70     int p2 = i==p
5560: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 3b 0a  EList->nExpr-1;.
5570: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
5580: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
5590: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
55a0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
55b0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
55c0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
55d0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
55e0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
55f0: 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76   sqliteVdbeOp3(v
5600: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5610: 20 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 30   i, p2, zName, 0
5620: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
5630: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
5640: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
5650: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
5660: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
5670: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
5680: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
5690: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
56a0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
56b0: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
56c0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
56d0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
56e0: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
56f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
5700: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
5710: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
5720: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
5730: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
5740: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
5750: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
5760: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
5770: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
5780: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
5790: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
57a0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
57b0: 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f   zCol = "_ROWID_
57c0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
57d0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
57e0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
57f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
5800: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
5810: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
5820: 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20  es && p->span.z 
5830: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
5840: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
5850: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
5860: 4f 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op3(v,OP_ColumnN
5870: 61 6d 65 2c 20 69 2c 20 70 32 2c 20 70 2d 3e 73  ame, i, p2, p->s
5880: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
5890: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
58a0: 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61  eVdbeCompressSpa
58b0: 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  ce(v, addr);.   
58c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
58d0: 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72  lNames || (!shor
58e0: 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69  tNames && pTabLi
58f0: 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20  st->nSrc>1) ){. 
5900: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
5910: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
5920: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20  char *zTab;. .  
5930: 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61        zTab = pTa
5940: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69  bList->a[j].zAli
5950: 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  as;.        if( 
5960: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61  fullNames || zTa
5970: 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54  b==0 ) zTab = pT
5980: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
5990: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
59a0: 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c  ng(&zName, zTab,
59b0: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a   ".", zCol, 0);.
59c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
59d0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  beOp3(v, OP_Colu
59e0: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a  mnName, i, p2, z
59f0: 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43  Name, P3_DYNAMIC
5a00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5a10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5a20: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  beOp3(v, OP_Colu
5a30: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a  mnName, i, p2, z
5a40: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Col, 0);.      }
5a50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
5a60: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
5a70: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
5a80: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
5a90: 69 74 65 56 64 62 65 4f 70 33 28 76 2c 4f 50 5f  iteVdbeOp3(v,OP_
5aa0: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70  ColumnName, i, p
5ab0: 32 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  2, p->span.z, p-
5ac0: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
5ad0: 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65  sqliteVdbeCompre
5ae0: 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29  ssSpace(v, addr)
5af0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5b00: 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30     char zName[30
5b10: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
5b20: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
5b30: 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30  N || pTabList==0
5b40: 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   );.      sprint
5b50: 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  f(zName, "column
5b60: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
5b70: 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76   sqliteVdbeOp3(v
5b80: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5b90: 20 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 30   i, p2, zName, 0
5ba0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
5bb0: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
5bc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
5bd0: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
5be0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
5bf0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5c00: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
5c10: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
5c20: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
5c30: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
5c40: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
5c50: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
5c60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5c70: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
5c80: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
5c90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5ca0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
5cb0: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
5cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
5cd0: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
5ce0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
5cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
5d00: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
5d10: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
5d20: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
5d30: 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75  c int fillInColu
5d40: 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53  mnList(Parse*, S
5d50: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
5d60: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
5d70: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
5d80: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
5d90: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
5da0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
5db0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
5dc0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
5dd0: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
5de0: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
5df0: 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61  Parse, char *zTa
5e00: 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70  bName, Select *p
5e10: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
5e20: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *pTab;.  int i,
5e30: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
5e40: 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e  pEList;.  Column
5e50: 20 2a 61 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66   *aCol;..  if( f
5e60: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
5e70: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
5e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5e90: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
5ea0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5eb0: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
5ec0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
5ed0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5ee0: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
5ef0: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
5f00: 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d  teStrDup(zTabNam
5f10: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
5f20: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
5f30: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
5f40: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
5f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
5f60: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
5f70: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
5f80: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5f90: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
5fa0: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
5fb0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
5fc0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
5fd0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20  ){.    Expr *p, 
5fe0: 2a 70 52 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  *pR;.    if( pEL
5ff0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
6000: 29 7b 0a 20 20 20 20 20 20 61 43 6f 6c 5b 69 5d  ){.      aCol[i]
6010: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
6020: 74 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  trDup(pEList->a[
6030: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
6040: 65 6c 73 65 20 69 66 28 20 28 70 3d 70 45 4c 69  else if( (p=pELi
6050: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
6060: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
6070: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
6080: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
6090: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
60a0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
60b0: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ] ){.      int c
60c0: 6e 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nt;.      sqlite
60d0: 53 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c  SetNString(&aCol
60e0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74  [i].zName, pR->t
60f0: 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65  oken.z, pR->toke
6100: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  n.n, 0);.      f
6110: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
6120: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
6130: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
6140: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
6150: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[i].zName)==
6160: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
6170: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
6180: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
6190: 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66           sprintf
61a0: 28 7a 42 75 66 2c 22 5f 25 64 22 2c 2b 2b 63 6e  (zBuf,"_%d",++cn
61b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20  t);.          n 
61c0: 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
61d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
61e0: 53 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c  SetNString(&aCol
61f0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74  [i].zName, pR->t
6200: 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65  oken.z, pR->toke
6210: 6e 2e 6e 2c 20 7a 42 75 66 2c 20 6e 2c 30 29 3b  n.n, zBuf, n,0);
6220: 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  .          j = -
6230: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
6240: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
6250: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
6260: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
6270: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
6280: 53 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43  String(&pTab->aC
6290: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e  ol[i].zName, p->
62a0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
62b0: 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  n, 0);.    }else
62c0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
62d0: 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72  f[30];.      spr
62e0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c 75  intf(zBuf, "colu
62f0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
6300: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
6310: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
6320: 74 72 44 75 70 28 7a 42 75 66 29 3b 0a 20 20 20  trDup(zBuf);.   
6330: 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69   }.  }.  pTab->i
6340: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74  PKey = -1;.  ret
6350: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
6360: 2a 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e  ** For the given
6370: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6380: 74 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e  t, do three thin
6390: 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  gs..**.**    (1)
63a0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
63b0: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
63c0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
63d0: 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
63e0: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
63f0: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
6400: 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
6410: 20 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76   scanned.  For v
6420: 69 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20  iews,.**        
6430: 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
6440: 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
6450: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
6460: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
6470: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
6480: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
6490: 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
64a0: 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
64b0: 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
64c0: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
64d0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
64e0: 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
64f0: 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
6500: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
6510: 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
6520: 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
6530: 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
6540: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
6550: 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
6560: 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
6570: 20 28 32 29 20 20 41 64 64 20 74 65 72 6d 73 20   (2)  Add terms 
6580: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
6590: 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
65a0: 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
65b0: 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
65c0: 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
65d0: 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
65e0: 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
65f0: 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63  **.**    (3)  Sc
6600: 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
6610: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
6620: 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
6630: 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
6640: 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
6650: 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
6660: 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
6670: 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
6680: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
6690: 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
66a0: 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
66b0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
66c0: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
66d0: 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
66e0: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
66f0: 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a   in TABLE..**.**
6700: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
6710: 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20  cess.  If there 
6720: 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65  are problems, le
6730: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
6740: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
6750: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
6760: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
6770: 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   int fillInColum
6780: 6e 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61  nList(Parse *pPa
6790: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
67a0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
67b0: 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rc;.  SrcList *p
67c0: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
67d0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
67e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69  able *pTab;..  i
67f0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53  f( p==0 || p->pS
6800: 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc==0 ) return 1
6810: 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
6820: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
6830: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
6840: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
6850: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  y table in the t
6860: 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a  able list..  */.
6870: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
6880: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
6890: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ){.    if( pTabL
68a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29  ist->a[i].pTab )
68b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
68c0: 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
68d0: 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64  before!  No need
68e0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a   to continue */.
68f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6900: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
6910: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
6920: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  me==0 ){.      /
6930: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
6940: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6950: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
6960: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
6970: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
6980: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
6990: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
69a0: 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  [i].zAlias==0 ){
69b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 46  .        char zF
69c0: 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20  akeName[60];.   
69d0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61       sprintf(zFa
69e0: 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  keName, "sqlite_
69f0: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20  subquery_%p_",. 
6a00: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
6a10: 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e  )pTabList->a[i].
6a20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
6a30: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
6a40: 67 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  g(&pTabList->a[i
6a50: 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e  ].zAlias, zFakeN
6a60: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ame, 0);.      }
6a70: 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d  .      pTabList-
6a80: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[i].pTab = pTa
6a90: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
6aa0: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
6ab0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
6ac0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
6ad0: 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
6b00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6b10: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
6b20: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
6b30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6b40: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65    }.      /* The
6b50: 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61   isTransient fla
6b60: 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
6b70: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
6b80: 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20  ture has been.  
6b90: 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c      ** dynamical
6ba0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ly allocated and
6bb0: 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74   may be freed at
6bc0: 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f   any time.  In o
6bd0: 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20  ther words,.    
6be0: 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74    ** pTab is not
6bf0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70   pointing to a p
6c00: 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20  ersistent table 
6c10: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
6c20: 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  efines.      ** 
6c30: 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65  part of the sche
6c40: 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61  ma. */.      pTa
6c50: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d  b->isTransient =
6c60: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
6c70: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
6c80: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
6c90: 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
6ca0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
6cb0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6cc0: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
6cd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4c  .        sqliteL
6ce0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
6cf0: 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  e,pTabList->a[i]
6d00: 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74 2d  .zName,pTabList-
6d10: 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[i].zDatabase)
6d20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
6d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
6d40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
6d50: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
6d60: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
6d70: 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
6d80: 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
6d90: 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
6da0: 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
6db0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6dc0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
6dd0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
6de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
6df0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
6e00: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  }.        /* If 
6e10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6e20: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
6e30: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
6e40: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
6e50: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
6e60: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
6e70: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
6e80: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
6e90: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
6ea0: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
6eb0: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
6ec0: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
6ed0: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
6ee0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
6ef0: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
6f00: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
6f10: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6f30: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6f40: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
6f50: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
6f60: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
6f70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6f80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
6f90: 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
6fa0: 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
6fb0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
6fc0: 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
6fd0: 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73  if( sqliteProces
6fe0: 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
6ff0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
7000: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
7010: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
7020: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
7030: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
7040: 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
7050: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
7060: 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
7070: 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
7080: 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
7090: 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
70a0: 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
70b0: 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
70c0: 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
70d0: 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
70e0: 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
70f0: 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
7100: 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
7110: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
7120: 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
7130: 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
7140: 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
7150: 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
7160: 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
7170: 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
7180: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
7190: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
71a0: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
71b0: 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
71c0: 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
71d0: 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
71e0: 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
71f0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
7200: 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
7210: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
7220: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
7230: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
7240: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
7250: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
7260: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
7270: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
7280: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
7290: 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
72a0: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
72b0: 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
72c0: 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
72d0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
72e0: 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
72f0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20    rc = 0;.  if( 
7300: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
7310: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
7320: 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
7330: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
7340: 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
7350: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
7360: 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
7370: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
7380: 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
7390: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
73a0: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
73b0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
73c0: 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
73d0: 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
73e0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
73f0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
7400: 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
7410: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
7420: 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b  w = 0;.    for(k
7430: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
7440: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
7450: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
7460: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
7470: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
7480: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
7490: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
74a0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
74b0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
74c0: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
74d0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
74e0: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
74f0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
7500: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
7510: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7520: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
7530: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
7540: 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70  (pNew, a[k].pExp
7550: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
7560: 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
7570: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
7580: 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
7590: 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
75a0: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a  ;.        a[k].z
75b0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
75c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
75d0: 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
75e0: 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
75f0: 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
7600: 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
7610: 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
7620: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
7630: 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
7640: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
7650: 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
7660: 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65   */.        Toke
7670: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20  n *pName;       
7680: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
7690: 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
76a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
76b0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
76c0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
76d0: 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45       pName = &pE
76e0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
76f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7700: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d           pName =
7710: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
7720: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7730: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
7740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
7750: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
7760: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
7770: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
7780: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
7790: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
77a0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
77b0: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
77c0: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
77d0: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
77e0: 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
77f0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
7800: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7810: 69 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54  if( pName && (zT
7820: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
7830: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
7860: 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61  pName->z, zTabNa
7870: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30  me, pName->n)!=0
7880: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
7890: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e       zTabName[pN
78a0: 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20  ame->n]!=0) ){. 
78b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
78c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
78d0: 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
78e0: 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
78f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
7900: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
7910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
7920: 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74  r *pExpr, *pLeft
7930: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
7940: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
7950: 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
7960: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
7970: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7980: 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  & (pTabList->a[i
7990: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
79a0: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
79b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79c0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61   columnIndex(pTa
79d0: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54  bList->a[i-1].pT
79e0: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
79f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
7a00: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
7a10: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
7a20: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
7a30: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
7a40: 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
7a50: 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
7a60: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7a70: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7a80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
7a90: 28 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 49  ( i>0 && sqliteI
7aa0: 64 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c  dListIndex(pTabL
7ab0: 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69  ist->a[i-1].pUsi
7ac0: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
7ae0: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
7af0: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
7b00: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
7b10: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
7b20: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
7b30: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
7b40: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
7b50: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
7b60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7b80: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
7b90: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20  liteExpr(TK_ID, 
7ba0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
7bb0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
7bc0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7bd0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
7be0: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65  >token.z = zName
7bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
7c00: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  ight->token.n = 
7c10: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
7c20: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
7c30: 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  t->token.dyn = 0
7c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7c50: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 70 54  ( zTabName && pT
7c60: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
7c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7c80: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78  pLeft = sqliteEx
7c90: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
7ca0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7cb0: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
7cc0: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65  Expr(TK_DOT, pLe
7cd0: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7cf0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
7d00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7d10: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a    pLeft->token.z
7d20: 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20   = zTabName;.   
7d30: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7d40: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c  ->token.n = strl
7d50: 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  en(zTabName);.  
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
7d70: 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  t->token.dyn = 0
7d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7d90: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
7da0: 28 63 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e  (char**)&pExpr->
7db0: 73 70 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65  span.z, zTabName
7dc0: 2c 20 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29  , ".", zName, 0)
7dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7de0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20  pExpr->span.n = 
7df0: 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70  strlen(pExpr->sp
7e00: 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  an.z);.         
7e10: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
7e20: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
7e30: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
7e40: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
7e50: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7e60: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7e80: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
7e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
7ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
7ec0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
7ed0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
7ee0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
7ef0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7f00: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
7f10: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
7f20: 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  nd(pNew, pExpr, 
7f30: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
7f40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7f50: 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
7f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
7f70: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( pName ){.     
7f80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
7f90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
7fa0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54  o such table: %T
7fb0: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", pName);.     
7fc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7fd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72          sqliteEr
7fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7ff0: 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
8000: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
8010: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
8020: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
8030: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8040: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
8050: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
8060: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
8070: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
8080: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8090: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
80a0: 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20  rsively unlinks 
80b0: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e  the Select.pSrc.
80c0: 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72  a[].pTab pointer
80d0: 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74  s.** in a select
80e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
80f0: 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 70 6f  just sets the po
8100: 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20  inters to NULL. 
8110: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
8120: 20 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e   is recursive in
8130: 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
8140: 69 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  if the Select.pS
8150: 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a  rc.a[].pSelect.*
8160: 2a 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  * pointer is not
8170: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74   NULL, this rout
8180: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65  ine is called re
8190: 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61  cursively on tha
81a0: 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  t pointer..**.**
81b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
81c0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53   called on the S
81d0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
81e0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a  that defines a.*
81f0: 2a 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20  * VIEW in order 
8200: 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64  to undo any bind
8210: 69 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20  ings to tables. 
8220: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
8230: 72 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  ry.** because th
8240: 6f 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74  ose tables might
8250: 20 62 65 20 44 52 4f 50 65 64 20 62 79 20 61 20   be DROPed by a 
8260: 73 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63  subsequent SQL c
8270: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68  ommand..** If th
8280: 65 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e  e bindings are n
8290: 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e  ot removed, then
82a0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
82b0: 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
82c0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  .** will be left
82d0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64   pointing to a d
82e0: 65 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65  eallocated Table
82f0: 20 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72   structure after
8300: 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64   the.** DROP and
8310: 20 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c   a coredump will
8320: 20 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74 20   occur the next 
8330: 74 69 6d 65 20 74 68 65 20 56 49 45 57 20 69 73  time the VIEW is
8340: 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
8350: 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e  qliteSelectUnbin
8360: 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  d(Select *p){.  
8370: 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
8380: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
8390: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
83a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
83b0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
83c0: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
83d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
83e0: 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  ab = pSrc->a[i].
83f0: 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  pTab)!=0 ){.    
8400: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72    if( pTab->isTr
8410: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
8420: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
8430: 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20  able(0, pTab);. 
8440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 72       }.      pSr
8450: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30  c->a[i].pTab = 0
8460: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
8470: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[i].pSelect )
8480: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8490: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 72  SelectUnbind(pSr
84a0: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  c->a[i].pSelect)
84b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
84c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
84d0: 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69  s routine associ
84e0: 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20  ates entries in 
84f0: 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  an ORDER BY expr
8500: 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  ession list with
8510: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  .** columns in a
8520: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61   result.  For ea
8530: 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  ch ORDER BY expr
8540: 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f  ession, the opco
8550: 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  de of.** the top
8560: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63  -level node is c
8570: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
8580: 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c  UMN and the iCol
8590: 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  umn value of.** 
85a0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
85b0: 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  de is filled in 
85c0: 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  with column numb
85d0: 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c  er and the iTabl
85e0: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
85f0: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
8600: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
8610: 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72  iTable parameter
8620: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
8630: 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43   are prior SELEC
8640: 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20  T clauses, they 
8650: 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69  are processed fi
8660: 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a  rst.  A match.**
8670: 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53   in an earlier S
8680: 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63  ELECT takes prec
8690: 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61  edence over a la
86a0: 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  ter SELECT..**.*
86b0: 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74  * Any entry that
86c0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
86d0: 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e  is flagged as an
86e0: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d   error.  The num
86f0: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
8700: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
8710: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8720: 20 64 6f 65 73 20 4e 4f 54 20 63 6f 72 72 65 63   does NOT correc
8730: 74 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  tly initialize t
8740: 68 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65  he Expr.dataType
8750: 20 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68    field.** of th
8760: 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  e ORDER BY expre
8770: 73 73 69 6f 6e 73 2e 20 20 54 68 65 20 6d 75 6c  ssions.  The mul
8780: 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65  tiSelectSortOrde
8790: 72 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  r() routine.** m
87a0: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
87b0: 20 64 6f 20 74 68 61 74 20 61 66 74 65 72 20 74   do that after t
87c0: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  he individual se
87d0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 0a  lect statements.
87e0: 2a 2a 20 68 61 76 65 20 61 6c 6c 20 62 65 65 6e  ** have all been
87f0: 20 61 6e 61 6c 79 7a 65 64 2e 20 20 54 68 69 73   analyzed.  This
8800: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 61 62   routine is unab
8810: 6c 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 45 78  le to compute Ex
8820: 70 72 2e 64 61 74 61 54 79 70 65 0a 2a 2a 20 62  pr.dataType.** b
8830: 65 63 61 75 73 65 20 69 74 20 6d 75 73 74 20 62  ecause it must b
8840: 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
8850: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73  the individual s
8860: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
8870: 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 6e  .** have been an
8880: 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  alyzed..*/.stati
8890: 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72  c int matchOrder
88a0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  byToColumn(.  Pa
88b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
88c0: 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65        /* A place
88d0: 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20   to leave error 
88e0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65  messages */.  Se
88f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
8900: 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
8910: 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  o result columns
8920: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
8930: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8940: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
8950: 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c  The ORDER BY val
8960: 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61  ues to match aga
8970: 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  inst columns */.
8980: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
8990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
89a0: 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69  ert this value i
89b0: 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  n iTable */.  in
89c0: 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20  t mustComplete  
89d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45        /* If TRUE
89e0: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d   all ORDER BYs m
89f0: 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a  ust match */.){.
8a00: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
8a10: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
8a20: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
8a30: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d  .  if( pSelect==
8a40: 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 || pOrderBy==0
8a50: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8a60: 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  f( mustComplete 
8a70: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
8a80: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
8a90: 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42  r; i++){ pOrderB
8aa0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
8ab0: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  ; }.  }.  if( fi
8ac0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
8ad0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
8ae0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
8af0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
8b00: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
8b10: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
8b20: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
8b30: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
8b40: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
8b50: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
8b60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
8b70: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
8b80: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
8b90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8ba0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8bb0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
8bc0: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
8bd0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
8be0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  nt iCol = -1;.  
8bf0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
8c00: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
8c10: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
8c20: 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65  liteExprIsIntege
8c30: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
8c40: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d        if( iCol<=
8c50: 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
8c60: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
8c70: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
8c80: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
8c90: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f      "ORDER BY po
8ca0: 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64  sition %d should
8cb0: 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e   be between 1 an
8cc0: 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
8cd0: 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
8ce0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  Expr);.        n
8cf0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  Err++;.        b
8d00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8d10: 20 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d      if( !mustCom
8d20: 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65  plete ) continue
8d30: 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a  ;.      iCol--;.
8d40: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d      }.    for(j=
8d50: 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70  0; iCol<0 && j<p
8d60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
8d70: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
8d80: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
8d90: 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   && (pE->op==TK_
8da0: 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b  ID || pE->op==TK
8db0: 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20  _STRING) ){.    
8dc0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c      char *zName,
8dd0: 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20   *zLabel;.      
8de0: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
8df0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
8e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
8e10: 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20  ->token.z );.   
8e20: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71       zLabel = sq
8e30: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 2d 3e  liteStrNDup(pE->
8e40: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b  token.z, pE->tok
8e50: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  en.n);.        s
8e60: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 61  qliteDequote(zLa
8e70: 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  bel);.        if
8e80: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
8e90: 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d  zName, zLabel)==
8ea0: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
8eb0: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
8ec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
8ed0: 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a  teFree(zLabel);.
8ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8ef0: 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69  ( iCol<0 && sqli
8f00: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  teExprCompare(pE
8f10: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  , pEList->a[j].p
8f20: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
8f30: 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20   iCol = j;.     
8f40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8f50: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
8f60: 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f    pE->op = TK_CO
8f70: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e  LUMN;.      pE->
8f80: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
8f90: 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65        pE->iTable
8fa0: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20   = iTable;.     
8fb0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
8fc0: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  done = 1;.    }.
8fd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
8fe0: 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  & mustComplete )
8ff0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72  {.      sqliteEr
9000: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
9010: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
9020: 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20   term number %d 
9030: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
9040: 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
9050: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e  ", i+1);.      n
9060: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65  Err++;.      bre
9070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
9080: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
9090: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
90a0: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
90b0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
90c0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
90d0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
90e0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
90f0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
9100: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
9110: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
9120: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
9130: 74 65 47 65 74 56 64 62 65 28 50 61 72 73 65 20  teGetVdbe(Parse 
9140: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
9150: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
9160: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
9170: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
9180: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
9190: 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  eVdbeCreate(pPar
91a0: 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72  se->db);.  }.  r
91b0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn v;.}../*.*
91c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
91d0: 65 74 73 20 74 68 65 20 45 78 70 72 2e 64 61 74  ets the Expr.dat
91e0: 61 54 79 70 65 20 66 69 65 6c 64 20 6f 6e 20 61  aType field on a
91f0: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 2a  ll elements of.*
9200: 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 65  * the pOrderBy e
9210: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
9220: 20 54 68 65 20 70 4f 72 64 65 72 42 79 20 6c 69   The pOrderBy li
9230: 73 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  st will have bee
9240: 6e 0a 2a 2a 20 73 65 74 20 75 70 20 62 79 20 6d  n.** set up by m
9250: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
9260: 75 6d 6e 28 29 2e 20 20 48 65 6e 63 65 20 65 61  umn().  Hence ea
9270: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  ch expression ha
9280: 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e  s.** a TK_COLUMN
9290: 20 61 73 20 69 74 73 20 72 6f 6f 74 20 6e 6f 64   as its root nod
92a0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
92b0: 6c 75 6d 6e 20 72 65 66 65 72 73 20 74 6f 20 61  lumn refers to a
92c0: 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   .** column in t
92d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
92e0: 20 54 68 65 20 64 61 74 61 74 79 70 65 20 69 73   The datatype is
92f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 53   set to SQLITE_S
9300: 4f 5f 54 45 58 54 0a 2a 2a 20 69 66 20 74 68 65  O_TEXT.** if the
9310: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
9320: 6f 6c 75 6d 6e 20 69 6e 20 70 20 61 6e 64 20 65  olumn in p and e
9330: 76 65 72 79 20 53 45 4c 45 43 54 20 74 6f 20 74  very SELECT to t
9340: 68 65 20 6c 65 66 74 20 6f 66 0a 2a 2a 20 70 20  he left of.** p 
9350: 68 61 73 20 61 20 64 61 74 61 74 79 70 65 20 6f  has a datatype o
9360: 66 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  f SQLITE_SO_TEXT
9370: 2e 20 20 49 66 20 74 68 65 20 63 6f 6f 72 65 73  .  If the coores
9380: 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 0a  sponding column.
9390: 2a 2a 20 69 6e 20 70 20 6f 72 20 61 6e 79 20 6f  ** in p or any o
93a0: 66 20 74 68 65 20 6c 65 66 74 20 53 45 4c 45 43  f the left SELEC
93b0: 54 73 20 69 73 20 53 51 4c 49 54 45 5f 53 4f 5f  Ts is SQLITE_SO_
93c0: 4e 55 4d 2c 20 74 68 65 6e 20 74 68 65 20 64 61  NUM, then the da
93d0: 74 61 74 79 70 65 0a 2a 2a 20 6f 66 20 74 68 65  tatype.** of the
93e0: 20 6f 72 64 65 72 2d 62 79 20 65 78 70 72 65 73   order-by expres
93f0: 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 53  sion is set to S
9400: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a  QLITE_SO_NUM..**
9410: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  .** Examples:.**
9420: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
9430: 41 42 4c 45 20 6f 6e 65 28 61 20 49 4e 54 45 47  ABLE one(a INTEG
9440: 45 52 2c 20 62 20 54 45 58 54 29 3b 0a 2a 2a 20  ER, b TEXT);.** 
9450: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9460: 20 74 77 6f 28 63 20 56 41 52 43 48 41 52 28 35   two(c VARCHAR(5
9470: 29 2c 20 64 20 46 4c 4f 41 54 29 3b 0a 2a 2a 0a  ), d FLOAT);.**.
9480: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 62 2c  **     SELECT b,
9490: 20 62 20 46 52 4f 4d 20 6f 6e 65 20 55 4e 49 4f   b FROM one UNIO
94a0: 4e 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52  N SELECT d, c FR
94b0: 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20  OM two ORDER BY 
94c0: 31 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  1, 2;.**.** The 
94d0: 70 72 69 6d 61 72 79 20 73 6f 72 74 20 6b 65 79  primary sort key
94e0: 20 77 69 6c 6c 20 75 73 65 20 53 51 4c 49 54 45   will use SQLITE
94f0: 5f 53 4f 5f 4e 55 4d 20 62 65 63 61 75 73 65 20  _SO_NUM because 
9500: 74 68 65 20 22 64 22 20 69 6e 0a 2a 2a 20 74 68  the "d" in.** th
9510: 65 20 73 65 63 6f 6e 64 20 53 45 4c 45 43 54 20  e second SELECT 
9520: 69 73 20 6e 75 6d 65 72 69 63 2e 20 20 54 68 65  is numeric.  The
9530: 20 31 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   1st column of t
9540: 68 65 20 66 69 72 73 74 20 53 45 4c 45 43 54 0a  he first SELECT.
9550: 2a 2a 20 69 73 20 74 65 78 74 20 62 75 74 20 74  ** is text but t
9560: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
9570: 74 65 72 20 62 65 63 61 75 73 65 20 61 20 6e 75  ter because a nu
9580: 6d 65 72 69 63 20 61 6c 77 61 79 73 20 6f 76 65  meric always ove
9590: 72 72 69 64 65 73 0a 2a 2a 20 61 20 74 65 78 74  rrides.** a text
95a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
95b0: 6e 64 61 72 79 20 6b 65 79 20 77 69 6c 6c 20 75  ndary key will u
95c0: 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 53 4f  se the SQLITE_SO
95d0: 5f 54 45 58 54 20 73 6f 72 74 20 6f 72 64 65 72  _TEXT sort order
95e0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 62 6f 74 68   because.** both
95f0: 20 74 68 65 20 28 73 65 63 6f 6e 64 29 20 22 62   the (second) "b
9600: 22 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 53  " in the first S
9610: 45 4c 45 43 54 20 61 6e 64 20 74 68 65 20 22 63  ELECT and the "c
9620: 22 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  " in the second.
9630: 2a 2a 20 53 45 4c 45 43 54 20 68 61 76 65 20 61  ** SELECT have a
9640: 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 65 78   datatype of tex
9650: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
9660: 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f  id multiSelectSo
9670: 72 74 4f 72 64 65 72 28 53 65 6c 65 63 74 20 2a  rtOrder(Select *
9680: 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  p, ExprList *pOr
9690: 64 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b  derBy){.  int i;
96a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
96b0: 69 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ist;.  if( pOrde
96c0: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  rBy==0 ) return;
96d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
96e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
96f0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9700: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ++){.      pOrde
9710: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  rBy->a[i].pExpr-
9720: 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49  >dataType = SQLI
9730: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
9740: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
9750: 7d 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53  }.  multiSelectS
9760: 6f 72 74 4f 72 64 65 72 28 70 2d 3e 70 50 72 69  ortOrder(p->pPri
9770: 6f 72 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  or, pOrderBy);. 
9780: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
9790: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
97a0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
97b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
97c0: 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
97d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
97e0: 20 20 69 66 28 20 70 45 2d 3e 64 61 74 61 54 79    if( pE->dataTy
97f0: 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  pe==SQLITE_SO_NU
9800: 4d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  M ) continue;.  
9810: 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 69 43    assert( pE->iC
9820: 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20  olumn>=0 );.    
9830: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
9840: 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  r>pE->iColumn ){
9850: 0a 20 20 20 20 20 20 70 45 2d 3e 64 61 74 61 54  .      pE->dataT
9860: 79 70 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ype = sqliteExpr
9870: 54 79 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b 70  Type(pEList->a[p
9880: 45 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  E->iColumn].pExp
9890: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
98a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
98b0: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
98c0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
98d0: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
98e0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69   on the.** nLimi
98f0: 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66 69  t and nOffset fi
9900: 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e  elds.  nLimit an
9910: 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d nOffset hold t
9920: 68 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74  he integers.** t
9930: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
9940: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
9950: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
9960: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
9970: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
9980: 20 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20 2d    Or that hold -
9990: 31 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73 65  1 and 0 if those
99a0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
99b0: 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74  itted..** iLimit
99c0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
99d0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
99e0: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
99f0: 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e  bers for.** coun
9a00: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
9a10: 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 61  pute the limit a
9a20: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
9a30: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69  here is no.** li
9a40: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
9a50: 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20 61  t, then iLimit a
9a60: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
9a70: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
9a80: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
9a90: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69  ges the values i
9aa0: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
9ab0: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
9ac0: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
9ad0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
9ae0: 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73  nLimit and nOffs
9af0: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
9b00: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
9b10: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
9b20: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
9b30: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
9b40: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
9b50: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
9b60: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
9b70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
9b80: 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74  * Only if nLimit
9b90: 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30  >=0 or nOffset>0
9ba0: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
9bb0: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
9bc0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
9bd0: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
9be0: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
9bf0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
9c00: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
9c10: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
9c20: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
9c30: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
9c40: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
9c50: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
9c60: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
9c70: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
9c80: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
9c90: 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20  ct *p){.  /* .  
9ca0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72  ** If the compar
9cb0: 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69  ison is p->nLimi
9cc0: 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20  t>0 then "LIMIT 
9cd0: 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c  0" shows.  ** al
9ce0: 6c 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20 74  l rows.  It is t
9cf0: 68 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69  he same as no li
9d00: 6d 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d 70  mit. If the comp
9d10: 61 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  arision is.  ** 
9d20: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65  p->nLimit>=0 the
9d30: 6e 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77  n "LIMIT 0" show
9d40: 20 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e   no rows at all.
9d50: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
9d60: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
9d70: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
9d80: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
9d90: 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  raversy about wh
9da0: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
9db0: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
9dc0: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
9dd0: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
9de0: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
9df0: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
9e00: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
9e10: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d  */.  if( p->nLim
9e20: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  it>=0 ){.    int
9e30: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
9e40: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65  nMem++;.    Vdbe
9e50: 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   *v = sqliteGetV
9e60: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
9e70: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
9e80: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  rn;.    sqliteVd
9e90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9ea0: 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69  teger, -p->nLimi
9eb0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
9ec0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9ed0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
9ee0: 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d   1);.    p->iLim
9ef0: 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20  it = iMem;.  }. 
9f00: 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e   if( p->nOffset>
9f10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65  0 ){.    int iMe
9f20: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
9f30: 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  ++;.    Vdbe *v 
9f40: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
9f50: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
9f60: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
9f70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9f80: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9f90: 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20  r, -p->nOffset, 
9fa0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
9fb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
9fc0: 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29  mStore, iMem, 1)
9fd0: 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74  ;.    p->iOffset
9fe0: 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a   = iMem;.  }.}..
9ff0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a000: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a010: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
a020: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
a030: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
a040: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
a050: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
a060: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  ate queries..**.
a070: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
a080: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
a090: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
a0a0: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
a0b0: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
a0c0: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
a0d0: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
a0e0: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
a0f0: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
a100: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
a110: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
a120: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
a130: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
a140: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
a150: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
a160: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
a170: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
a180: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
a190: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
a1a0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
a1b0: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
a1c0: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
a1d0: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
a1e0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
a1f0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
a200: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
a210: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
a220: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
a230: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
a240: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
a250: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
a260: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
a270: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
a280: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
a290: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
a2a0: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
a2b0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
a2c0: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
a2d0: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
a2e0: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
a2f0: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
a300: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
a310: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
a320: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
a330: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
a340: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a350: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
a360: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
a370: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
a380: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
a390: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
a3a0: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
a3b0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
a3c0: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
a3d0: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
a3e0: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
a3f0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
a400: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
a410: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
a420: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
a430: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
a440: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
a450: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
a460: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
a470: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
a480: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  m){.  int rc;   
a490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63            /* Suc
a4a0: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
a4b0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
a4c0: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
a4d0: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
a4e0: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
a4f0: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
a500: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
a510: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
a520: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
a530: 20 56 44 42 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d   VDBE */..  /* M
a540: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
a550: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
a560: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
a570: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
a580: 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
a590: 61 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68  ast SELECT in th
a5a0: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
a5b0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
a5c0: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69   LIMIT..  */.  i
a5d0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50  f( p==0 || p->pP
a5e0: 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
a5f0: 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70   1;.  pPrior = p
a600: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20  ->pPrior;.  if( 
a610: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
a620: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72   ){.    sqliteEr
a630: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
a640: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
a650: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
a660: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
a670: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
a680: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
a690: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
a6a0: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69   if( pPrior->nLi
a6b0: 6d 69 74 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72  mit>=0 || pPrior
a6c0: 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ->nOffset>0 ){. 
a6d0: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
a6e0: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
a6f0: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
a700: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
a710: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
a720: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
a730: 70 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  p));.    return 
a740: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  1;.  }..  /* Mak
a750: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
a760: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
a770: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
a780: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
a790: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
a7a0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
a7b0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
a7c0: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43  eturn 1;..  /* C
a7d0: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
a7e0: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
a7f0: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
a800: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ry.  */.  if( eD
a810: 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
a820: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
a830: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a840: 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c  OpenTemp, iParm,
a850: 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d   0);.    eDest =
a860: 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
a870: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
a880: 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
a890: 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
a8a0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
a8b0: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
a8c0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a8d0: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
a8e0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
a8f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72  0 ){.        pPr
a900: 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d  ior->nLimit = p-
a910: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >nLimit;.       
a920: 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74   pPrior->nOffset
a930: 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   = p->nOffset;. 
a940: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a950: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
a960: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
a970: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b  iParm, 0, 0, 0);
a980: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
a990: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
a9a0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
a9b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   0;.        p->i
a9c0: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
a9d0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
a9e0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
a9f0: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
aa00: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
aa10: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d  = -1;.        p-
aa20: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
aa30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aa40: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
aa50: 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
aa60: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
aa70: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
aa80: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
aa90: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
aaa0: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
aab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aac0: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
aad0: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
aae0: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
aaf0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
ab00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ab10: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
ab20: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
ab30: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
ab40: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
ab50: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
ab60: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
ab70: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
ab80: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
ab90: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
aba0: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
abb0: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
abc0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
abd0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
abe0: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
abf0: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
ac00: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
ac10: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  /.      int nLim
ac20: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20  it, nOffset; /* 
ac30: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
ac40: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
ac50: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
ac60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
ac70: 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52  erBy;  /* The OR
ac80: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
ac90: 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45  r the right SELE
aca0: 43 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69  CT */..      pri
acb0: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
acc0: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
acd0: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
ace0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
acf0: 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72  riorOp && p->pOr
ad00: 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e  derBy==0 && p->n
ad10: 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f  Limit<0 && p->nO
ad20: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
ad30: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
ad40: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
ad50: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
ad60: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
ad70: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
ad80: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
ad90: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
ada0: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20   = iParm;.      
adb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
adc0: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
add0: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
ade0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
adf0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
ae00: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
ae10: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
ae20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
ae30: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
ae40: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
ae50: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
ae60: 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20  rBy .        && 
ae70: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
ae80: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
ae90: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p->pOrderBy, uni
aea0: 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20  onTab, 1) ){.   
aeb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
aec0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aed0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b     if( p->op!=TK
aee0: 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _ALL ){.        
aef0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
af00: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
af10: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a  , unionTab, 1);.
af20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
af30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af40: 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e  KeyAsData, union
af50: 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Tab, 1);.       
af60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
af70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
af80: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
af90: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
afa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
afb0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
afc0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
afd0: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
afe0: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
aff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
b000: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
b010: 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  or, priorOp, uni
b020: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b  onTab, 0, 0, 0);
b030: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
b040: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
b050: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
b060: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
b070: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
b080: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
b090: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
b0a0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
b0b0: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
b0c0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
b0d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
b0e0: 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e  N:   op = SRT_Un
b0f0: 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ion;    break;. 
b100: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
b110: 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52  ALL:     op = SR
b120: 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61  T_Table;    brea
b130: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
b140: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
b150: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
b160: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
b170: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
b180: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69  = 0;.      nLimi
b190: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
b1a0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
b1b0: 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73   -1;.      nOffs
b1c0: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
b1d0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
b1e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
b1f0: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
b200: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
b210: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29  ionTab, 0, 0, 0)
b220: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
b230: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
b240: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
b250: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
b260: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  p->nLimit = nLim
b270: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66  it;.      p->nOf
b280: 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a  fset = nOffset;.
b290: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
b2a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
b2b0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
b2c0: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
b2d0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
b2e0: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
b2f0: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
b300: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
b310: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
b320: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
b330: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
b340: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
b350: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b360: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
b370: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
b380: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
b390: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b3a0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
b3b0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
b3c0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
b3d0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
b3e0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
b3f0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
b400: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
b410: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
b420: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
b430: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
b440: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
b450: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
b460: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
b470: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
b480: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b490: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b4a0: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
b4b0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
b4c0: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
b4d0: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
b4e0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74   p);.        iSt
b4f0: 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  art = sqliteVdbe
b500: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
b510: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c          multiSel
b520: 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20  ectSortOrder(p, 
b530: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
b540: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
b550: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
b560: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
b570: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
b580: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5a0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
b5b0: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
b5c0: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
b5f0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
b600: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31  f( rc ) return 1
b610: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b620: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b630: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
b640: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b650: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
b660: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
b670: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b680: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
b690: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
b6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b6b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b6c0: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
b6d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b6e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
b6f0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
b700: 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e  rtTail(p, v, p->
b710: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
b720: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
b730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b750: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
b760: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
b770: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
b780: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
b790: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
b7a0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  t;.      int nLi
b7b0: 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 0a 20  mit, nOffset;.. 
b7c0: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
b7d0: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
b7e0: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
b7f0: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
b800: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
b810: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
b820: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
b830: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
b840: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
b850: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
b860: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
b870: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
b880: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
b890: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
b8a0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
b8b0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
b8c0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d  p->pOrderBy && m
b8d0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
b8e0: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e  umn(pParse,p,p->
b8f0: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
b900: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
b910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
b920: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b930: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
b940: 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20  mp, tab1, 1);.  
b950: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b960: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
b970: 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a  ata, tab1, 1);..
b980: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
b990: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
b9a0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
b9b0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
b9c0: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
b9d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
b9e0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
b9f0: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
ba00: 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ab1, 0, 0, 0);. 
ba10: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
ba20: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
ba30: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
ba40: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
ba50: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ba60: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
ba70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ba80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
ba90: 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b 0a  Temp, tab2, 1);.
baa0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
bab0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
bac0: 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b  sData, tab2, 1);
bad0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
bae0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d   = 0;.      nLim
baf0: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
bb00: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
bb10: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66  = -1;.      nOff
bb20: 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74  set = p->nOffset
bb30: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73  ;.      p->nOffs
bb40: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  et = 0;.      rc
bb50: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
bb60: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
bb70: 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30  nion, tab2, 0, 0
bb80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
bb90: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
bba0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
bbb0: 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
bbc0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66  p->nOffset = nOf
bbd0: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
bbe0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
bbf0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
bc00: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
bc10: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
bc20: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
bc30: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
bc40: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
bc50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
bc60: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
bc70: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
bc80: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
bc90: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
bca0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
bcb0: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
bcc0: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
bcd0: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
bce0: 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70  e, p->pSrc, p->p
bcf0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
bd00: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
bd10: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
bd20: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
bd30: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
bd40: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
bd50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
bd60: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
bd70: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
bd80: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
bd90: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
bda0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53  se, p);.      iS
bdb0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62  tart = sqliteVdb
bdc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c  eAddOp(v, OP_Ful
bdd0: 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lKey, tab1, 0);.
bde0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
bdf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
be00: 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
be10: 74 29 3b 0a 20 20 20 20 20 20 6d 75 6c 74 69 53  t);.      multiS
be20: 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70  electSortOrder(p
be30: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
be40: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
be50: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
be60: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
be70: 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74   tab1, p->pEList
be80: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
beb0: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
bec0: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
bef0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
bf00: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
bf10: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
bf20: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
bf30: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
bf40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bf50: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
bf60: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
bf70: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
bf80: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
bf90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
bfa0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
bfb0: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
bfc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
bfd0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
bfe0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  b1, 0);.      if
bff0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
c000: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
c010: 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
c020: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
c030: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
c040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c050: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c060: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c070: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
c080: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
c090: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
c0a0: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
c0b0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
c0c0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
c0d0: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
c0e0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
c0f0: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
c100: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
c110: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
c120: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
c130: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
c140: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74  p->op));.    ret
c150: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
c160: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c170: 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
c180: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
c190: 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
c1a0: 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
c1b0: 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
c1c0: 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
c1d0: 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
c1e0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
c1f0: 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
c200: 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
c210: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
c220: 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
c230: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
c240: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c250: 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
c260: 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
c270: 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
c280: 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
c290: 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
c2a0: 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
c2b0: 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
c2c0: 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
c2d0: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
c2e0: 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
c2f0: 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
c300: 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
c310: 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
c320: 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
c330: 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
c340: 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
c350: 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
c360: 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
c370: 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
c380: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
c390: 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
c3a0: 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
c3b0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
c3c0: 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
c3d0: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
c3e0: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c  rList(ExprList*,
c3f0: 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20  int,ExprList*); 
c400: 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c   /* Forward Decl
c410: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
c420: 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a  substExpr(Expr *
c430: 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c  pExpr, int iTabl
c440: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
c450: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70  ist){.  if( pExp
c460: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
c470: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
c480: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
c490: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
c4a0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
c4b0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
c4c0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
c4d0: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
c4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
c4f0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
c500: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
c510: 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
c520: 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
c530: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
c540: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
c550: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
c560: 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
c570: 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
c580: 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
c590: 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
c5a0: 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
c5b0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30   assert( pNew!=0
c5c0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
c5d0: 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a  >op = pNew->op;.
c5e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
c5f0: 61 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61  aType = pNew->da
c600: 74 61 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73  taType;.      as
c610: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
c620: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
c630: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
c640: 6c 69 74 65 45 78 70 72 44 75 70 28 70 4e 65 77  liteExprDup(pNew
c650: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c660: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
c670: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
c680: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
c690: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
c6a0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
c6b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
c6c0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
c6d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
c6e0: 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  st = sqliteExprL
c6f0: 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69  istDup(pNew->pLi
c700: 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  st);.      pExpr
c710: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
c720: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
c730: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
c740: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
c750: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
c760: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
c770: 20 20 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e       sqliteToken
c780: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Copy(&pExpr->tok
c790: 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
c7a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 54  );.      sqliteT
c7b0: 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d  okenCopy(&pExpr-
c7c0: 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70  >span, &pNew->sp
c7d0: 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  an);.    }.  }el
c7e0: 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
c7f0: 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
c800: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
c810: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
c820: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
c830: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
c840: 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
c850: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69  (pExpr->pList, i
c860: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
c870: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
c880: 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73 74  d .substExprList
c890: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
c8a0: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
c8b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
c8c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
c8d0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
c8e0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
c8f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
c900: 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
c910: 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  r(pList->a[i].pE
c920: 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
c930: 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ist);.  }.}../*.
c940: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c950: 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
c960: 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
c970: 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
c980: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
c990: 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
c9a0: 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
c9b0: 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
c9c0: 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
c9d0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
c9e0: 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
c9f0: 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
ca00: 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
ca10: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
ca20: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
ca30: 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
ca40: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
ca50: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
ca60: 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
ca70: 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
ca80: 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
ca90: 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
caa0: 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
cab0: 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
cac0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
cad0: 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
cae0: 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
caf0: 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
cb00: 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
cb10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
cb20: 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
cb30: 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
cb40: 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
cb50: 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
cb60: 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
cb70: 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
cb80: 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
cb90: 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
cba0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
cbb0: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
cbc0: 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
cbd0: 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
cbe0: 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
cbf0: 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
cc00: 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
cc10: 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
cc20: 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
cc30: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
cc40: 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
cc50: 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
cc60: 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
cc70: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
cc80: 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
cc90: 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
cca0: 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
ccb0: 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
ccc0: 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
ccd0: 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
cce0: 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
ccf0: 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
cd00: 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
cd10: 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
cd20: 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
cd30: 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
cd40: 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
cd50: 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
cd60: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
cd70: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
cd80: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
cd90: 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
cda0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
cdb0: 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
cdc0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
cdd0: 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
cde0: 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
cdf0: 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
ce00: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
ce10: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
ce20: 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
ce30: 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
ce40: 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
ce50: 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
ce60: 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74  , or.**        t
ce70: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
ce80: 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e  ot itself a join
ce90: 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29  .  (Ticket #306)
cea0: 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
ceb0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
cec0: 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
ced0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
cee0: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
cef0: 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75  **   (5)  The su
cf00: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
cf10: 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
cf20: 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
cf30: 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
cf40: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
cf50: 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
cf60: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
cf70: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
cf80: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
cf90: 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
cfa0: 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
cfb0: 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
cfc0: 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
cfd0: 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
cfe0: 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
cff0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
d000: 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
d010: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
d020: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
d030: 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
d040: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
d050: 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
d060: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
d070: 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
d080: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
d090: 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
d0a0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
d0b0: 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
d0c0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d0d0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
d0e0: 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
d0f0: 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
d100: 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
d110: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
d120: 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
d130: 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
d140: 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65  **.**  (12)  The
d150: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
d160: 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
d170: 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
d180: 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20  JOIN or the.**  
d190: 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68        subquery h
d1a0: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
d1b0: 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74  se.  (added by t
d1c0: 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a  icket #350).**.*
d1d0: 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
d1e0: 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
d1f0: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
d200: 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
d210: 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
d220: 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
d230: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
d240: 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
d250: 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
d260: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
d270: 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
d280: 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
d290: 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
d2a0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
d2b0: 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
d2c0: 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
d2d0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
d2e0: 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
d2f0: 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
d300: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
d310: 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
d320: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
d330: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
d340: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
d350: 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
d360: 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
d370: 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
d380: 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
d390: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
d3a0: 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
d3b0: 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
d3c0: 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
d3d0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
d3e0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
d3f0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
d400: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
d410: 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
d420: 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
d430: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
d440: 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
d450: 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
d460: 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
d470: 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
d480: 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
d490: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
d4a0: 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
d4b0: 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
d4c0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
d4d0: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
d4e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
d4f0: 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
d500: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
d510: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ns */.){.  Selec
d520: 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
d530: 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
d540: 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
d550: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
d560: 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
d570: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
d580: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
d590: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
d5a0: 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
d5b0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
d5c0: 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
d5d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
d5e0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
d5f0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
d600: 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
d610: 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
d620: 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
d630: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
d640: 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
d650: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
d660: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 57  nt i;.  Expr *pW
d670: 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  here;..  /* Chec
d680: 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
d690: 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
d6a0: 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
d6b0: 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  f not..  */.  if
d6c0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
d6d0: 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
d6e0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
d6f0: 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
d700: 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
d710: 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20  Src );.  pSub = 
d720: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
d730: 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
d740: 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
d750: 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
d760: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
d770: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71  rn 0;.  if( subq
d780: 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
d790: 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
d7a0: 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20  rn 0;.  pSubSrc 
d7b0: 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
d7c0: 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
d7d0: 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  );.  if( pSubSrc
d7e0: 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
d7f0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75  rn 0;.  if( (pSu
d800: 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  b->isDistinct ||
d810: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   pSub->nLimit>=0
d820: 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72  ) &&  (pSrc->nSr
d830: 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
d840: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
d850: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73    }.  if( (p->is
d860: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e  Distinct || p->n
d870: 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62  Limit>=0) && sub
d880: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
d890: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
d8a0: 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
d8b0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
d8c0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73  urn 0;..  /* Res
d8d0: 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
d8e0: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
d8f0: 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
d900: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
d910: 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
d920: 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
d930: 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
d940: 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
d950: 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
d960: 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
d970: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
d980: 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
d990: 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
d9a0: 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
d9b0: 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
d9c0: 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
d9d0: 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
d9e0: 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
d9f0: 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
da00: 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
da10: 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
da20: 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
da30: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ing..  */.  if( 
da40: 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
da50: 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  && iFrom>0 && (p
da60: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e  Src->a[iFrom-1].
da70: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
da80: 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
da90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
daa0: 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
dab0: 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
dac0: 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
dad0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
dae0: 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
daf0: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
db00: 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
db10: 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
db20: 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
db30: 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
db40: 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
db50: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
db60: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
db70: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
db80: 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
db90: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
dba0: 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
dbb0: 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
dbc0: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
dbd0: 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
dbe0: 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
dbf0: 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
dc00: 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
dc10: 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
dc20: 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
dc30: 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
dc40: 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
dc50: 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
dc60: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
dc70: 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
dc80: 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d    */.  if( iFrom
dc90: 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69  >0 && (pSrc->a[i
dca0: 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  From-1].jointype
dcb0: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
dcc0: 0a 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e  .      && pSub->
dcd0: 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20  pWhere!=0 ){.   
dce0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
dcf0: 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
dd00: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
dd10: 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67  means flattening
dd20: 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f   is permitted fo
dd30: 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d  r the.  ** iFrom
dd40: 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
dd50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
dd60: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
dd70: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65  .  */..  /* Move
dd80: 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
dd90: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
dda0: 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
ddb0: 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
ddc0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
ddd0: 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
dde0: 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
ddf0: 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
de00: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
de10: 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
de20: 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
de30: 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
de40: 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
de50: 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
de60: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
de70: 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
de80: 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
de90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
dea0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
deb0: 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
dec0: 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
ded0: 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
dee0: 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
def0: 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
df00: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
df10: 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
df20: 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
df30: 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ing in..  */.  i
df40: 50 61 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61  Parent = pSrc->a
df50: 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  [iFrom].iCursor;
df60: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  .  {.    int nSu
df70: 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e  bSrc = pSubSrc->
df80: 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f  nSrc;.    int jo
df90: 69 6e 74 79 70 65 20 3d 20 70 53 72 63 2d 3e 61  intype = pSrc->a
dfa0: 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
dfb0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ;..    if( pSrc-
dfc0: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26  >a[iFrom].pTab &
dfd0: 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  & pSrc->a[iFrom]
dfe0: 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65  .pTab->isTransie
dff0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
e000: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
e010: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
e020: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
e030: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63   sqliteFree(pSrc
e040: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61 74 61  ->a[iFrom].zData
e050: 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
e060: 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46  eFree(pSrc->a[iF
e070: 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  rom].zName);.   
e080: 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63   sqliteFree(pSrc
e090: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61  ->a[iFrom].zAlia
e0a0: 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62  s);.    if( nSub
e0b0: 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  Src>1 ){.      i
e0c0: 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53  nt extra = nSubS
e0d0: 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f  rc - 1;.      fo
e0e0: 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=1; i<nSubSrc
e0f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e100: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 53 72 63  pSrc = sqliteSrc
e110: 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c  ListAppend(pSrc,
e120: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
e130: 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20        p->pSrc = 
e140: 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
e150: 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
e160: 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
e170: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
e180: 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
e190: 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
e1a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
e1b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
e1c0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
e1d0: 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
e1e0: 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
e1f0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
e200: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
e210: 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
e220: 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
e230: 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
e240: 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e  +nSubSrc-1].join
e250: 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
e260: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62  .  }..  /* Now b
e270: 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
e280: 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
e290: 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
e2a0: 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65  s for .  ** refe
e2b0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
e2c0: 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
e2d0: 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a  er query..  ** .
e2e0: 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
e2f0: 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  **.  **   SELECT
e300: 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
e310: 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
e320: 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
e330: 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
e340: 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
e360: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
e370: 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
e380: 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a            /.  **
e390: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
e3a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
e3b0: 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
e3c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e3d0: 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a  _____/.  **.  **
e3e0: 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
e3f0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
e400: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
e410: 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
e420: 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20  we see.  ** "a" 
e430: 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
e440: 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
e450: 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
e460: 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
e470: 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73  10"..  */.  subs
e480: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
e490: 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
e4a0: 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  ub->pEList);.  p
e4b0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
e4c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
e4d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
e4e0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
e4f0: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  pr;.    if( pLis
e500: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
e510: 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69   && (pExpr = pLi
e520: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d  st->a[i].pExpr)-
e530: 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  >span.z!=0 ){.  
e540: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
e550: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
e560: 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61  rNDup(pExpr->spa
e570: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e  n.z, pExpr->span
e580: 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .n);.    }.  }. 
e590: 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
e5a0: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
e5b0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  p->pGroupBy, iPa
e5c0: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
e5d0: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
e5e0: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
e5f0: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e600: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
e610: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
e620: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e630: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
e640: 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
e650: 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
e660: 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  y;.    pSub->pOr
e670: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
e680: 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  se if( p->pOrder
e690: 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  By ){.    substE
e6a0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
e6b0: 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
e6c0: 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
e6d0: 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68  .  if( pSub->pWh
e6e0: 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72  ere ){.    pWher
e6f0: 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  e = sqliteExprDu
e700: 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b  p(pSub->pWhere);
e710: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
e720: 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
e730: 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
e740: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
e750: 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
e760: 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
e770: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
e780: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
e790: 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45  here;.    substE
e7a0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
e7b0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
e7c0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
e7d0: 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b  pSub->pHaving ){
e7e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 48 61  .      Expr *pHa
e7f0: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70  ving = sqliteExp
e800: 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69  rDup(pSub->pHavi
e810: 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ng);.      if( p
e820: 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
e830: 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20       p->pHaving 
e840: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
e850: 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  AND, p->pHaving,
e860: 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20   pHaving, 0);.  
e870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e880: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
e890: 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d  pHaving;.      }
e8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e8b0: 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
e8c0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  0 );.    p->pGro
e8d0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70  upBy = sqliteExp
e8e0: 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
e8f0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
e900: 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d  e if( p->pWhere=
e910: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68  =0 ){.    p->pWh
e920: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
e930: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
e940: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
e950: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
e960: 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
e970: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
e980: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
e990: 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  teExpr(TK_AND, p
e9a0: 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
e9b0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
e9c0: 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65  .  /* The flatte
e9d0: 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
e9e0: 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
e9f0: 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
ea00: 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72  .  ** outer quer
ea10: 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
ea20: 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74    */.  p->isDist
ea30: 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
ea40: 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73  inct || pSub->is
ea50: 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20  Distinct;..  /* 
ea60: 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69 6d  Transfer the lim
ea70: 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  it expression fr
ea80: 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
ea90: 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a  to the outer.  *
eaa0: 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  * query..  */.  
eab0: 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  if( pSub->nLimit
eac0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
ead0: 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ->nLimit<0 ){.  
eae0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
eaf0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20  pSub->nLimit;.  
eb00: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
eb10: 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74  Limit+p->nOffset
eb20: 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b   > pSub->nLimit+
eb30: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b  pSub->nOffset ){
eb40: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
eb50: 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20   = pSub->nLimit 
eb60: 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  + pSub->nOffset 
eb70: 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  - p->nOffset;.  
eb80: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66    }.  }.  p->nOf
eb90: 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f  fset += pSub->nO
eba0: 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e  ffset;..  /* Fin
ebb0: 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
ebc0: 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
ebd0: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
ebe0: 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
ebf0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
ec00: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
ec10: 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
ec20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
ec30: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
ec40: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
ec50: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
ec60: 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
ec70: 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
ec80: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
ec90: 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
eca0: 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
ecb0: 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
ecc0: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
ecd0: 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
ece0: 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
ecf0: 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
ed00: 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
ed10: 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
ed20: 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
ed30: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
ed40: 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
ed50: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
ed60: 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
ed70: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
ed80: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
ed90: 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
eda0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
edb0: 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
edc0: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
edd0: 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
ede0: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
edf0: 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
ee00: 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
ee10: 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
ee20: 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
ee30: 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
ee40: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
ee50: 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
ee60: 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
ee70: 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
ee80: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
ee90: 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
eea0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
eeb0: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
eec0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
eed0: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
eee0: 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
eef0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
ef00: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
ef10: 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
ef20: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
ef30: 69 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  iteSelect()..** 
ef40: 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
ef50: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
ef60: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
ef70: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
ef80: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
ef90: 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
efa0: 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
efb0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
efc0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
efd0: 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
efe0: 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
eff0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
f000: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
f010: 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
f020: 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70  *v;.  int seekOp
f030: 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20  ;.  int cont;.  
f040: 45 78 70 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a  ExprList eList;.
f050: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
f060: 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d  t_item eListItem
f070: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
f080: 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
f090: 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
f0a0: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
f0b0: 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
f0c0: 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
f0d0: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
f0e0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
f0f0: 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
f100: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
f110: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72   0;.  if( p->pSr
f120: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
f130: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
f140: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
f150: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
f160: 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
f170: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
f180: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
f190: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
f1a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f1b0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
f1c0: 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   || pExpr->pList
f1d0: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
f1e0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
f1f0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29  pr->token.n!=3 )
f200: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f210: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
f220: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
f230: 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
f240: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
f250: 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
f260: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
f270: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
f280: 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
f290: 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
f2a0: 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
f2b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f2c0: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
f2d0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
f2e0: 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
f2f0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
f300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f   return 0;.  iCo
f310: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
f320: 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e  mn;.  pTab = p->
f330: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
f340: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
f350: 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
f360: 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
f370: 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
f380: 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
f390: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
f3a0: 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
f3b0: 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
f3c0: 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
f3d0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
f3e0: 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
f3f0: 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
f400: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
f410: 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
f420: 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
f430: 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
f440: 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
f450: 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
f460: 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
f470: 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
f480: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
f490: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
f4a0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
f4b0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f4c0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f4d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
f4e0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
f4f0: 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
f500: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
f510: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20  lumn[0]==iCol ) 
f520: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f530: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
f540: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f550: 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
f560: 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
f570: 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
f580: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
f590: 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
f5a0: 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
f5b0: 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
f5c0: 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
f5d0: 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54  ory cell..  ** T
f5e0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f5f0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f600: 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  n generated in t
f610: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
f620: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ion..  */.  v = 
f630: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
f640: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
f650: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f660: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
f670: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
f680: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
f690: 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  es(pParse, p->pS
f6a0: 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  rc, p->pEList);.
f6b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
f6c0: 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
f6d0: 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
f6e0: 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
f6f0: 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
f700: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
f710: 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
f720: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f730: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
f740: 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
f750: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
f760: 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
f770: 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
f780: 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
f790: 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
f7a0: 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
f7b0: 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
f7c0: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
f7d0: 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
f7e0: 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
f7f0: 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
f800: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
f810: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
f820: 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
f830: 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
f840: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
f850: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
f860: 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  eCodeVerifySchem
f870: 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  a(pParse, pTab->
f880: 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70  iDb);.  base = p
f890: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ->pSrc->a[0].iCu
f8a0: 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  rsor;.  computeL
f8b0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
f8c0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 73 71 6c 69  arse, p);.  sqli
f8d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f8e0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
f8f0: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  >iDb, 0);.  sqli
f900: 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  teVdbeOp3(v, OP_
f910: 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2c 20  OpenRead, base, 
f920: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pTab->tnum, pTab
f930: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 63  ->zName, 0);.  c
f940: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ont = sqliteVdbe
f950: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
f960: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20  if( pIdx==0 ){. 
f970: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f980: 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61  Op(v, seekOp, ba
f990: 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  se, 0);.  }else{
f9a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f9b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
f9c0: 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30  er, pIdx->iDb, 0
f9d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
f9e0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
f9f0: 65 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64  ead, base+1, pId
fa00: 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 7a  x->tnum, pIdx->z
fa10: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
fa20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
fa30: 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
fa40: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
fa50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
fa60: 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c  (v, OP_IdxRecno,
fa70: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
fa80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
fa90: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
faa0: 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  se+1, 0);.    sq
fab0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fac0: 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65   OP_MoveTo, base
fad0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73  , 0);.  }.  eLis
fae0: 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d  t.nExpr = 1;.  m
faf0: 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d  emset(&eListItem
fb00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73  , 0, sizeof(eLis
fb10: 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74  tItem));.  eList
fb20: 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b  .a = &eListItem;
fb30: 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45  .  eList.a[0].pE
fb40: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73  xpr = pExpr;.  s
fb50: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
fb60: 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74  Parse, p, &eList
fb70: 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65  , 0, 0, 0, -1, e
fb80: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e  Dest, iParm, con
fb90: 74 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  t, cont);.  sqli
fba0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
fbb0: 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73  el(v, cont);.  s
fbc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fbd0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
fbe0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  , 0);.  return 1
fbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
fc00: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
fc10: 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
fc20: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
fc30: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
fc40: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
fc50: 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
fc60: 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76  ding on the.** v
fc70: 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e  alue of eDest an
fc80: 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  d iParm..**.**  
fc90: 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20     eDest Value  
fca0: 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20       Result.**  
fcb0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
fcc0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
fcf0: 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
fd00: 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
fd10: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
fd20: 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
fd30: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
fd40: 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
fd50: 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
fd60: 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
fd70: 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  l iParm.**.**   
fd80: 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
fd90: 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
fda0: 61 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62  as keys of a tab
fdb0: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
fdc0: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
fdd0: 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
fde0: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
fdf0: 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
fe00: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
fe10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
fe20: 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
fe30: 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
fe40: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
fe50: 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
fe60: 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20      SRT_Table   
fe70: 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
fe80: 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
fe90: 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
fea0: 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65   The table above
feb0: 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20   is incomplete. 
fec0: 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73   Additional eDis
fed0: 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20  t value have be 
fee0: 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74  added.** since t
fef0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20  his comment was 
ff00: 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68  written.  See th
ff10: 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  e selectInnerLoo
ff20: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
ff30: 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c  .** a complete l
ff40: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c  isting of the al
ff50: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20  lowed values of 
ff60: 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20  eDest and their 
ff70: 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20  meanings..**.** 
ff80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
ff90: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
ffa0: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
ffb0: 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
ffc0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
ffd0: 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
ffe0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
fff0: 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
10000 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
10010 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10020 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
10030 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
10040 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
10050 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
10060 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
10070 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  o do that..**.**
10080 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61   The pParent, pa
10090 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50  rentTab, and *pP
100a0 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20  arentAgg fields 
100b0 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66  are filled in if
100c0 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20   this.** SELECT 
100d0 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20  is a subquery.  
100e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
100f0 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20   try to combine 
10100 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77  this SELECT.** w
10110 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74  ith its parent t
10120 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  o form a single 
10130 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20  flat query.  In 
10140 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67  so doing, it mig
10150 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65  ht.** change the
10160 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72   parent query fr
10170 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61  om a non-aggrega
10180 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61  te to an aggrega
10190 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72  te query..** For
101a0 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68   that reason, th
101b0 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61  e pParentAgg fla
101c0 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61  g is passed as a
101d0 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a   pointer, so it.
101e0 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
101f0 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  d..**.** Example
10200 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e   1:   The meanin
10210 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74  g of the pParent
10220 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
10230 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
10240 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45  OM t1 JOIN (SELE
10250 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46  CT x, count(*) F
10260 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b  ROM t2) JOIN t3;
10270 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20  .**    \        
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
10290 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
102a0 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
102b0 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20  /.**     \      
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f  /.**      \_____
10300 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
10310 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
10320 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
10330 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10340 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
10350 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
10360 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74  y first.   For t
10370 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61  hat call,.** pPa
10380 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  rent will be NUL
10390 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70  L.  During the p
103a0 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
103b0 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68   outer query, th
103c0 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  is .** routine i
103d0 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
103e0 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74  vely to handle t
103f0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f  he subquery.  Fo
10400 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a  r the recursive.
10410 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74  ** call, pParent
10420 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74   will point to t
10430 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
10440 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62   Because the sub
10450 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20  query is.** the 
10460 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69  second element i
10470 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  n a three-way jo
10480 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61  in, the parentTa
10490 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  b parameter will
104a0 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e  .** be 1 (the 2n
104b0 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69  d value of a 0-i
104c0 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a  ndexed array.).*
104d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 65 6c 65  /.int sqliteSele
104e0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
104f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
10500 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
10510 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
10520 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
10530 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
10540 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
10550 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ed. */.  int eDe
10560 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
10570 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
10580 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
10590 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105b0 41 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64  A parameter used
105c0 20 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69   by the eDest di
105d0 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
105e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
105f0 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  nt,       /* Ano
10600 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20  ther SELECT for 
10610 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20  which this is a 
10620 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69  sub-query */.  i
10630 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20  nt parentTab,   
10640 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
10650 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  n pParent->pSrc 
10660 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  of this query */
10670 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41  .  int *pParentA
10680 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg        /* Tru
10690 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65  e if pParent use
106a0 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
106b0 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tions */.){.  in
106c0 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  t i;.  WhereInfo
106d0 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65   *pWInfo;.  Vdbe
106e0 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67   *v;.  int isAgg
106f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
10700 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
10710 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
10720 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
10730 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
10740 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
10750 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
10760 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
10770 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
10780 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
10790 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
107a0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
107b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
107c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
107d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
107e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
107f0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
10800 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
10810 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
10820 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
10830 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
10840 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
10850 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
10860 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
10870 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
10880 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
10890 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
108a0 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
108b0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
108c0 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
108d0 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
108e0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
108f0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
10900 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
10910 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
10920 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
10930 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
10940 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
10950 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
10960 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  unction */..  if
10970 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
10980 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  failed || pParse
10990 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29  ->nErr || p==0 )
109a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
109b0 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
109c0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
109d0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
109e0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
109f0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
10a00 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
10a10 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
10a20 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
10a30 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
10a40 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
10a50 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
10a60 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ect(pParse, p, e
10a70 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
10a80 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63  }..  /* Make loc
10a90 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  al copies of the
10aa0 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20   parameters for 
10ab0 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f  this query..  */
10ac0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
10ad0 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20  >pSrc;.  pWhere 
10ae0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
10af0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
10b00 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42  derBy;.  pGroupB
10b10 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
10b20 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
10b30 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
10b40 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
10b50 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  tinct;..  /* All
10b60 6f 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f  ocate VDBE curso
10b70 72 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  rs for each tabl
10b80 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
10b90 61 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ause.  */.  sqli
10ba0 74 65 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  teSrcListAssignC
10bb0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
10bc0 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
10bd0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
10be0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
10bf0 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
10c00 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
10c10 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
10c20 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
10c30 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
10c40 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
10c50 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
10c60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
10c70 2a 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22  * Expand any "*"
10c80 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65   terms in the re
10c90 73 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20  sult set.  (For 
10ca0 65 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20  example the "*" 
10cb0 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20  in.  ** "SELECT 
10cc0 2a 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65  * FROM t1")  The
10cd0 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73   fillInColumnlis
10ce0 74 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  t() routine also
10cf0 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20   does some.  ** 
10d00 6f 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69  other housekeepi
10d10 6e 67 20 2d 20 73 65 65 20 74 68 65 20 68 65 61  ng - see the hea
10d20 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
10d30 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  details..  */.  
10d40 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
10d50 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20  List(pParse, p) 
10d60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
10d70 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57  ct_end;.  }.  pW
10d80 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
10d90 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
10da0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
10db0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
10dc0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
10dd0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
10de0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
10df0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
10e00 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
10e10 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
10e20 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65  t..  */.  if( (e
10e30 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
10e40 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
10e50 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
10e60 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
10e70 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
10e80 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
10e90 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
10ea0 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
10eb0 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
10ec0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
10ed0 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  sion");.    goto
10ee0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
10ef0 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
10f00 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
10f10 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
10f20 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
10f30 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
10f40 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20  se SRT_Union:.  
10f50 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
10f60 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  t:.    case SRT_
10f70 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70  Discard:.      p
10f80 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
10f90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
10fa0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
10fb0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  ak;.  }..  /* At
10fc0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
10fd0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
10fe0 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
10ff0 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
11000 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
11010 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
11020 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
11030 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  .  .  **.  ** Re
11040 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
11050 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20   names and do a 
11060 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20  semantics check 
11070 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  on all the expre
11080 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ssions..  */.  f
11090 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
110a0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
110b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
110c0 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
110d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c  se, pTabList, 0,
110e0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
110f0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  xpr) ){.      go
11100 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
11120 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
11130 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
11140 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41  ].pExpr, 1, &isA
11150 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
11160 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11170 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
11180 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20  here ){.    if( 
11190 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
111a0 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
111b0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
111c0 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
111d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
111e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
111f0 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
11200 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30  Parse, pWhere, 0
11210 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  , 0) ){.      go
11220 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11230 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
11240 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
11250 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
11260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
11270 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
11280 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
11290 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
112a0 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
112b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
112c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
112d0 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
112e0 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
112f0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
11300 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
11310 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11320 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
11330 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
11340 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
11350 6e 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  ng, 1, &isAgg) )
11360 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11370 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11380 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42   }.  if( pOrderB
11390 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
113a0 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
113b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
113c0 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
113d0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
113e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
113f0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11400 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
11410 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43  pE, &iCol) && iC
11420 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45  ol>0 && iCol<=pE
11430 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
11440 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
11450 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
11460 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72       pE = pOrder
11470 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
11480 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
11490 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d  EList->a[iCol-1]
114a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
114b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
114c0 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
114d0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
114e0 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b  , pEList, pE) ){
114f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
11500 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11510 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
11520 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
11530 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30  se, pE, isAgg, 0
11540 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
11550 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11570 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
11580 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
11590 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
115a0 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
115b0 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  &iCol)==0 ){.   
115c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
115d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
115e0 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
115f0 52 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20  R BY terms must 
11600 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67  not be non-integ
11610 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a  er constants");.
11620 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
11630 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11640 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f     }else if( iCo
11650 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
11660 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
11670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72          sqliteEr
11680 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52               "OR
116a0 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75  DER BY column nu
116b0 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72  mber %d out of r
116c0 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
116d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
116e0 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
116f0 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  d", iCol, pEList
11700 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
11710 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11720 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
11730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11740 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
11750 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
11760 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
11770 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
11780 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45  nt iCol;.      E
11790 78 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70  xpr *pE = pGroup
117a0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
117b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
117c0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
117d0 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c  , &iCol) && iCol
117e0 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69  >0 && iCol<=pELi
117f0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
11800 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
11810 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20  elete(pE);.     
11820 20 20 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79     pE = pGroupBy
11830 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
11840 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45 4c  qliteExprDup(pEL
11850 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70  ist->a[iCol-1].p
11860 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
11870 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11880 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
11890 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
118a0 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
118b0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
118c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
118d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
118e0 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
118f0 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
11900 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11910 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
11930 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61  liteExprIsConsta
11940 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
11950 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11960 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
11970 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
11980 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
11990 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
119a0 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42          "GROUP B
119b0 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74  Y terms must not
119c0 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20   be non-integer 
119d0 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20  constants");.   
119e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
119f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
11a00 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d  }else if( iCol<=
11a10 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
11a20 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
11a30 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
11a40 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
11a50 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20           "GROUP 
11a60 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
11a70 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
11a80 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
11a90 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74              "bet
11aa0 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
11ab0 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
11ac0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
11ad0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11af0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
11b00 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
11b10 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
11b20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
11b30 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11b40 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
11b50 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
11b60 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
11b70 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
11b80 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
11b90 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
11ba0 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
11bb0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
11bc0 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
11bd0 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
11be0 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
11bf0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11c00 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
11c10 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
11c20 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
11c30 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
11c40 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
11c50 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20  for the special 
11c60 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20  case of a min() 
11c70 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
11c80 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a  n by itself.  **
11c90 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
11ca0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  et..  */.  if( s
11cb0 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
11cc0 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
11cd0 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20  t, iParm) ){.   
11ce0 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74   rc = 0;.    got
11cf0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11d00 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
11d10 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
11d20 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
11d30 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
11d40 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
11d50 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
11d60 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
11d70 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
11d80 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 6e 74 20  ontext;.    int 
11d90 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
11da0 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61  xt;..    if( pTa
11db0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
11dc0 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ect==0 ) continu
11dd0 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  e;.    if( pTabL
11de0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21  ist->a[i].zName!
11df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76  =0 ){.      zSav
11e00 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
11e10 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
11e20 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72  text;.      pPar
11e30 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
11e40 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
11e50 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e  ].zName;.      n
11e60 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
11e70 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
11e80 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  {.      needRest
11e90 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a  oreContext = 0;.
11ea0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11eb0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11ec0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
11ed0 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54  elect, SRT_TempT
11ee0 61 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  able, .         
11ef0 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
11f00 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20  ->a[i].iCursor, 
11f10 70 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a 20  p, i, &isAgg);. 
11f20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f     if( needResto
11f30 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20  reContext ){.   
11f40 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
11f50 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
11f60 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
11f70 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
11f80 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70  = p->pSrc;.    p
11f90 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
11fa0 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  e;.    if( eDest
11fb0 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65  !=SRT_Union && e
11fc0 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74  Dest!=SRT_Except
11fd0 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44   && eDest!=SRT_D
11fe0 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20  iscard ){.      
11ff0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
12000 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
12010 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
12020 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48  pGroupBy;.    pH
12030 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
12040 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e  ng;.    isDistin
12050 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
12060 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ct;.  }..  /* Ch
12070 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
12080 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
12090 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
120a0 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
120b0 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
120c0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
120d0 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
120e0 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
120f0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
12100 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
12110 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26   && pParentAgg &
12120 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53  &.      flattenS
12130 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
12140 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
12150 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  ab, *pParentAgg,
12160 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69   isAgg) ){.    i
12170 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72  f( isAgg ) *pPar
12180 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  entAgg = 1;.    
12190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
121a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
121b0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d  iter..  */.  com
121c0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
121d0 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a  rs(pParse, p);..
121e0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
121f0 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65  lumn types if we
12200 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 61   will be using a
12210 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
12220 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
12230 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
12240 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
12250 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  a destination ot
12260 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  her.  ** than a 
12270 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  callback..  **. 
12280 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64   ** We have to d
12290 6f 20 74 68 69 73 20 73 65 70 61 72 61 74 65 6c  o this separatel
122a0 79 20 66 72 6f 6d 20 74 68 65 20 63 72 65 61 74  y from the creat
122b0 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ion of column na
122c0 6d 65 73 0a 20 20 2a 2a 20 61 62 6f 76 65 20 62  mes.  ** above b
122d0 65 63 61 75 73 65 20 69 66 20 74 68 65 20 70 54  ecause if the pT
122e0 61 62 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  abList contains 
122f0 76 69 65 77 73 20 74 68 65 6e 20 74 68 65 79 20  views then they 
12300 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 68 61  will not.  ** ha
12310 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ve been resolved
12320 20 61 6e 64 20 77 65 20 77 69 6c 6c 20 6e 6f 74   and we will not
12330 20 6b 6e 6f 77 20 74 68 65 20 63 6f 6c 75 6d 6e   know the column
12340 20 74 79 70 65 73 20 75 6e 74 69 6c 0a 20 20 2a   types until.  *
12350 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
12360 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
12370 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
12380 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
12390 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
123a0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
123b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
123c0 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
123d0 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
123e0 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
123f0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
12400 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65  f( eDest==SRT_Te
12410 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73  mpTable ){.    s
12420 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12430 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
12440 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Parm, 0);.  }.. 
12450 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73   /* Do an analys
12460 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  is of aggregate 
12470 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
12480 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67  /.  sqliteAggreg
12490 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61  ateInfoReset(pPa
124a0 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67  rse);.  if( isAg
124b0 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b  g || pGroupBy ){
124c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
124d0 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a  rse->nAgg==0 );.
124e0 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
124f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
12500 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
12510 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
12520 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
12530 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
12540 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
12550 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
12560 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12580 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
12590 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
125a0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
125b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
125c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
125d0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
125e0 65 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  es(pParse, pGrou
125f0 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
12600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
12610 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12630 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12640 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
12650 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
12660 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48  gates(pParse, pH
12670 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20  aving) ){.      
12680 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12690 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
126a0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
126b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
126c0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
126d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
126e0 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
126f0 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
12700 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
12710 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
12720 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12730 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
12740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12750 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74   }..  /* Reset t
12760 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20  he aggregator.  
12770 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
12780 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
12790 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52  AddOp(v, OP_AggR
127a0 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  eset, 0, pParse-
127b0 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28  >nAgg);.    for(
127c0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
127d0 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
127e0 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b   FuncDef *pFunc;
127f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e  .      if( (pFun
12800 63 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  c = pParse->aAgg
12810 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26  [i].pFunc)!=0 &&
12820 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a   pFunc->xFinaliz
12830 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
12840 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c  sqliteVdbeOp3(v,
12850 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20   OP_AggInit, 0, 
12860 69 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c  i, (char*)pFunc,
12870 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
12880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12890 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
128a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
128b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
128c0 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
128d0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
128e0 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63  dOp(v, OP_AggFoc
128f0 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  us, 0, 0);.    }
12900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
12910 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
12920 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20   cell to NULL.  
12930 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
12940 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73  SRT_Mem ){.    s
12950 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12960 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
12970 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
12980 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
12990 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
129a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
129b0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
129c0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
129d0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
129e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
129f0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
12a00 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
12a10 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
12a20 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12a30 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73  OP_OpenTemp, dis
12a40 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c  tinct, 1);.  }el
12a50 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
12a60 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
12a70 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
12a80 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20  ase scan.  */.  
12a90 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57  pWInfo = sqliteW
12aa0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
12ab0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
12ac0 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  re, 0, .        
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30      pGroupBy ? 0
12af0 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20   : &pOrderBy);. 
12b00 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
12b10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12b20 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20  ;..  /* Use the 
12b30 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
12b40 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f  oop if we are no
12b50 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20  t dealing with. 
12b60 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20   ** aggregates. 
12b70 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
12b80 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65   ){.    if( sele
12b90 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12ba0 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
12bb0 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
12bc0 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a  istinct, eDest,.
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66      iParm, pWInf
12bf0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
12c00 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b  Info->iBreak) ){
12c10 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
12c20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
12c30 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
12c40 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
12c50 61 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e  aggregates, then
12c60 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   do the special 
12c70 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70  aggregate.  ** p
12c80 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a  rocessing.  .  *
12c90 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 41 67  /.  else{.    Ag
12ca0 67 45 78 70 72 20 2a 70 41 67 67 3b 0a 20 20 20  gExpr *pAgg;.   
12cb0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
12cc0 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b  .      int lbl1;
12cd0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12ce0 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
12cf0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
12d00 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
12d10 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
12d20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
12d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12d40 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12d50 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f  OP_MakeKey, pGro
12d60 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  upBy->nExpr, 0);
12d70 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
12d80 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e->db->file_form
12d90 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64  at>=4 ) sqliteAd
12da0 64 4b 65 79 54 79 70 65 28 76 2c 20 70 47 72 6f  dKeyType(v, pGro
12db0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c  upBy);.      lbl
12dc0 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  1 = sqliteVdbeMa
12dd0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
12de0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12df0 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
12e00 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  , 0, lbl1);.    
12e10 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d    for(i=0, pAgg=
12e20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c  pParse->aAgg; i<
12e30 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
12e40 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20  +, pAgg++){.    
12e50 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e 69 73      if( pAgg->is
12e60 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
12e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
12e80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
12e90 41 67 67 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  Agg->pExpr);.   
12ea0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12eb0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65  ddOp(v, OP_AggSe
12ec0 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
12ed0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
12ee0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
12ef0 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20  , lbl1);.    }. 
12f00 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67     for(i=0, pAgg
12f10 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69  =pParse->aAgg; i
12f20 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
12f30 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20  ++, pAgg++){.   
12f40 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
12f50 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20     int nExpr;.  
12f60 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
12f70 66 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  f;.      if( !pA
12f80 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74  gg->isAgg ) cont
12f90 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
12fa0 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21  rt( pAgg->pFunc!
12fb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
12fc0 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d  rt( pAgg->pFunc-
12fd0 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20  >xStep!=0 );.   
12fe0 20 20 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e     pDef = pAgg->
12ff0 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20  pFunc;.      pE 
13000 3d 20 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20  = pAgg->pExpr;. 
13010 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
13020 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
13030 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  rt( pE->op==TK_A
13040 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
13050 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c       nExpr = sql
13060 69 74 65 45 78 70 72 43 6f 64 65 45 78 70 72 4c  iteExprCodeExprL
13070 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
13080 70 4c 69 73 74 2c 20 70 44 65 66 2d 3e 69 6e 63  pList, pDef->inc
13090 6c 75 64 65 54 79 70 65 73 29 3b 0a 20 20 20 20  ludeTypes);.    
130a0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
130b0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
130c0 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
130d0 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f  liteVdbeOp3(v, O
130e0 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 6e 45  P_AggFunc, 0, nE
130f0 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66  xpr, (char*)pDef
13100 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
13110 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45     }.  }..  /* E
13120 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
13130 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a  scan loop..  */.
13140 20 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64    sqliteWhereEnd
13150 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20  (pWInfo);..  /* 
13160 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73  If we are proces
13170 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c  sing aggregates,
13180 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20   we need to set 
13190 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70  up a second loop
131a0 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f  .  ** over all o
131b0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
131c0 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65  values and proce
131d0 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  ss them..  */.  
131e0 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
131f0 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71   int endagg = sq
13200 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
13210 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74  l(v);.    int st
13220 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72  artagg;.    star
13230 74 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62  tagg = sqliteVdb
13240 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
13250 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29  Next, 0, endagg)
13260 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
13270 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66  eAgg = 1;.    if
13280 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
13290 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
132a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
132b0 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20  ving, startagg, 
132c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
132d0 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
132e0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
132f0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
13300 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
13310 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
13320 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
13330 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67   startagg, endag
13340 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
13350 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
13360 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
13370 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
13380 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b  o, 0, startagg);
13390 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52  .    sqliteVdbeR
133a0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
133b0 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  ndagg);.    sqli
133c0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
133d0 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  P_Noop, 0, 0);. 
133e0 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67     pParse->useAg
133f0 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
13400 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
13410 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
13420 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
13430 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
13440 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
13450 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
13460 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
13470 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
13480 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
13490 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20  rateSortTail(p, 
134a0 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
134b0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
134c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
134d0 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72  is was a subquer
134e0 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63  y, we have now c
134f0 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62  onverted the sub
13500 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a  query into a.  *
13510 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
13520 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74 68  e.  So delete th
13530 65 20 73 75 62 71 75 65 72 79 20 73 74 72 75 63  e subquery struc
13540 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ture from the pa
13550 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65  rent.  ** to pre
13560 76 65 6e 74 20 74 68 69 73 20 73 75 62 71 75 65  vent this subque
13570 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76  ry from being ev
13580 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e  aluated again an
13590 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a 20  d to force the. 
135a0 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 74   ** the use of t
135b0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
135c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
135d0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  Parent ){.    as
135e0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
135f0 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74  Src->nSrc>parent
13600 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Tab );.    asser
13610 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
13620 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
13630 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20  Select==p );.   
13640 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
13650 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50 61 72  ete(p);.    pPar
13660 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
13670 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 20  entTab].pSelect 
13680 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
13690 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
136a0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
136b0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
136c0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
136d0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
136e0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
136f0 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
13700 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
13710 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
13720 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
13730 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
13740 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
13750 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
13760 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
13770 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67 67  end:.  sqliteAgg
13780 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28  regateInfoReset(
13790 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72  pParse);.  retur
137a0 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.