/ Hex Artifact Content
Login

Artifact 902000034e44817e2822d72870c15eff842dea9e:


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 35 38  select.c,v 1.158
0200: 20 32 30 30 34 2f 30 32 2f 32 32 20 32 30 3a 30   2004/02/22 20:0
0210: 35 3a 30 31 20 64 72 68 20 45 78 70 20 24 0a 2a  5:01 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 20 3d 20 73 71 6c 69 74 65  int end = sqlite
4560: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4570: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
4580: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4590: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
45a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
45b0: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c  p(v, OP_Sort, 0,
45c0: 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71   0);.  addr = sq
45d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
45e0: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
45f0: 20 65 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e   end);.  if( p->
4600: 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20  iOffset>=0 ){.  
4610: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4620: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
4630: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
4640: 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r+4);.    sqlite
4650: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4660: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
4670: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4680: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
4690: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ddr);.  }.  if( 
46a0: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
46b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
46c0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
46d0: 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 65 6e  r, p->iLimit, en
46e0: 64 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  d);.  }.  switch
46f0: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
4700: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
4710: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4720: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4730: 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e 43  SortCallback, nC
4740: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4760: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
4770: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
4780: 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20  empTable: {.    
4790: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
47a0: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
47b0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
47c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
47d0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
47e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
47f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4800: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61  P_PutIntKey, iPa
4810: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
4820: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4830: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
4840: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4850: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4860: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4870: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
4880: 2d 31 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75  -1, sqliteVdbeCu
4890: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
48a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
48b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
48c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      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 47 6f 74 6f 2c 20 30 2c 20 73 71  , OP_Goto, 0, sq
48f0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
4900: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
4910: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4920: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
4930: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4940: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4950: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61  P_PutStrKey, iPa
4960: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
4970: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4980: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4990: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
49a0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
49b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
49c0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
49d0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
49e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
49f0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4a00: 20 65 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65   end);.      bre
4a10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4a20: 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  se SRT_Subroutin
4a30: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e: {.      int i
4a40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4a50: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
4a60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4a70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4a80: 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29  Column, -1-i, i)
4a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4aa0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4ab0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
4ac0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73 71  iParm);.      sq
4ad0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4ae0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
4af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4b00: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4b10: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
4b20: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
4b30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4b40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4b50: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4b60: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
4b70: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
4b80: 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c 69  (v, end);.  sqli
4b90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4ba0: 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20  P_SortReset, 0, 
4bb0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  0);.}../*.** Gen
4bc0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
4bd0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
4be0: 42 45 20 74 68 65 20 64 61 74 61 74 79 70 65 73  BE the datatypes
4bf0: 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69   of.** columns i
4c00: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
4c10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4c20: 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e 65 72 61  tine only genera
4c30: 74 65 73 20 63 6f 64 65 20 69 66 20 74 68 65 20  tes code if the 
4c40: 22 50 52 41 47 4d 41 20 73 68 6f 77 5f 64 61 74  "PRAGMA show_dat
4c50: 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a 20 68 61  atypes=on".** ha
4c60: 73 20 62 65 65 6e 20 65 78 65 63 75 74 65 64 2e  s been executed.
4c70: 20 20 54 68 65 20 64 61 74 61 74 79 70 65 73 20    The datatypes 
4c80: 61 72 65 20 72 65 70 6f 72 74 65 64 20 6f 75 74  are reported out
4c90: 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c 0a 2a 2a   in the azCol.**
4ca0: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
4cb0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
4cc0: 69 6f 6e 2e 20 20 54 68 65 20 66 69 72 73 74 20  ion.  The first 
4cd0: 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74 72 69 65  N azCol[] entrie
4ce0: 73 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  s.** are the nam
4cf0: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
4d00: 73 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  s, and the secon
4d10: 64 20 4e 20 65 6e 74 72 69 65 73 20 61 72 65 20  d N entries are 
4d20: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
4d30: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 73   for the columns
4d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 64 61 74  ..**.** The "dat
4d50: 61 74 79 70 65 22 20 66 6f 72 20 61 20 72 65 73  atype" for a res
4d60: 75 6c 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ult that is a co
4d70: 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70 65 20 69  lumn of a type i
4d80: 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  s the.** datatyp
4d90: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
4da0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4db0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4dc0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64  tement..** The d
4dd0: 61 74 61 74 79 70 65 20 66 6f 72 20 61 6e 20 65  atatype for an e
4de0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74  xpression is eit
4df0: 68 65 72 20 54 45 58 54 20 6f 72 20 4e 55 4d 45  her TEXT or NUME
4e00: 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20 64 61 74  RIC.  The.** dat
4e10: 61 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49  atype for a ROWI
4e20: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
4e30: 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ER..*/.static vo
4e40: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
4e50: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
4e60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4e70: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
4e80: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
4e90: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
4ea0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
4eb0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
4ec0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
4ed0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
4ee0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
4ef0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4f00: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
4f10: 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
4f20: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
4f30: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
4f40: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
4f50: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
4f60: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
4f70: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
4f80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
4f90: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
4fa0: 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  MN && pTabList )
4fb0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
4fc0: 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Tab;.      int i
4fd0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
4fe0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
4ff0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5000: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
5010: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
5020: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
5030: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
5040: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
5050: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
5060: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
5070: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
5080: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
5090: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
50a0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
50b0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
50c0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
50d0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
50e0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
50f0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
5100: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
5110: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
5120: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5130: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a  .zType;.      }.
5140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5150: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 54   if( sqliteExprT
5160: 79 70 65 28 70 29 3d 3d 53 51 4c 49 54 45 5f 53  ype(p)==SQLITE_S
5170: 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  O_TEXT ){.      
5180: 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22    zType = "TEXT"
5190: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
51a0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
51b0: 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20 20 20  NUMERIC";.      
51c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
51d0: 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  teVdbeOp3(v, OP_
51e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b 20  ColumnName, i + 
51f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
5200: 2c 20 7a 54 79 70 65 2c 20 30 29 3b 0a 20 20 7d  , zType, 0);.  }
5210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
5220: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
5230: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
5240: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
5250: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
5260: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
5270: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
5280: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
5290: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
52a0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
52b0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
52c0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
52d0: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
52e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
52f0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5300: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
5310: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
5320: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
5330: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
5340: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
5350: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
5360: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
5370: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
5380: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5390: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
53a0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
53b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
53c0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
53d0: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21  s;..  assert( v!
53e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =0 );.  if( pPar
53f0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5400: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  || v==0 || sqlit
5410: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
5420: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
5430: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5440: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
5450: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
5460: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
5470: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
5480: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
5490: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
54a0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
54b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
54c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
54d0: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
54e0: 20 20 69 6e 74 20 70 32 20 3d 20 69 3d 3d 70 45    int p2 = i==pE
54f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  List->nExpr-1;. 
5500: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
5510: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
5520: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
5530: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
5540: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
5550: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
5560: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
5570: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
5580: 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c  sqliteVdbeOp3(v,
5590: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
55a0: 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 30 29  i, p2, zName, 0)
55b0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
55c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
55d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
55e0: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
55f0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
5600: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
5610: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
5620: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
5630: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
5640: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5650: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
5660: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
5670: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
5680: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
5690: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
56a0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
56b0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
56c0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
56d0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
56e0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
56f0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
5700: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
5710: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
5720: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
5730: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
5740: 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22  zCol = "_ROWID_"
5750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5760: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
5770: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5780: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
5790: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
57a0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
57b0: 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26  s && p->span.z &
57c0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
57d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
57e0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4f  dr = sqliteVdbeO
57f0: 70 33 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p3(v,OP_ColumnNa
5800: 6d 65 2c 20 69 2c 20 70 32 2c 20 70 2d 3e 73 70  me, i, p2, p->sp
5810: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5820: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5830: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
5840: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
5850: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
5860: 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74  Names || (!short
5870: 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73  Names && pTabLis
5880: 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20  t->nSrc>1) ){.  
5890: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
58a0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
58b0: 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20  har *zTab;. .   
58c0: 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62       zTab = pTab
58d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61  List->a[j].zAlia
58e0: 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  s;.        if( f
58f0: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62  ullNames || zTab
5900: 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61  ==0 ) zTab = pTa
5910: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
5920: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
5930: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
5940: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  ".", zCol, 0);. 
5950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
5960: 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  eOp3(v, OP_Colum
5970: 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a 4e  nName, i, p2, zN
5980: 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  ame, P3_DYNAMIC)
5990: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
59a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
59b0: 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  eOp3(v, OP_Colum
59c0: 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 2c 20 7a 43  nName, i, p2, zC
59d0: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ol, 0);.      }.
59e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
59f0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
5a00: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
5a10: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
5a20: 74 65 56 64 62 65 4f 70 33 28 76 2c 4f 50 5f 43  teVdbeOp3(v,OP_C
5a30: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32  olumnName, i, p2
5a40: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
5a50: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73  span.n);.      s
5a60: 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73  qliteVdbeCompres
5a70: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
5a80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5a90: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
5aa0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5ab0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
5ac0: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
5ad0: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
5ae0: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
5af0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
5b00: 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c  sqliteVdbeOp3(v,
5b10: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
5b20: 69 2c 20 70 32 2c 20 7a 4e 61 6d 65 2c 20 30 29  i, p2, zName, 0)
5b30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5b40: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
5b50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
5b60: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
5b70: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
5b80: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5b90: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
5ba0: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
5bb0: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
5bc0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
5bd0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
5be0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
5bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5c00: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
5c10: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
5c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5c30: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
5c40: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
5c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
5c60: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
5c70: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
5c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
5c90: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
5ca0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
5cb0: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
5cc0: 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   int fillInColum
5cd0: 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65  nList(Parse*, Se
5ce0: 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  lect*);../*.** G
5cf0: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
5d00: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
5d10: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
5d20: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
5d30: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
5d40: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
5d50: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
5d60: 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66  qliteResultSetOf
5d70: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
5d80: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
5d90: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
5da0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
5db0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
5dc0: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
5dd0: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
5de0: 2a 61 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69  *aCol;..  if( fi
5df0: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
5e00: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
5e10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5e20: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
5e30: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5e40: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
5e50: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
5e60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5e70: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
5e80: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
5e90: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
5ea0: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
5eb0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
5ec0: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
5ed0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
5ee0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
5ef0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
5f00: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
5f10: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
5f20: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
5f30: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
5f40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5f50: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
5f60: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a  {.    Expr *p, *
5f70: 70 52 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  pR;.    if( pELi
5f80: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
5f90: 7b 0a 20 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e  {.      aCol[i].
5fa0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
5fb0: 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
5fc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ].zName);.    }e
5fd0: 6c 73 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73  lse if( (p=pELis
5fe0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
5ff0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
6000: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
6010: 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20  R=p->pRight)!=0 
6020: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  && pR->token.z &
6030: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pR->token.z[0]
6040: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   ){.      int cn
6050: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  t;.      sqliteS
6060: 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b  etNString(&aCol[
6070: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f  i].zName, pR->to
6080: 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e  ken.z, pR->token
6090: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  .n, 0);.      fo
60a0: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
60b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
60c0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
60d0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 61  aCol[j].zName, a
60e0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
60f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
6100: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 63  t n;.          c
6110: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
6120: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
6130: 7a 42 75 66 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74  zBuf,"_%d",++cnt
6140: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  );.          n =
6150: 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20   strlen(zBuf);. 
6160: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
6170: 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b  etNString(&aCol[
6180: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f  i].zName, pR->to
6190: 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e  ken.z, pR->token
61a0: 2e 6e 2c 20 7a 42 75 66 2c 20 6e 2c 30 29 3b 0a  .n, zBuf, n,0);.
61b0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31            j = -1
61c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
61d0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
61e0: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
61f0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
6200: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
6210: 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f  tring(&pTab->aCo
6220: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73  l[i].zName, p->s
6230: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
6240: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
6250: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
6260: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
6270: 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d  ntf(zBuf, "colum
6280: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
6290: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e    pTab->aCol[i].
62a0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
62b0: 72 44 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20  rDup(zBuf);.    
62c0: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
62d0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
62e0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
62f0: 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * For the given 
6300: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6310: 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67  , do three thing
6320: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
6330: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
6340: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
6350: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
6360: 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
6370: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74         defines t
6380: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
6390: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
63a0: 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69  scanned.  For vi
63b0: 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ews,.**         
63c0: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
63d0: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
63e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
63f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
6400: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
6410: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
6420: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
6430: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
6440: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
6450: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
6460: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
6470: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
6480: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
6490: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
64a0: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
64b0: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
64c0: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
64d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
64e0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
64f0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
6500: 28 32 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (2)  Add terms t
6510: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
6520: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
6530: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
6540: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
6550: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
6560: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
6570: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
6580: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63 61  *.**    (3)  Sca
6590: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
65a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
65b0: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
65c0: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
65d0: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
65e0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
65f0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
6600: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
6610: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
6620: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
6630: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
6640: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
6650: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
6660: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
6670: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
6680: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
6690: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
66a0: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
66b0: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
66c0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
66d0: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
66e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
66f0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
6700: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
6710: 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72  List(Parse *pPar
6720: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
6730: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
6740: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
6750: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
6760: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
6770: 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66  ble *pTab;..  if
6780: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72  ( p==0 || p->pSr
6790: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
67a0: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
67b0: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
67c0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
67d0: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
67e0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
67f0: 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ble list..  */. 
6800: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
6810: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
6820: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  {.    if( pTabLi
6830: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b  st->a[i].pTab ){
6840: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72  .      /* This r
6850: 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62  outine has run b
6860: 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20  efore!  No need 
6870: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20  to continue */. 
6880: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6890: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
68a0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
68b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e==0 ){.      /*
68c0: 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
68d0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
68e0: 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
68f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
6900: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6910: 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect!=0 );.      
6920: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
6930: 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a  i].zAlias==0 ){.
6940: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61          char zFa
6950: 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20  keName[60];.    
6960: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b      sprintf(zFak
6970: 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  eName, "sqlite_s
6980: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20  ubquery_%p_",.  
6990: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
69a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
69b0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
69c0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
69d0: 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  (&pTabList->a[i]
69e0: 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61  .zAlias, zFakeNa
69f0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  me, 0);.      }.
6a00: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6a10: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
6a20: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
6a30: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
6a40: 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
6a50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
6a60: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
6a90: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
6aa0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
6ab0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
6ac0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6ad0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
6ae0: 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67  isTransient flag
6af0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
6b00: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
6b10: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
6b20: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
6b30: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
6b40: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
6b50: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
6b60: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
6b70: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
6b80: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
6b90: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
6ba0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
6bb0: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
6bc0: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
6bd0: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
6be0: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20  ->isTransient = 
6bf0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
6c00: 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
6c10: 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
6c20: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
6c30: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
6c40: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
6c50: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
6c60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4c 6f          sqliteLo
6c70: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
6c80: 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ,pTabList->a[i].
6c90: 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e  zName,pTabList->
6ca0: 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[i].zDatabase);
6cb0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
6cc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
6cd0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
6ce0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
6cf0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6d00: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
6d10: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
6d20: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
6d30: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
6d40: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 56       if( sqliteV
6d50: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
6d60: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
6d70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
6d80: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
6d90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
6da0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6db0: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
6dc0: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
6dd0: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
6de0: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
6df0: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
6e00: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
6e10: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
6e20: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
6e30: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
6e40: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
6e50: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
6e60: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
6e70: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
6e80: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6e90: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
6ea0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d  t->a[i].pSelect=
6eb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6ec0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6ed0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
6ee0: 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70  electDup(pTab->p
6ef0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
6f00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6f10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
6f20: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
6f30: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
6f40: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
6f50: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
6f60: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
6f70: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
6f80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
6f90: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
6fa0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
6fb0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
6fc0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
6fd0: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
6fe0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
6ff0: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
7000: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
7010: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
7020: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
7030: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
7040: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
7050: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
7060: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
7070: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
7080: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
7090: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
70a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
70b0: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
70c0: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
70d0: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
70e0: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
70f0: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
7100: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
7110: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
7120: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
7130: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
7140: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
7150: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
7160: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
7170: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
7180: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
7190: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
71a0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
71b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
71c0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
71d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
71e0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
71f0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
7200: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
7210: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
7220: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
7230: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
7240: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
7250: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
7260: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
7270: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
7280: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
7290: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
72a0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
72b0: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
72c0: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
72d0: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
72e0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
72f0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
7300: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
7310: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
7320: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
7330: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
7340: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7350: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
7360: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
7370: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
7380: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
7390: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
73a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
73b0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
73c0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
73d0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
73e0: 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
73f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
7400: 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
7410: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
7420: 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
7430: 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
7440: 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
7450: 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
7460: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
7470: 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
7480: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
7490: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
74a0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
74b0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
74c0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
74d0: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
74e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
74f0: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
7500: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
7510: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7520: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
7530: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
7540: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
7550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
7560: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7570: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
7580: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
7590: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
75a0: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
75b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
75c0: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
75d0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
75e0: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
75f0: 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  */.        Token
7600: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *pName;        
7610: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
7620: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
7630: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
7640: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
7650: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
7660: 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d      pName = &pE-
7670: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
7680: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7690: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
76a0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
76b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
76c0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
76d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
76e0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
76f0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
7700: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
7710: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
7720: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
7730: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
7740: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
7750: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
7760: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
7770: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
7780: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
77a0: 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54 61  f( pName && (zTa
77b0: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
77c0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
77f0: 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d  Name->z, zTabNam
7800: 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20  e, pName->n)!=0 
7810: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
7820: 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61      zTabName[pNa
7830: 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20  me->n]!=0) ){.  
7840: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7850: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
7860: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
7870: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
7880: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
7890: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
78b0: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
78c0: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
78d0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
78e0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
78f0: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
7900: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
7910: 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   (pTabList->a[i-
7920: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
7930: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  columnIndex(pTab
7960: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61  List->a[i-1].pTa
7970: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7990: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
79a0: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
79b0: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
79c0: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
79d0: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
79e0: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
79f0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
7a00: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
7a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7a20: 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 49 64   i>0 && sqliteId
7a30: 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c 69  ListIndex(pTabLi
7a40: 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e  st->a[i-1].pUsin
7a50: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7a70: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
7a80: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
7a90: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
7aa0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
7ab0: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
7ac0: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
7ad0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
7ae0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
7af0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7b10: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
7b20: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
7b30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
7b40: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
7b50: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
7b60: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
7b70: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b  token.z = zName;
7b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7b90: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  ght->token.n = s
7ba0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
7bb0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
7bc0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7be0: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 70 54 61   zTabName && pTa
7bf0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
7c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7c10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
7c20: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
7c30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7c40: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45   pExpr = sqliteE
7c50: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
7c60: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
7c80: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
7c90: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
7ca0: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20   pLeft->token.z 
7cb0: 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20  = zTabName;.    
7cc0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d            pLeft-
7cd0: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
7ce0: 6e 28 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  n(zTabName);.   
7cf0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7d00: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
7d20: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 28  qliteSetString((
7d30: 63 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73  char**)&pExpr->s
7d40: 70 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c  pan.z, zTabName,
7d50: 20 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b   ".", zName, 0);
7d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7d70: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73  Expr->span.n = s
7d80: 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61  trlen(pExpr->spa
7d90: 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n.z);.          
7da0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
7db0: 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  dyn = 1;.       
7dc0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
7dd0: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20  ken.z = 0;.     
7de0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7df0: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20  token.n = 0;.   
7e00: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7e10: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
7e30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7e40: 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
7e50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7e60: 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45  pExpr->span = pE
7e70: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  xpr->token;.    
7e80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7e90: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
7ea0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
7eb0: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
7ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7ed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7ee0: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
7ef0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
7f00: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   pName ){.      
7f10: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
7f20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
7f30: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22   such table: %T"
7f40: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
7f50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
7f70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
7f80: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
7f90: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
7fa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
7fb0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7fc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7fd0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
7fe0: 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20  lete(pEList);.  
7ff0: 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
8000: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
8010: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
8020: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72  is routine recur
8030: 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74  sively unlinks t
8040: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
8050: 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73  [].pTab pointers
8060: 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20  .** in a select 
8070: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a  structure.  It j
8080: 75 73 74 20 73 65 74 73 20 74 68 65 20 70 6f 69  ust sets the poi
8090: 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20  nters to NULL.  
80a0: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
80b0: 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 20  is recursive in 
80c0: 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
80d0: 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  f the Select.pSr
80e0: 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a  c.a[].pSelect.**
80f0: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
8100: 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69  NULL, this routi
8110: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
8120: 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74  ursively on that
8130: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
8140: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8150: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65  called on the Se
8160: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74  lect structure t
8170: 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a  hat defines a.**
8180: 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74   VIEW in order t
8190: 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69  o undo any bindi
81a0: 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20  ngs to tables.  
81b0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
81c0: 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f  y.** because tho
81d0: 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20  se tables might 
81e0: 62 65 20 44 52 4f 50 65 64 20 62 79 20 61 20 73  be DROPed by a s
81f0: 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f  ubsequent SQL co
8200: 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65  mmand..** If the
8210: 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f   bindings are no
8220: 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20  t removed, then 
8230: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2d  the Select.pSrc-
8240: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a  >a[].pTab field.
8250: 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  ** will be left 
8260: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64 65  pointing to a de
8270: 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65 20  allocated Table 
8280: 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 20  structure after 
8290: 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20  the.** DROP and 
82a0: 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20  a coredump will 
82b0: 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74 20 74  occur the next t
82c0: 69 6d 65 20 74 68 65 20 56 49 45 57 20 69 73 20  ime the VIEW is 
82d0: 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
82e0: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
82f0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
8300: 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
8310: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
8320: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8330: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
8340: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
8350: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
8360: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61  +){.    if( (pTa
8370: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  b = pSrc->a[i].p
8380: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
8390: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
83a0: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
83b0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
83c0: 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20  ble(0, pTab);.  
83d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 72 63      }.      pSrc
83e0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b  ->a[i].pTab = 0;
83f0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d  .      if( pSrc-
8400: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b  >a[i].pSelect ){
8410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
8420: 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 72 63  electUnbind(pSrc
8430: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
8440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8450: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
8460: 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61   routine associa
8470: 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61  tes entries in a
8480: 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  n ORDER BY expre
8490: 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a  ssion list with.
84a0: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20  ** columns in a 
84b0: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63  result.  For eac
84c0: 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  h ORDER BY expre
84d0: 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64  ssion, the opcod
84e0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d  e of.** the top-
84f0: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68  level node is ch
8500: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
8510: 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75  MN and the iColu
8520: 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  mn value of.** t
8530: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
8540: 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  e is filled in w
8550: 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ith column numbe
8560: 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65  r and the iTable
8570: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
8580: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
8590: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69  is filled with i
85a0: 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e  Table parameter.
85b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
85c0: 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54  are prior SELECT
85d0: 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61   clauses, they a
85e0: 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72  re processed fir
85f0: 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20  st.  A match.** 
8600: 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45  in an earlier SE
8610: 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65  LECT takes prece
8620: 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74  dence over a lat
8630: 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a  er SELECT..**.**
8640: 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20   Any entry that 
8650: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69  does not match i
8660: 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20  s flagged as an 
8670: 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62  error.  The numb
8680: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20  er.** of errors 
8690: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
86a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
86b0: 64 6f 65 73 20 4e 4f 54 20 63 6f 72 72 65 63 74  does NOT correct
86c0: 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ly initialize th
86d0: 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65 20  e Expr.dataType 
86e0: 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65   field.** of the
86f0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
8700: 73 69 6f 6e 73 2e 20 20 54 68 65 20 6d 75 6c 74  sions.  The mult
8710: 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72  iSelectSortOrder
8720: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  () routine.** mu
8730: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  st be called to 
8740: 64 6f 20 74 68 61 74 20 61 66 74 65 72 20 74 68  do that after th
8750: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  e individual sel
8760: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ect statements.*
8770: 2a 20 68 61 76 65 20 61 6c 6c 20 62 65 65 6e 20  * have all been 
8780: 61 6e 61 6c 79 7a 65 64 2e 20 20 54 68 69 73 20  analyzed.  This 
8790: 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 61 62 6c  routine is unabl
87a0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 45 78 70  e to compute Exp
87b0: 72 2e 64 61 74 61 54 79 70 65 0a 2a 2a 20 62 65  r.dataType.** be
87c0: 63 61 75 73 65 20 69 74 20 6d 75 73 74 20 62 65  cause it must be
87d0: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74   called before t
87e0: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  he individual se
87f0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 0a  lect statements.
8800: 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 6e 61  ** have been ana
8810: 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  lyzed..*/.static
8820: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
8830: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
8840: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8850: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
8860: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
8870: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
8880: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
8890: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
88a0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
88b0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
88c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
88d0: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
88e0: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
88f0: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
8900: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
8910: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
8920: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
8930: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
8940: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
8950: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
8960: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
8970: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
8980: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
8990: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
89a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
89b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
89c0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
89d0: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
89e0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
89f0: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
8a00: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
8a10: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
8a20: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
8a30: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
8a40: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c   }.  }.  if( fil
8a50: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
8a60: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
8a70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
8a80: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
8a90: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
8aa0: 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62   if( matchOrderb
8ab0: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
8ac0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  , pSelect->pPrio
8ad0: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61  r, pOrderBy, iTa
8ae0: 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
8af0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8b00: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
8b10: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
8b20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
8b30: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8b40: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8b50: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
8b60: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  i].pExpr;.    in
8b70: 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  t iCol = -1;.   
8b80: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
8b90: 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  [i].done ) conti
8ba0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
8bb0: 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72  iteExprIsInteger
8bc0: 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20  (pE, &iCol) ){. 
8bd0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30       if( iCol<=0
8be0: 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
8bf0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
8c00: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
8c10: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
8c20: 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73     "ORDER BY pos
8c30: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
8c40: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
8c50: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
8c60: 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
8c70: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
8c80: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
8c90: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8ca0: 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70     if( !mustComp
8cb0: 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lete ) continue;
8cc0: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
8cd0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
8ce0: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
8cf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
8d00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
8d10: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
8d20: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
8d30: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
8d40: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
8d50: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
8d60: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
8d70: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
8d80: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
8d90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
8da0: 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20  >token.z );.    
8db0: 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c      zLabel = sql
8dc0: 69 74 65 53 74 72 4e 44 75 70 28 70 45 2d 3e 74  iteStrNDup(pE->t
8dd0: 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65  oken.z, pE->toke
8de0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n.n);.        sq
8df0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 61 62  liteDequote(zLab
8e00: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  el);.        if(
8e10: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
8e20: 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30  Name, zLabel)==0
8e30: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69   ){ .          i
8e40: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  Col = j;.       
8e50: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
8e60: 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20  eFree(zLabel);. 
8e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8e80: 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74   iCol<0 && sqlit
8e90: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c  eExprCompare(pE,
8ea0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45   pEList->a[j].pE
8eb0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
8ec0: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
8ed0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8ee0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
8ef0: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
8f00: 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  UMN;.      pE->i
8f10: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
8f20: 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20       pE->iTable 
8f30: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  = iTable;.      
8f40: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8f50: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  one = 1;.    }. 
8f60: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
8f70: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
8f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
8f90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
8fa0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
8fb0: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
8fc0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
8fd0: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
8fe0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
8ff0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
9000: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
9010: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
9020: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
9030: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
9040: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
9050: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
9060: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
9070: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
9080: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
9090: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
90a0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
90b0: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
90c0: 65 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  eGetVdbe(Parse *
90d0: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
90e0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
90f0: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
9100: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
9110: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
9120: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
9130: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
9140: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn v;.}../*.**
9150: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
9160: 74 73 20 74 68 65 20 45 78 70 72 2e 64 61 74 61  ts the Expr.data
9170: 54 79 70 65 20 66 69 65 6c 64 20 6f 6e 20 61 6c  Type field on al
9180: 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 2a 2a  l elements of.**
9190: 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 65 78   the pOrderBy ex
91a0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
91b0: 54 68 65 20 70 4f 72 64 65 72 42 79 20 6c 69 73  The pOrderBy lis
91c0: 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  t will have been
91d0: 0a 2a 2a 20 73 65 74 20 75 70 20 62 79 20 6d 61  .** set up by ma
91e0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
91f0: 6d 6e 28 29 2e 20 20 48 65 6e 63 65 20 65 61 63  mn().  Hence eac
9200: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  h expression has
9210: 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20  .** a TK_COLUMN 
9220: 61 73 20 69 74 73 20 72 6f 6f 74 20 6e 6f 64 65  as its root node
9230: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c  .  The Expr.iCol
9240: 75 6d 6e 20 72 65 66 65 72 73 20 74 6f 20 61 20  umn refers to a 
9250: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  .** column in th
9260: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 20  e result set.   
9270: 54 68 65 20 64 61 74 61 74 79 70 65 20 69 73 20  The datatype is 
9280: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f  set to SQLITE_SO
9290: 5f 54 45 58 54 0a 2a 2a 20 69 66 20 74 68 65 20  _TEXT.** if the 
92a0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
92b0: 6c 75 6d 6e 20 69 6e 20 70 20 61 6e 64 20 65 76  lumn in p and ev
92c0: 65 72 79 20 53 45 4c 45 43 54 20 74 6f 20 74 68  ery SELECT to th
92d0: 65 20 6c 65 66 74 20 6f 66 0a 2a 2a 20 70 20 68  e left of.** p h
92e0: 61 73 20 61 20 64 61 74 61 74 79 70 65 20 6f 66  as a datatype of
92f0: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 2e   SQLITE_SO_TEXT.
9300: 20 20 49 66 20 74 68 65 20 63 6f 6f 72 65 73 73    If the cooress
9310: 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 0a 2a  ponding column.*
9320: 2a 20 69 6e 20 70 20 6f 72 20 61 6e 79 20 6f 66  * in p or any of
9330: 20 74 68 65 20 6c 65 66 74 20 53 45 4c 45 43 54   the left SELECT
9340: 73 20 69 73 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  s is SQLITE_SO_N
9350: 55 4d 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  UM, then the dat
9360: 61 74 79 70 65 0a 2a 2a 20 6f 66 20 74 68 65 20  atype.** of the 
9370: 6f 72 64 65 72 2d 62 79 20 65 78 70 72 65 73 73  order-by express
9380: 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 53 51  ion is set to SQ
9390: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a 0a  LITE_SO_NUM..**.
93a0: 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  ** Examples:.**.
93b0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
93c0: 42 4c 45 20 6f 6e 65 28 61 20 49 4e 54 45 47 45  BLE one(a INTEGE
93d0: 52 2c 20 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20  R, b TEXT);.**  
93e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
93f0: 74 77 6f 28 63 20 56 41 52 43 48 41 52 28 35 29  two(c VARCHAR(5)
9400: 2c 20 64 20 46 4c 4f 41 54 29 3b 0a 2a 2a 0a 2a  , d FLOAT);.**.*
9410: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 62 2c 20  *     SELECT b, 
9420: 62 20 46 52 4f 4d 20 6f 6e 65 20 55 4e 49 4f 4e  b FROM one UNION
9430: 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f   SELECT d, c FRO
9440: 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20 31  M two ORDER BY 1
9450: 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  , 2;.**.** The p
9460: 72 69 6d 61 72 79 20 73 6f 72 74 20 6b 65 79 20  rimary sort key 
9470: 77 69 6c 6c 20 75 73 65 20 53 51 4c 49 54 45 5f  will use SQLITE_
9480: 53 4f 5f 4e 55 4d 20 62 65 63 61 75 73 65 20 74  SO_NUM because t
9490: 68 65 20 22 64 22 20 69 6e 0a 2a 2a 20 74 68 65  he "d" in.** the
94a0: 20 73 65 63 6f 6e 64 20 53 45 4c 45 43 54 20 69   second SELECT i
94b0: 73 20 6e 75 6d 65 72 69 63 2e 20 20 54 68 65 20  s numeric.  The 
94c0: 31 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  1st column of th
94d0: 65 20 66 69 72 73 74 20 53 45 4c 45 43 54 0a 2a  e first SELECT.*
94e0: 2a 20 69 73 20 74 65 78 74 20 62 75 74 20 74 68  * is text but th
94f0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  at does not matt
9500: 65 72 20 62 65 63 61 75 73 65 20 61 20 6e 75 6d  er because a num
9510: 65 72 69 63 20 61 6c 77 61 79 73 20 6f 76 65 72  eric always over
9520: 72 69 64 65 73 0a 2a 2a 20 61 20 74 65 78 74 2e  rides.** a text.
9530: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
9540: 64 61 72 79 20 6b 65 79 20 77 69 6c 6c 20 75 73  dary key will us
9550: 65 20 74 68 65 20 53 51 4c 49 54 45 5f 53 4f 5f  e the SQLITE_SO_
9560: 54 45 58 54 20 73 6f 72 74 20 6f 72 64 65 72 20  TEXT sort order 
9570: 62 65 63 61 75 73 65 0a 2a 2a 20 62 6f 74 68 20  because.** both 
9580: 74 68 65 20 28 73 65 63 6f 6e 64 29 20 22 62 22  the (second) "b"
9590: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 53 45   in the first SE
95a0: 4c 45 43 54 20 61 6e 64 20 74 68 65 20 22 63 22  LECT and the "c"
95b0: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
95c0: 2a 20 53 45 4c 45 43 54 20 68 61 76 65 20 61 20  * SELECT have a 
95d0: 64 61 74 61 74 79 70 65 20 6f 66 20 74 65 78 74  datatype of text
95e0: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
95f0: 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72  d multiSelectSor
9600: 74 4f 72 64 65 72 28 53 65 6c 65 63 74 20 2a 70  tOrder(Select *p
9610: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64  , ExprList *pOrd
9620: 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erBy){.  int i;.
9630: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9640: 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  st;.  if( pOrder
9650: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  By==0 ) return;.
9660: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
9670: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
9680: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9690: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  +){.      pOrder
96a0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  By->a[i].pExpr->
96b0: 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54  dataType = SQLIT
96c0: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d  E_SO_TEXT;.    }
96d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
96e0: 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f  .  multiSelectSo
96f0: 72 74 4f 72 64 65 72 28 70 2d 3e 70 50 72 69 6f  rtOrder(p->pPrio
9700: 72 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r, pOrderBy);.  
9710: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
9720: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
9730: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
9740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
9750: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
9760: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9770: 20 69 66 28 20 70 45 2d 3e 64 61 74 61 54 79 70   if( pE->dataTyp
9780: 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  e==SQLITE_SO_NUM
9790: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
97a0: 20 61 73 73 65 72 74 28 20 70 45 2d 3e 69 43 6f   assert( pE->iCo
97b0: 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 69  lumn>=0 );.    i
97c0: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
97d0: 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  >pE->iColumn ){.
97e0: 20 20 20 20 20 20 70 45 2d 3e 64 61 74 61 54 79        pE->dataTy
97f0: 70 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 54  pe = sqliteExprT
9800: 79 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ype(pEList->a[pE
9810: 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
9820: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
9830: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
9840: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
9850: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
9860: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
9870: 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74  on the.** nLimit
9880: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65   and nOffset fie
9890: 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64  lds.  nLimit and
98a0: 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   nOffset hold th
98b0: 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68  e integers.** th
98c0: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
98d0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
98e0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
98f0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
9900: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
9910: 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31   Or that hold -1
9920: 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20   and 0 if those 
9930: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
9940: 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20  tted..** iLimit 
9950: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9960: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
9970: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
9980: 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74  ers for.** count
9990: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
99a0: 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  ute the limit an
99b0: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
99c0: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d  ere is no.** lim
99d0: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
99e0: 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e  , then iLimit an
99f0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
9a00: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
9a10: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
9a20: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66  es the values if
9a30: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
9a40: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
9a50: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
9a60: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e   is defined by n
9a70: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
9a80: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
9a90: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
9aa0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
9ab0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
9ac0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
9ad0: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
9ae0: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
9af0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
9b00: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
9b10: 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e   Only if nLimit>
9b20: 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20  =0 or nOffset>0 
9b30: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
9b40: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
9b50: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
9b60: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
9b70: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
9b80: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
9b90: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
9ba0: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
9bb0: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
9bc0: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
9bd0: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
9be0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
9bf0: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
9c00: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
9c10: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
9c20: 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  t *p){.  /* .  *
9c30: 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69  * If the compari
9c40: 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74  son is p->nLimit
9c50: 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30  >0 then "LIMIT 0
9c60: 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c  " shows.  ** all
9c70: 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68   rows.  It is th
9c80: 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d  e same as no lim
9c90: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61  it. If the compa
9ca0: 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70  rision is.  ** p
9cb0: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e  ->nLimit>=0 then
9cc0: 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20   "LIMIT 0" show 
9cd0: 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a  no rows at all..
9ce0: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
9cf0: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
9d00: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
9d10: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
9d20: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
9d30: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
9d40: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
9d50: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
9d60: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
9d70: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
9d80: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
9d90: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
9da0: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  /.  if( p->nLimi
9db0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t>=0 ){.    int 
9dc0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
9dd0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
9de0: 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
9df0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
9e00: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
9e10: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  n;.    sqliteVdb
9e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
9e30: 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74  eger, -p->nLimit
9e40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
9e50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9e60: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
9e70: 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69  1);.    p->iLimi
9e80: 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20  t = iMem;.  }.  
9e90: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
9ea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d   ){.    int iMem
9eb0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9ec0: 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  +;.    Vdbe *v =
9ed0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
9ee0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
9ef0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
9f00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9f10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9f20: 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30  , -p->nOffset, 0
9f30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
9f40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
9f50: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b  Store, iMem, 1);
9f60: 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  .    p->iOffset 
9f70: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iMem;.  }.}../
9f80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9f90: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
9fa0: 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74  rocess a query t
9fb0: 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68  hat is really th
9fc0: 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e  e union.** or in
9fd0: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77  tersection of tw
9fe0: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
9ff0: 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  te queries..**.*
a000: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
a010: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
a020: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
a030: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
a040: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
a050: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
a060: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
a070: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
a080: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
a090: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
a0a0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
a0b0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
a0c0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
a0d0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
a0e0: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
a0f0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
a100: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
a110: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
a120: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
a130: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
a140: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
a150: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
a160: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
a170: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
a180: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
a190: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
a1a0: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
a1b0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
a1c0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
a1d0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
a1e0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
a1f0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
a200: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
a210: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
a220: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
a230: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
a240: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
a250: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
a260: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
a270: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
a280: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
a290: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
a2a0: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
a2b0: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
a2c0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
a2d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
a2e0: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
a2f0: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
a300: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
a310: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
a320: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
a330: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
a340: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
a350: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
a360: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
a370: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
a380: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
a390: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
a3a0: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
a3b0: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
a3c0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
a3d0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
a3e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
a3f0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
a400: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
a410: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63           /* Succ
a430: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
a440: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
a450: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
a460: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
a470: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
a480: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
a490: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
a4a0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
a4b0: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
a4c0: 56 44 42 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  VDBE */..  /* Ma
a4d0: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
a4e0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
a4f0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
a500: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
a510: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
a520: 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  st SELECT in the
a530: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
a540: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
a550: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
a560: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
a570: 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
a580: 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  1;.  pPrior = p-
a590: 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70  >pPrior;.  if( p
a5a0: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
a5b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
a5c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
a5d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
a5e0: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
a5f0: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
a600: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
a610: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
a620: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
a630: 69 66 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d  if( pPrior->nLim
a640: 69 74 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d  it>=0 || pPrior-
a650: 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20  >nOffset>0 ){.  
a660: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
a670: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
a680: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
a690: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
a6a0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
a6b0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
a6c0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
a6d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
a6e0: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
a6f0: 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69  valid query engi
a700: 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65  ne.  If not, cre
a710: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
a720: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
a730: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a740: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
a750: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72  turn 1;..  /* Cr
a760: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
a770: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
a780: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
a790: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  y.  */.  if( eDe
a7a0: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
a7b0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
a7c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
a7d0: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
a7e0: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
a7f0: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
a800: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
a810: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
a820: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
a830: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
a840: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
a850: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a860: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
a870: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
a880: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 69   ){.        pPri
a890: 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->nLimit = p->
a8a0: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  nLimit;.        
a8b0: 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 20  pPrior->nOffset 
a8c0: 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  = p->nOffset;.  
a8d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a8e0: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
a8f0: 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69  pPrior, eDest, i
a900: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Parm, 0, 0, 0);.
a910: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
a920: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a930: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
a940: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
a950: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
a960: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
a970: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
a980: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
a990: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
a9a0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   -1;.        p->
a9b0: 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
a9c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a9d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
a9e0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
a9f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
aa00: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
aa10: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
aa20: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
aa30: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
aa40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
aa50: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
aa60: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
aa70: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
aa80: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
aa90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
aaa0: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
aab0: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
aac0: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
aad0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
aae0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
aaf0: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
ab00: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
ab10: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
ab20: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
ab30: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
ab40: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
ab50: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
ab60: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
ab70: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
ab80: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
ab90: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
aba0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
abb0: 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53  t, nOffset; /* S
abc0: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
abd0: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
abe0: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
abf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ac00: 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44  rBy;  /* The ORD
ac10: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
ac20: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
ac30: 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f  T */..      prio
ac40: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
ac50: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
ac60: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
ac70: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
ac80: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
ac90: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c  erBy==0 && p->nL
aca0: 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66  imit<0 && p->nOf
acb0: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
acc0: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
acd0: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
ace0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
acf0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
ad00: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
ad10: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
ad20: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
ad30: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
ad40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
ad50: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
ad60: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
ad70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ad80: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
ad90: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
ada0: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
adb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
adc0: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
add0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
ade0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
adf0: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
ae00: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
ae10: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
ae20: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
ae30: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
ae40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ae50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae60: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
ae70: 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ALL ){.         
ae80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ae90: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
aea0: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
aeb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
aec0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
aed0: 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54  eyAsData, unionT
aee0: 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ab, 1);.        
aef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
af00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
af10: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
af20: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
af30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
af40: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
af50: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
af60: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
af70: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
af80: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
af90: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
afa0: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
afb0: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nTab, 0, 0, 0);.
afc0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
afd0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
afe0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
aff0: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
b000: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
b010: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
b020: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
b030: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
b040: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
b050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b060: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
b070: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
b080: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
b090: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
b0a0: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
b0b0: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
b0c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0d0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
b0e0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
b0f0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
b100: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
b110: 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74   0;.      nLimit
b120: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
b130: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
b140: 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65  -1;.      nOffse
b150: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
b160: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b170: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
b180: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
b190: 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69  arse, p, op, uni
b1a0: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b  onTab, 0, 0, 0);
b1b0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
b1c0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
b1d0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
b1e0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
b1f0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69  ->nLimit = nLimi
b200: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66  t;.      p->nOff
b210: 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20  set = nOffset;. 
b220: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
b230: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
b240: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
b250: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
b260: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
b270: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
b280: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
b290: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
b2a0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
b2b0: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
b2c0: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
b2d0: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
b2e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
b2f0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
b300: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
b310: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
b320: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
b330: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
b340: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
b350: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
b360: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
b370: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
b380: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
b390: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
b3a0: 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c   p->pSrc, p->pEL
b3b0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
b3c0: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
b3d0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
b3e0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
b3f0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56   iCont = sqliteV
b400: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
b430: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
b440: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b450: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
b460: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
b470: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  p);.        iSta
b480: 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  rt = sqliteVdbeC
b490: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
b4a0: 20 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c 65         multiSele
b4b0: 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20 70  ctSortOrder(p, p
b4c0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
b4d0: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
b4e0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
b4f0: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
b500: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
b510: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
b540: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
b550: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
b580: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  eak);.        if
b590: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b  ( rc ) return 1;
b5a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b5b0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b5c0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
b5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b5e0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  Op(v, OP_Next, u
b5f0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
b600: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b610: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b620: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
b630: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b640: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
b650: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
b660: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
b670: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
b680: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
b690: 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70  tTail(p, v, p->p
b6a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
b6b0: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
b6c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b6e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
b6f0: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
b700: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
b710: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
b720: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
b730: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
b740: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 0a 20 20  it, nOffset;..  
b750: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
b760: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
b770: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
b780: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
b790: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
b7a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
b7b0: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
b7c0: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
b7d0: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
b7e0: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
b7f0: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
b800: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b810: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
b820: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
b830: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
b840: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
b850: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ->pOrderBy && ma
b860: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
b870: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70  mn(pParse,p,p->p
b880: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
b890: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b8a0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
b8b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b8c0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
b8d0: 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20  p, tab1, 1);.   
b8e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b8f0: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
b900: 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20  ta, tab1, 1);.. 
b910: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
b920: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
b930: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
b940: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
b950: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b960: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
b970: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
b980: 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  r, SRT_Union, ta
b990: 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b1, 0, 0, 0);.  
b9a0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
b9b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
b9c0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
b9d0: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
b9e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
b9f0: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
ba00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ba10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
ba20: 65 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20  emp, tab2, 1);. 
ba30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ba40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
ba50: 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a  Data, tab2, 1);.
ba60: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ba70: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69  = 0;.      nLimi
ba80: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
ba90: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
baa0: 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73   -1;.      nOffs
bab0: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
bac0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
bad0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
bae0: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
baf0: 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e  Parse, p, SRT_Un
bb00: 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c  ion, tab2, 0, 0,
bb10: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
bb20: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
bb30: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
bb40: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
bb50: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
bb60: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
bb70: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
bb80: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
bb90: 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
bba0: 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
bbb0: 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
bbc0: 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
bbd0: 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
bbe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
bbf0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
bc00: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
bc10: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
bc20: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
bc30: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
bc40: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
bc50: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
bc60: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
bc70: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
bc80: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
bc90: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
bca0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
bcb0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
bcc0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  t = sqliteVdbeMa
bcd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
bce0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bcf0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
bd00: 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20  tab1, iBreak);. 
bd10: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
bd20: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
bd30: 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53 74  e, p);.      iSt
bd40: 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  art = sqliteVdbe
bd50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c  AddOp(v, OP_Full
bd60: 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  Key, tab1, 0);. 
bd70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
bd80: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
bd90: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
bda0: 29 3b 0a 20 20 20 20 20 20 6d 75 6c 74 69 53 65  );.      multiSe
bdb0: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c  lectSortOrder(p,
bdc0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
bdd0: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
bde0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
bdf0: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
be00: 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
be10: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
be40: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
be50: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29    iCont, iBreak)
be80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
be90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
bea0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
beb0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
bec0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
bed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
bee0: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
bef0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
bf00: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
bf10: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
bf20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
bf30: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
bf40: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
bf50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
bf60: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
bf70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
bf80: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
bf90: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
bfa0: 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70  SortTail(p, v, p
bfb0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
bfc0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
bfd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
bfe0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
bff0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c000: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
c010: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
c020: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
c030: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
c040: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
c050: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
c060: 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
c070: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
c080: 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
c090: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
c0a0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
c0b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
c0c0: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
c0d0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75  ->op));.    retu
c0e0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
c0f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
c100: 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
c110: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
c120: 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
c130: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
c140: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
c150: 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
c160: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
c170: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
c180: 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
c190: 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
c1a0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
c1b0: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
c1c0: 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
c1d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c1e0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
c1f0: 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
c200: 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
c210: 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
c220: 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
c230: 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
c240: 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
c250: 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
c260: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
c270: 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
c280: 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
c290: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
c2a0: 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
c2b0: 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
c2c0: 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
c2d0: 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
c2e0: 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
c2f0: 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
c300: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
c310: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
c320: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
c330: 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
c340: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
c350: 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
c360: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
c370: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69  List(ExprList*,i
c380: 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20  nt,ExprList*);  
c390: 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
c3a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c3b0: 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
c3c0: 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
c3d0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
c3e0: 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
c3f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c400: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
c410: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
c420: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
c430: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
c440: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
c450: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
c460: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
c470: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
c480: 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
c490: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
c4a0: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
c4b0: 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
c4c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c4d0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
c4e0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
c4f0: 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
c500: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
c510: 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
c520: 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
c530: 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
c540: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
c550: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
c560: 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
c570: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
c580: 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74  Type = pNew->dat
c590: 61 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  aType;.      ass
c5a0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
c5b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
c5c0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
c5d0: 69 74 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d  iteExprDup(pNew-
c5e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
c5f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
c600: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
c610: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
c620: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
c630: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
c640: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
c650: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
c660: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
c670: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  t = sqliteExprLi
c680: 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73  stDup(pNew->pLis
c690: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
c6a0: 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e  >iTable = pNew->
c6b0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
c6c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
c6d0: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
c6e0: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
c6f0: 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20  = pNew->iAgg;.  
c700: 20 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43      sqliteTokenC
c710: 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65  opy(&pExpr->toke
c720: 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
c730: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 54 6f  ;.      sqliteTo
c740: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
c750: 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61  span, &pNew->spa
c760: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
c770: 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
c780: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
c790: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
c7a0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
c7b0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
c7c0: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
c7d0: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
c7e0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54  pExpr->pList, iT
c7f0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
c800: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
c810: 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73 74 28   .substExprList(
c820: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c830: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
c840: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
c850: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c860: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
c870: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c880: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c890: 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
c8a0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c8b0: 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
c8c0: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
c8d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
c8e0: 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
c8f0: 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
c900: 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a   order to speed.
c910: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49  ** execution.  I
c920: 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  t returns 1 if i
c930: 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
c940: 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
c950: 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73  tening.** occurs
c960: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
c970: 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
c980: 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
c990: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
c9a0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
c9b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
c9c0: 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
c9d0: 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
c9e0: 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
c9f0: 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
ca00: 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
ca10: 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
ca20: 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
ca30: 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
ca40: 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
ca50: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
ca60: 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
ca70: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
ca80: 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
ca90: 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
caa0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
cab0: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
cac0: 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
cad0: 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
cae0: 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
caf0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
cb00: 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
cb10: 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
cb20: 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
cb30: 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
cb40: 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
cb50: 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
cb60: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
cb70: 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
cb80: 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
cb90: 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
cba0: 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
cbb0: 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
cbc0: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
cbd0: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
cbe0: 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
cbf0: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
cc00: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
cc10: 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
cc20: 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
cc30: 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
cc40: 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
cc50: 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
cc60: 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
cc70: 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
cc80: 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
cc90: 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
cca0: 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
ccb0: 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
ccc0: 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
ccd0: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
cce0: 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
ccf0: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
cd00: 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
cd10: 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
cd20: 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
cd30: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
cd40: 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
cd50: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
cd60: 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
cd70: 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
cd80: 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
cd90: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
cda0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
cdb0: 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
cdc0: 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
cdd0: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
cde0: 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c  left outer join,
cdf0: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68   or.**        th
ce00: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
ce10: 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e  t itself a join.
ce20: 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a    (Ticket #306).
ce30: 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
ce40: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
ce50: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
ce60: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
ce70: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
ce80: 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62  *   (5)  The sub
ce90: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
cea0: 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
ceb0: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
cec0: 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
ced0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
cee0: 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
cef0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
cf00: 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
cf10: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
cf20: 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
cf30: 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
cf40: 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
cf50: 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
cf60: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
cf70: 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
cf80: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
cf90: 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
cfa0: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
cfb0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
cfc0: 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
cfd0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
cfe0: 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
cff0: 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
d000: 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
d010: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
d020: 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
d030: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
d040: 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
d050: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d060: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
d070: 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
d080: 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
d090: 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
d0a0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
d0b0: 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
d0c0: 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
d0d0: 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20  *.**  (12)  The 
d0e0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
d0f0: 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
d100: 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
d110: 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  OIN or the.**   
d120: 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61       subquery ha
d130: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
d140: 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69  e.  (added by ti
d150: 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a  cket #350).**.**
d160: 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
d170: 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
d180: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
d190: 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
d1a0: 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
d1b0: 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
d1c0: 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
d1d0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
d1e0: 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
d1f0: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
d200: 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
d210: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
d220: 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
d230: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
d240: 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
d250: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
d260: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d270: 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
d280: 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
d290: 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
d2a0: 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
d2b0: 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
d2c0: 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
d2d0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
d2e0: 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
d2f0: 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
d300: 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
d310: 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
d320: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
d330: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
d340: 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
d350: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
d360: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
d370: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
d380: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
d390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d3a0: 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
d3b0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
d3c0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
d3d0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
d3e0: 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
d3f0: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
d400: 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
d410: 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
d420: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
d430: 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
d440: 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
d450: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
d460: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
d470: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
d480: 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
d490: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
d4a0: 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
d4b0: 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
d4c0: 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
d4d0: 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
d4e0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
d4f0: 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
d500: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
d510: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
d520: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
d530: 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
d540: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
d550: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
d560: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
d570: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
d580: 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
d590: 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
d5a0: 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
d5b0: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
d5c0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
d5d0: 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
d5e0: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
d5f0: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 57 68  t i;.  Expr *pWh
d600: 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ere;..  /* Check
d610: 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
d620: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
d630: 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
d640: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
d650: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
d660: 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
d670: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
d680: 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
d690: 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
d6a0: 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20 70  rc );.  pSub = p
d6b0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53  Src->a[iFrom].pS
d6c0: 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
d6d0: 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
d6e0: 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
d6f0: 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
d700: 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75  n 0;.  if( subqu
d710: 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
d720: 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
d730: 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d  n 0;.  pSubSrc =
d740: 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
d750: 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
d760: 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
d770: 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
d780: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
d790: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
d7a0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  pSub->nLimit>=0)
d7b0: 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63   &&  (pSrc->nSrc
d7c0: 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
d7d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d7e0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44   }.  if( (p->isD
d7f0: 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c  istinct || p->nL
d800: 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71  imit>=0) && subq
d810: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
d820: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
d830: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
d840: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
d850: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
d860: 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
d870: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
d880: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
d890: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
d8a0: 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
d8b0: 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
d8c0: 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
d8d0: 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
d8e0: 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
d8f0: 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
d900: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
d910: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
d920: 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
d930: 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
d940: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
d950: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
d960: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
d970: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
d980: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
d990: 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
d9a0: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
d9b0: 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
d9c0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
d9d0: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
d9e0: 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
d9f0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
da00: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
da10: 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
da20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
da30: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
da40: 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
da50: 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
da60: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
da70: 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
da80: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
da90: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
daa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
dab0: 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
dac0: 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
dad0: 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
dae0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
daf0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
db00: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
db10: 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
db20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
db30: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
db40: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
db50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
db60: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
db70: 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
db80: 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
db90: 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
dba0: 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
dbb0: 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
dbc0: 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
dbd0: 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
dbe0: 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
dbf0: 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
dc00: 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
dc10: 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
dc20: 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
dc30: 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
dc40: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
dc50: 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
dc60: 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
dc70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
dc80: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
dc90: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
dca0: 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
dcb0: 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
dcc0: 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
dcd0: 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
dce0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
dcf0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
dd00: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
dd10: 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
dd20: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
dd30: 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
dd40: 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
dd50: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
dd60: 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
dd70: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
dd80: 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
dd90: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
dda0: 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
ddb0: 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
ddc0: 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
ddd0: 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
dde0: 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
ddf0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
de00: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
de10: 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
de20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
de30: 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
de40: 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
de50: 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
de60: 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
de70: 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
de80: 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
de90: 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
dea0: 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
deb0: 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
dec0: 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
ded0: 61 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  arent = pSrc->a[
dee0: 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
def0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62    {.    int nSub
df00: 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
df10: 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
df20: 6e 74 79 70 65 20 3d 20 70 53 72 63 2d 3e 61 5b  ntype = pSrc->a[
df30: 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 3b  iFrom].jointype;
df40: 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  ..    if( pSrc->
df50: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26  a[iFrom].pTab &&
df60: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
df70: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
df80: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
df90: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  eDeleteTable(0, 
dfa0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
dfb0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
dfc0: 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d  sqliteFree(pSrc-
dfd0: 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61 74 61 62  >a[iFrom].zDatab
dfe0: 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
dff0: 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72  Free(pSrc->a[iFr
e000: 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  om].zName);.    
e010: 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d  sqliteFree(pSrc-
e020: 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73  >a[iFrom].zAlias
e030: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  );.    if( nSubS
e040: 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rc>1 ){.      in
e050: 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72  t extra = nSubSr
e060: 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  c - 1;.      for
e070: 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=1; i<nSubSrc;
e080: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
e090: 53 72 63 20 3d 20 73 71 6c 69 74 65 53 72 63 4c  Src = sqliteSrcL
e0a0: 69 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20  istAppend(pSrc, 
e0b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
e0c0: 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70       p->pSrc = p
e0d0: 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
e0e0: 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
e0f0: 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69  -extra>=iFrom; i
e100: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  --){.        pSr
e110: 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e  c->a[i] = pSrc->
e120: 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20  a[i-extra];.    
e130: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
e140: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
e150: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53  ; i++){.      pS
e160: 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
e170: 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
e180: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
e190: 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
e1a0: 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
e1b0: 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
e1c0: 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b    pSrc->a[iFrom+
e1d0: 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74  nSubSrc-1].joint
e1e0: 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
e1f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65    }..  /* Now be
e200: 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
e210: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
e220: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
e230: 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72   for .  ** refer
e240: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
e250: 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
e260: 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20  r query..  ** . 
e270: 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
e280: 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20  *.  **   SELECT 
e290: 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
e2a0: 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
e2b0: 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
e2c0: 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
e2d0: 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
e2f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
e300: 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
e310: 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20           /.  ** 
e320: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
e330: 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
e340: 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
e350: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e360: 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ____/.  **.  ** 
e370: 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
e380: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
e390: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
e3a0: 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
e3b0: 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77  e see.  ** "a" w
e3c0: 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
e3d0: 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
e3e0: 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
e3f0: 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
e400: 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74  0"..  */.  subst
e410: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
e420: 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
e430: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c  b->pEList);.  pL
e440: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
e450: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
e460: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
e470: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
e480: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
e490: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
e4a0: 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
e4b0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
e4c0: 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
e4d0: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
e4e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
e4f0: 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e  NDup(pExpr->span
e500: 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
e510: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
e520: 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
e530: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
e540: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
e550: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
e560: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
e570: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
e580: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
e590: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
e5a0: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
e5b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e5c0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
e5d0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
e5e0: 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
e5f0: 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
e600: 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
e610: 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
e620: 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
e630: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
e640: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
e650: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
e660: 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
e670: 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
e680: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
e690: 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a  (pSub->pWhere);.
e6a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68    }else{.    pWh
e6b0: 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ere = 0;.  }.  i
e6c0: 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
e6d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e6e0: 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  p->pHaving==0 );
e6f0: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
e700: 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
e710: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
e720: 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ere;.    substEx
e730: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
e740: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e750: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
e760: 53 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  Sub->pHaving ){.
e770: 20 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76        Expr *pHav
e780: 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ing = sqliteExpr
e790: 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e  Dup(pSub->pHavin
e7a0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  g);.      if( p-
e7b0: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
e7c0: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
e7d0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
e7e0: 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ND, p->pHaving, 
e7f0: 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20  pHaving, 0);.   
e800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e810: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
e820: 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a  Having;.      }.
e830: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
e840: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
e850: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
e860: 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72  pBy = sqliteExpr
e870: 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47  ListDup(pSub->pG
e880: 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65  roupBy);.  }else
e890: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
e8a0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65  0 ){.    p->pWhe
e8b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d  re = pWhere;.  }
e8c0: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
e8d0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
e8e0: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e8f0: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
e900: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
e910: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
e920: 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  eExpr(TK_AND, p-
e930: 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c  >pWhere, pWhere,
e940: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
e950: 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
e960: 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
e970: 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
e980: 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
e990: 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
e9a0: 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
e9b0: 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
e9c0: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
e9d0: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
e9e0: 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54  istinct;..  /* T
e9f0: 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69 6d 69  ransfer the limi
ea00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  t expression fro
ea10: 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  m the subquery t
ea20: 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a  o the outer.  **
ea30: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69   query..  */.  i
ea40: 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  f( pSub->nLimit>
ea50: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
ea60: 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20  >nLimit<0 ){.   
ea70: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70     p->nLimit = p
ea80: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  Sub->nLimit;.   
ea90: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c   }else if( p->nL
eaa0: 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20  imit+p->nOffset 
eab0: 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70  > pSub->nLimit+p
eac0: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a  Sub->nOffset ){.
ead0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
eae0: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b  = pSub->nLimit +
eaf0: 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d   pSub->nOffset -
eb00: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
eb10: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66   }.  }.  p->nOff
eb20: 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66  set += pSub->nOf
eb30: 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69  fset;..  /* Fini
eb40: 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
eb50: 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
eb60: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
eb70: 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
eb80: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
eb90: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
eba0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
ebb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
ebc0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
ebd0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
ebe0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
ebf0: 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
ec00: 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
ec10: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
ec20: 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
ec30: 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
ec40: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
ec50: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
ec60: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
ec70: 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
ec80: 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
ec90: 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
eca0: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
ecb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20   and return 1.  
ecc0: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
ecd0: 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
ece0: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
ecf0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
ed00: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
ed10: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
ed20: 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
ed30: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
ed40: 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
ed50: 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
ed60: 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
ed70: 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
ed80: 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
ed90: 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
eda0: 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
edb0: 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
edc0: 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
edd0: 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
ede0: 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
edf0: 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
ee00: 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
ee10: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
ee20: 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
ee30: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
ee40: 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
ee50: 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
ee60: 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
ee70: 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
ee80: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
ee90: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
eea0: 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
eeb0: 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
eec0: 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53  teSelect()..** S
eed0: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
eee0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
eef0: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
ef00: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
ef10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ef20: 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
ef30: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
ef40: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
ef50: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
ef60: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
ef70: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
ef80: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
ef90: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
efa0: 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a  t base;.  Vdbe *
efb0: 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b  v;.  int seekOp;
efc0: 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45  .  int cont;.  E
efd0: 78 70 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20  xprList eList;. 
efe0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
eff0: 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
f000: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
f010: 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72  see if this quer
f020: 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  y is a simple mi
f030: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
f040: 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a  ry.  Return.  **
f050: 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20   zero if it is  
f060: 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
f070: 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70  p->pGroupBy || p
f080: 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e  ->pHaving || p->
f090: 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
f0a0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  0;.  if( p->pSrc
f0b0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
f0c0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
f0d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
f0e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
f0f0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
f100: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
f110: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
f120: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
f130: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f140: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
f150: 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  || pExpr->pList-
f160: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
f170: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
f180: 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
f190: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f1a0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
f1b0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
f1c0: 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
f1d0: 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77   seekOp = OP_Rew
f1e0: 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ind;.  }else if(
f1f0: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
f200: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
f210: 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
f220: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61    seekOp = OP_La
f230: 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
f240: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f250: 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
f260: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
f270: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
f280: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
f290: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
f2a0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
f2b0: 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  n;.  pTab = p->p
f2c0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
f2d0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
f2e0: 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e  to here, it mean
f2f0: 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  s the query is o
f300: 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f  f the correct fo
f310: 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74  rm..  ** Check t
f320: 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68  o make sure we h
f330: 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ave an index and
f340: 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74   make pIdx point
f350: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70   to the.  ** app
f360: 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20  ropriate index. 
f370: 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   If the min() or
f380: 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20   max() is on an 
f390: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a  INTEGER PRIMARY.
f3a0: 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c    ** key column,
f3b0: 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63   no index is nec
f3c0: 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49  essary so set pI
f3d0: 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  dx to NULL.  If 
f3e0: 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69  no.  ** usable i
f3f0: 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72  ndex is found, r
f400: 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
f410: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
f420: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65    pIdx = 0;.  }e
f430: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
f440: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
f450: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
f460: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
f470: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
f480: 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20  lumn>=1 );.     
f490: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
f4a0: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62  umn[0]==iCol ) b
f4b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f4c0: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65  if( pIdx==0 ) re
f4d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
f4e0: 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
f4f0: 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
f500: 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20  ll be using the 
f510: 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
f520: 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
f530: 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
f540: 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
f550: 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
f560: 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68  ry cell..  ** Th
f570: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68  e column names h
f580: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
f590: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
f5a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
f5b0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  on..  */.  v = s
f5c0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
f5d0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
f5e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f5f0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
f600: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
f610: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
f620: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
f630: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  c, p->pEList);. 
f640: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
f650: 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
f660: 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
f670: 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
f680: 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
f690: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
f6a0: 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
f6b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f6c0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
f6d0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d  , iParm, 0);.  }
f6e0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e  ..  /* Generatin
f6f0: 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74  g code to find t
f700: 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61  he min or the ma
f710: 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c  x.  Basically al
f720: 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
f730: 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65  o do is find the
f740: 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61   first or the la
f750: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
f760: 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49  chosen index.  I
f770: 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29  f.  ** the min()
f780: 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20   or max() is on 
f790: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
f7a0: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69  ARY KEY, then fi
f7b0: 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  nd the first.  *
f7c0: 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20  * or last entry 
f7d0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
f7e0: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
f7f0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
f800: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69  (pParse, pTab->i
f810: 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70 2d  Db);.  base = p-
f820: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  >pSrc->a[0].iCur
f830: 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  sor;.  computeLi
f840: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
f850: 72 73 65 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74  rse, p);.  sqlit
f860: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f870: 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e  _Integer, pTab->
f880: 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  iDb, 0);.  sqlit
f890: 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  eVdbeOp3(v, OP_O
f8a0: 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2c 20 70  penRead, base, p
f8b0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  Tab->tnum, pTab-
f8c0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 63 6f  >zName, 0);.  co
f8d0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
f8e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
f8f0: 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
f900: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f910: 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
f920: 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
f930: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f940: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
f950: 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
f960: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
f970: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
f980: 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78  ad, base+1, pIdx
f990: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 7a 4e  ->tnum, pIdx->zN
f9a0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
f9b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f9c0: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
f9d0: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
f9e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f9f0: 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20  v, OP_IdxRecno, 
fa00: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
fa10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fa20: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
fa30: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
fa40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fa50: 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c  OP_MoveTo, base,
fa60: 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
fa70: 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
fa80: 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
fa90: 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
faa0: 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
fab0: 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
fac0: 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
fad0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65  pr = pExpr;.  se
fae0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
faf0: 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c  arse, p, &eList,
fb00: 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44   0, 0, 0, -1, eD
fb10: 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74  est, iParm, cont
fb20: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
fb30: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
fb40: 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71  l(v, cont);.  sq
fb50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fb60: 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
fb70: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b   0);.  return 1;
fb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
fb90: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
fba0: 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
fbb0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
fbc0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
fbd0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
fbe0: 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
fbf0: 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
fc00: 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
fc10: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
fc20: 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
fc30: 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
fc40: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
fc50: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
fc80: 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
fc90: 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
fca0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
fcb0: 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
fcc0: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
fcd0: 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
fce0: 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
fcf0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
fd00: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
fd10: 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
fd20: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
fd30: 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c  s keys of a tabl
fd40: 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 50  e with cursor iP
fd50: 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
fd60: 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
fd70: 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
fd80: 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
fd90: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
fda0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
fdb0: 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
fdc0: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
fdd0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
fde0: 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
fdf0: 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
fe00: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
fe10: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
fe20: 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
fe30: 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20  The table above 
fe40: 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20  is incomplete.  
fe50: 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74  Additional eDist
fe60: 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61   value have be a
fe70: 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68  dded.** since th
fe80: 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77  is comment was w
fe90: 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65  ritten.  See the
fea0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
feb0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a  () function for.
fec0: 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69  ** a complete li
fed0: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c  sting of the all
fee0: 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65  owed values of e
fef0: 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d  Dest and their m
ff00: 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  eanings..**.** T
ff10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
ff20: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
ff30: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
ff40: 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
ff50: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
ff60: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
ff70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
ff80: 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
ff90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
ffa0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ffb0: 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
ffc0: 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
ffd0: 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
ffe0: 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
fff0: 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
10000 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20   do that..**.** 
10010 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72  The pParent, par
10020 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61  entTab, and *pPa
10030 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61  rentAgg fields a
10040 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20  re filled in if 
10050 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69  this.** SELECT i
10060 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54  s a subquery.  T
10070 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
10080 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  try to combine t
10090 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  his SELECT.** wi
100a0 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f  th its parent to
100b0 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66   form a single f
100c0 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73  lat query.  In s
100d0 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68  o doing, it migh
100e0 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20  t.** change the 
100f0 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f  parent query fro
10100 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  m a non-aggregat
10110 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74  e to an aggregat
10120 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20  e query..** For 
10130 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65  that reason, the
10140 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67   pParentAgg flag
10150 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20   is passed as a 
10160 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a  pointer, so it.*
10170 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
10180 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
10190 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  1:   The meaning
101a0 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20   of the pParent 
101b0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
101c0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
101d0 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43  M t1 JOIN (SELEC
101e0 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T x, count(*) FR
101f0 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a  OM t2) JOIN t3;.
10200 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  **    \         
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
10220 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
10230 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f  ______/        /
10240 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20  .**     \       
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10280 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
10290 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
102a0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
102b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
102c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
102d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
102e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
102f0 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68   first.   For th
10300 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72  at call,.** pPar
10310 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ent will be NULL
10320 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72  .  During the pr
10330 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
10340 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69  outer query, thi
10350 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  s .** routine is
10360 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
10370 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ely to handle th
10380 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72  e subquery.  For
10390 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a   the recursive.*
103a0 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20  * call, pParent 
103b0 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68  will point to th
103c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
103d0 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71  Because the subq
103e0 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73  uery is.** the s
103f0 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e  econd element in
10400 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
10410 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62  n, the parentTab
10420 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
10430 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64  ** be 1 (the 2nd
10440 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e   value of a 0-in
10450 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f  dexed array.).*/
10460 0a 69 6e 74 20 73 71 6c 69 74 65 53 65 6c 65 63  .int sqliteSelec
10470 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
10480 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
10490 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
104a0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
104b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
104c0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
104d0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
104e0 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
104f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
10500 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
10510 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
10520 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
10530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10540 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
10550 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
10560 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
10570 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
10580 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
10590 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
105a0 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
105b0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
105c0 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
105d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
105e0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
105f0 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
10600 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
10610 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g        /* True
10620 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
10630 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
10640 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ions */.){.  int
10650 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   i;.  WhereInfo 
10660 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20  *pWInfo;.  Vdbe 
10670 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20  *v;.  int isAgg 
10680 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
10690 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
106a0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
106b0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
106c0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
106d0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
106e0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
106f0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
10700 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
10710 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
10720 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
10730 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
10740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10750 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
10760 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
10770 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
10780 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
10790 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
107a0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
107b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
107c0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
107d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
107e0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
107f0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
10800 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
10810 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
10820 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
10830 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
10840 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
10850 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
10860 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
10870 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
10880 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
10890 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
108a0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
108b0 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
108c0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
108d0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
108e0 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
108f0 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  nction */..  if(
10900 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
10910 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
10920 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20  >nErr || p==0 ) 
10930 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
10940 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
10950 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
10960 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
10970 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
10980 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
10990 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
109a0 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
109b0 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
109c0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
109d0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
109e0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
109f0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
10a00 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
10a10 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
10a20 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
10a30 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
10a40 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
10a50 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
10a60 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
10a70 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f   p->pWhere;.  pO
10a80 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
10a90 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79  erBy;.  pGroupBy
10aa0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
10ab0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
10ac0 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
10ad0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
10ae0 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  inct;..  /* Allo
10af0 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f 72  cate VDBE cursor
10b00 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  s for each table
10b10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
10b20 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  use.  */.  sqlit
10b30 65 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  eSrcListAssignCu
10b40 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
10b50 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a  abList);..  /* .
10b60 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e    ** Do not even
10b70 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65   attempt to gene
10b80 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66  rate any code if
10b90 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
10ba0 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72   seen.  ** error
10bb0 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  s before this ro
10bc0 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20  utine starts..  
10bd0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
10be0 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73  >nErr>0 ) goto s
10bf0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
10c00 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22 20   Expand any "*" 
10c10 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73  terms in the res
10c20 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20 65  ult set.  (For e
10c30 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20 69  xample the "*" i
10c40 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a  n.  ** "SELECT *
10c50 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65 20   FROM t1")  The 
10c60 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74  fillInColumnlist
10c70 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  () routine also 
10c80 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f  does some.  ** o
10c90 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69 6e  ther housekeepin
10ca0 67 20 2d 20 73 65 65 20 74 68 65 20 68 65 61 64  g - see the head
10cb0 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64  er comment for d
10cc0 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69  etails..  */.  i
10cd0 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
10ce0 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  ist(pParse, p) )
10cf0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
10d00 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68  t_end;.  }.  pWh
10d10 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
10d20 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
10d30 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
10d40 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ist==0 ) goto se
10d50 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
10d60 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
10d70 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
10d80 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
10d90 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
10da0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
10db0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44  ..  */.  if( (eD
10dc0 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
10dd0 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
10de0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
10df0 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
10e00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10e10 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
10e20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
10e30 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
10e40 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
10e50 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
10e60 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ion");.    goto 
10e70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
10e80 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69  .  /* ORDER BY i
10e90 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f  s ignored for so
10ea0 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e  me destinations.
10eb0 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
10ec0 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
10ed0 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20  e SRT_Union:.   
10ee0 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
10ef0 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
10f00 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70 4f  iscard:.      pO
10f10 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
10f20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
10f30 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61  ault:.      brea
10f40 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  k;.  }..  /* At 
10f50 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 73  this point, we s
10f60 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63  hould have alloc
10f70 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75 72  ated all the cur
10f80 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20 2a  sors that we.  *
10f90 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65  * need to handle
10fa0 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20 74   subquerys and t
10fb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
10fc0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73    .  **.  ** Res
10fd0 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  olve the column 
10fe0 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73  names and do a s
10ff0 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f  emantics check o
11000 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  n all the expres
11010 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  sions..  */.  fo
11020 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
11030 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11040 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11050 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11060 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
11070 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11080 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
11090 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
110a0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
110b0 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
110c0 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
110d0 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67  .pExpr, 1, &isAg
110e0 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
110f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11100 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68   }.  }.  if( pWh
11110 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ere ){.    if( s
11120 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
11130 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11140 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57  List, pEList, pW
11150 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67  here) ){.      g
11160 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11170 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
11180 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
11190 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c  arse, pWhere, 0,
111a0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   0) ){.      got
111b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
111c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48    }.  }.  if( pH
111d0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28  aving ){.    if(
111e0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
111f0 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
11200 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
11210 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
11220 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
11230 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
11240 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11250 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
11260 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
11270 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11280 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11290 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
112a0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
112b0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
112c0 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
112d0 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  k(pParse, pHavin
112e0 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b  g, 1, &isAgg) ){
112f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
11300 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
11310 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  }.  if( pOrderBy
11320 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
11330 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
11340 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11350 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
11360 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
11370 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
11380 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11390 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  eExprIsInteger(p
113a0 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f  E, &iCol) && iCo
113b0 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
113c0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
113d0 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
113e0 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20  Delete(pE);.    
113f0 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42      pE = pOrderB
11400 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  y->a[i].pExpr = 
11410 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45  sqliteExprDup(pE
11420 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
11430 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
11440 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11450 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
11460 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
11470 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a   pEList, pE) ){.
11480 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11490 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
114a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
114b0 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
114c0 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  e, pE, isAgg, 0)
114d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
114e0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
114f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
11500 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
11510 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
11520 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11530 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
11540 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iCol)==0 ){.    
11550 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
11560 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
11570 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
11580 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
11590 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
115a0 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20  r constants");. 
115b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
115c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
115d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
115e0 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
115f0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
11600 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
11610 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
11620 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44              "ORD
11630 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d  ER BY column num
11640 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61  ber %d out of ra
11650 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
11660 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
11670 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
11680 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d  ", iCol, pEList-
11690 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
116a0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
116b0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
116c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
116d0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
116e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
116f0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
11700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
11710 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78  t iCol;.      Ex
11720 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42  pr *pE = pGroupB
11730 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
11740 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11750 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
11760 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e   &iCol) && iCol>
11770 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73  0 && iCol<=pELis
11780 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11790 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
117a0 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
117b0 20 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d    pE = pGroupBy-
117c0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
117d0 6c 69 74 65 45 78 70 72 44 75 70 28 70 45 4c 69  liteExprDup(pELi
117e0 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
117f0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
11800 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
11810 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
11820 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
11830 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  EList, pE) ){.  
11840 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11850 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
11860 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11870 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
11880 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
11890 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
118a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
118b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
118c0 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
118d0 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  t(pE) ){.       
118e0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
118f0 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
11900 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
11910 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
11920 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
11930 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59         "GROUP BY
11940 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
11950 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
11960 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20  onstants");.    
11970 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11980 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
11990 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30  else if( iCol<=0
119a0 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
119b0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
119c0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
119d0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
119e0 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42          "GROUP B
119f0 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
11a00 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
11a10 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
11a20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77             "betw
11a30 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69  een 1 and %d", i
11a40 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
11a50 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  pr);.          g
11a60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
11a90 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
11aa0 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
11ab0 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
11ac0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11ad0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
11ae0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
11af0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
11b00 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
11b10 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e  be using them in
11b20 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68   a callback.  Th
11b30 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
11b40 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
11b50 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
11b60 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73  o some other des
11b70 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  tination..  */. 
11b80 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
11b90 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
11ba0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
11bb0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
11bc0 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
11bd0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
11be0 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  or the special c
11bf0 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f  ase of a min() o
11c00 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
11c10 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20   by itself.  ** 
11c20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
11c30 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69  t..  */.  if( si
11c40 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
11c50 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
11c60 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20  , iParm) ){.    
11c70 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  rc = 0;.    goto
11c80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
11c90 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11ca0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
11cb0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
11cc0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
11cd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
11ce0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
11cf0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
11d00 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
11d10 6e 74 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e  ntext;.    int n
11d20 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
11d30 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62  t;..    if( pTab
11d40 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
11d50 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ct==0 ) continue
11d60 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ;.    if( pTabLi
11d70 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d  st->a[i].zName!=
11d80 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
11d90 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
11da0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
11db0 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
11dc0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
11dd0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
11de0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65  .zName;.      ne
11df0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
11e00 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
11e10 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
11e20 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  reContext = 0;. 
11e30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53     }.    sqliteS
11e40 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
11e50 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
11e60 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61  lect, SRT_TempTa
11e70 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ble, .          
11e80 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
11e90 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70  >a[i].iCursor, p
11ea0 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a 20 20  , i, &isAgg);.  
11eb0 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
11ec0 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
11ed0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
11ee0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
11ef0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
11f00 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
11f10 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
11f20 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
11f30 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21  ;.    if( eDest!
11f40 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44  =SRT_Union && eD
11f50 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20  est!=SRT_Except 
11f60 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69  && eDest!=SRT_Di
11f70 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70  scard ){.      p
11f80 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11f90 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
11fa0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
11fb0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
11fc0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
11fd0 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
11fe0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
11ff0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  t;.  }..  /* Che
12000 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
12010 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
12020 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61  that can be "fla
12030 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73  ttened" into its
12040 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66   parent..  ** If
12050 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
12060 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20   possiblity, do 
12070 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  so and return im
12080 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a  mediately.  .  *
12090 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
120a0 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
120b0 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
120c0 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
120d0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
120e0 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
120f0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
12100 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
12110 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72  ntAgg = 1;.    r
12120 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
12130 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
12140 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70  ter..  */.  comp
12150 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
12160 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20  s(pParse, p);.. 
12170 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
12180 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20  umn types if we 
12190 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 61 20  will be using a 
121a0 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
121b0 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
121c0 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
121d0 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
121e0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
121f0 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 63  er.  ** than a c
12200 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  allback..  **.  
12210 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  ** We have to do
12220 20 74 68 69 73 20 73 65 70 61 72 61 74 65 6c 79   this separately
12230 20 66 72 6f 6d 20 74 68 65 20 63 72 65 61 74 69   from the creati
12240 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  on of column nam
12250 65 73 0a 20 20 2a 2a 20 61 62 6f 76 65 20 62 65  es.  ** above be
12260 63 61 75 73 65 20 69 66 20 74 68 65 20 70 54 61  cause if the pTa
12270 62 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 76  bList contains v
12280 69 65 77 73 20 74 68 65 6e 20 74 68 65 79 20 77  iews then they w
12290 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 68 61 76  ill not.  ** hav
122a0 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 20  e been resolved 
122b0 61 6e 64 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  and we will not 
122c0 6b 6e 6f 77 20 74 68 65 20 63 6f 6c 75 6d 6e 20  know the column 
122d0 74 79 70 65 73 20 75 6e 74 69 6c 0a 20 20 2a 2a  types until.  **
122e0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
122f0 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
12300 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
12310 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
12320 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
12330 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
12340 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
12350 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
12360 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
12370 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
12380 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
12390 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
123a0 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
123b0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
123c0 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
123d0 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 0);.  }..  
123e0 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
123f0 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
12400 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
12410 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
12420 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
12430 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  se);.  if( isAgg
12440 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a   || pGroupBy ){.
12450 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
12460 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20  se->nAgg==0 );. 
12470 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
12480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
12490 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
124a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
124b0 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
124c0 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
124d0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
124e0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
124f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12510 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
12520 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
12530 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
12540 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12550 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
12560 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
12570 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
12580 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
12590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
125a0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
125b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
125c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
125d0 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
125e0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
125f0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
12600 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
12610 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
12630 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
12640 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
12650 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
12660 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
12670 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
12680 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
12690 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
126a0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
126b0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
126c0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
126d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
126e0 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
126f0 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
12700 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
12710 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
12720 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
12730 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
12740 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
12750 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
12760 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
12770 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
12780 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
12790 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
127a0 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
127b0 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
127c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
127d0 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20  qliteVdbeOp3(v, 
127e0 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69  OP_AggInit, 0, i
127f0 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20  , (char*)pFunc, 
12800 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
12810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12820 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
12830 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
12840 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
12850 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
12860 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12870 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75  Op(v, OP_AggFocu
12880 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  s, 0, 0);.    }.
12890 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
128a0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
128b0 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a  cell to NULL.  *
128c0 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
128d0 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  RT_Mem ){.    sq
128e0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
128f0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
12900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
12910 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
12920 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
12930 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
12940 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
12950 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
12960 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
12970 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73    */.  if( isDis
12980 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73  tinct ){.    dis
12990 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
129a0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
129b0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
129c0 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74  P_OpenTemp, dist
129d0 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  inct, 1);.  }els
129e0 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
129f0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
12a00 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
12a10 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70  se scan.  */.  p
12a20 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68  WInfo = sqliteWh
12a30 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
12a40 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
12a50 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a70 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20     pGroupBy ? 0 
12a80 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  : &pOrderBy);.  
12a90 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
12aa0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12ab0 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  ..  /* Use the s
12ac0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
12ad0 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  op if we are not
12ae0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
12af0 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20  ** aggregates.  
12b00 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
12b10 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  ){.    if( selec
12b20 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
12b30 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
12b40 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
12b50 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b70 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f     iParm, pWInfo
12b80 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
12b90 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a  nfo->iBreak) ){.
12ba0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
12bb0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
12bc0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
12bd0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
12be0 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20  ggregates, then 
12bf0 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61  do the special a
12c00 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72  ggregate.  ** pr
12c10 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f  ocessing.  .  */
12c20 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28  .  else{.    if(
12c30 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
12c40 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20     int lbl1;.   
12c50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
12c60 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
12c70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
12c80 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
12c90 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
12ca0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
12cb0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
12cc0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
12cd0 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79  akeKey, pGroupBy
12ce0 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
12cf0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64     if( pParse->d
12d00 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
12d10 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79  4 ) sqliteAddKey
12d20 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42 79  Type(v, pGroupBy
12d30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
12d40 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
12d50 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
12d60 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12d70 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
12d80 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f   lbl1);.      fo
12d90 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
12da0 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
12db0 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
12dc0 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
12dd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12de0 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
12df0 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  e(pParse, pParse
12e00 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29  ->aAgg[i].pExpr)
12e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12e20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12e30 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20  AggSet, 0, i);. 
12e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12e50 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
12e60 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
12e70 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
12e80 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
12e90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
12ea0 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74  r *pE;.      int
12eb0 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   j;.      if( !p
12ec0 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
12ed0 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
12ee0 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61 72  .      pE = pPar
12ef0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
12f00 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
12f10 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
12f20 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
12f30 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20    if( pE->pList 
12f40 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
12f50 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d  =0; j<pE->pList-
12f60 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
12f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
12f80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
12f90 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  E->pList->a[j].p
12fa0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
12fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12fc0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12fd0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
12fe0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12ff0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13000 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d  _AggFunc, 0, pE-
13010 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69  >pList ? pE->pLi
13020 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
13030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13040 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
13050 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unc!=0 );.      
13060 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13070 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78  aAgg[i].pFunc->x
13080 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
13090 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
130a0 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
130b0 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  *)pParse->aAgg[i
130c0 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e  ].pFunc, P3_POIN
130d0 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TER);.    }.  }.
130e0 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61  .  /* End the da
130f0 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
13100 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57  ..  */.  sqliteW
13110 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
13120 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
13130 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
13140 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20  egates, we need 
13150 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f  to set up a seco
13160 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65  nd loop.  ** ove
13170 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67  r all of the agg
13180 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e  regate values an
13190 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a  d process them..
131a0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
131b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61   ){.    int enda
131c0 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  gg = sqliteVdbeM
131d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
131e0 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20   int startagg;. 
131f0 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71     startagg = sq
13200 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13210 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
13220 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61  endagg);.    pPa
13230 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b  rse->useAgg = 1;
13240 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
13250 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13260 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
13270 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
13280 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
13290 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
132a0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
132b0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
132c0 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
132d0 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
13300 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20  , endagg) ){.   
13310 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
13320 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
13330 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13340 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61   OP_Goto, 0, sta
13350 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  rtagg);.    sqli
13360 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
13370 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
13380 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13390 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
133a0 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
133b0 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20  ->useAgg = 0;.  
133c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
133d0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
133e0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
133f0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
13400 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
13410 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
13420 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
13430 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
13440 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
13450 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
13460 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74  ail(p, v, pEList
13470 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
13480 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iParm);.  }..  /
13490 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20  * If this was a 
134a0 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76  subquery, we hav
134b0 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20  e now converted 
134c0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
134d0 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  o a.  ** tempora
134e0 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65  ry table.  So de
134f0 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72  lete the subquer
13500 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  y structure from
13510 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
13520 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   to prevent this
13530 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
13540 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
13550 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
13560 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75  e the.  ** the u
13570 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  se of the tempor
13580 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ary table..  */.
13590 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
135a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
135b0 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  rent->pSrc->nSrc
135c0 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20  >parentTab );.  
135d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
135e0 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
135f0 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70  tTab].pSelect==p
13600 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   );.    sqliteSe
13610 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20  lectDelete(p);. 
13620 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
13630 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
13640 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a  Select = 0;.  }.
13650 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
13660 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
13670 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
13680 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
13690 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
136a0 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
136b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
136c0 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
136d0 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
136e0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
136f0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
13700 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
13710 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
13720 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
13730 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71  select_end:.  sq
13740 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
13750 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
13760 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.