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

Artifact a0211d1a6a94f6c3e611096e77f2d689a641495e:


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 31  select.c,v 1.151
0200: 20 32 30 30 34 2f 30 32 2f 30 39 20 31 34 3a 33   2004/02/09 14:3
0210: 37 3a 35 30 20 64 72 68 20 45 78 70 20 24 0a 2a  7:50 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: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
27f0: 4d 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42  MakeKey, pOrderB
2800: 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
2810: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
2820: 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f  P3(v, -1, zSortO
2830: 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f  rder, strlen(zSo
2840: 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c  rtOrder));.  sql
2850: 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64  iteFree(zSortOrd
2860: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  er);.  sqliteVdb
2870: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2880: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
2890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
28a0: 6e 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67  ne adds a P3 arg
28b0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73  ument to the las
28c0: 74 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68  t VDBE opcode th
28d0: 61 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74  at was.** insert
28e0: 65 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d  ed. The P3 argum
28f0: 65 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73  ent added is a s
2900: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
2910: 6f 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61  or the .** OP_Ma
2920: 6b 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65  keKey or OP_Make
2930: 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20  IdxKey opcodes. 
2940: 20 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73   The string cons
2950: 69 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61  ists of.** chara
2960: 63 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27  cters 't' or 'n'
2970: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
2980: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2990: 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c   various.** fiel
29a0: 64 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f  ds of the key to
29b0: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68   be generated sh
29c0: 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20  ould be treated 
29d0: 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72  as numeric.** or
29e0: 20 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74   as text.  See t
29f0: 68 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e  he OP_MakeKey an
2a00: 64 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  d OP_MakeIdxKey 
2a10: 6f 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65  opcode.** docume
2a20: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  ntation for addi
2a30: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2a40: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20  on about the P3 
2a50: 73 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61  string..** See a
2a60: 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64  lso the sqliteAd
2a70: 64 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f  dIdxKeyType() ro
2a80: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
2a90: 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28  qliteAddKeyType(
2aa0: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2ab0: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e  t *pEList){.  in
2ac0: 74 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69  t nColumn = pELi
2ad0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61  st->nExpr;.  cha
2ae0: 72 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  r *zType = sqlit
2af0: 65 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e  eMalloc( nColumn
2b00: 2b 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  +1 );.  int i;. 
2b10: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
2b20: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2b30: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
2b40: 2b 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d  +){.    zType[i]
2b50: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70   = sqliteExprTyp
2b60: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
2b70: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
2b80: 5f 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27  _NUM ? 'n' : 't'
2b90: 3b 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d  ;.  }.  zType[i]
2ba0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64   = 0;.  sqliteVd
2bb0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
2bc0: 2c 20 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e  , zType, nColumn
2bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2be0: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
2bf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2c00: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2c10: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2c20: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2c30: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
2c50: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
2c60: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
2c70: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
2c80: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
2c90: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
2ca0: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
2cb0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
2cc0: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
2cd0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
2ce0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
2cf0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
2d00: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
2d10: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
2d20: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2d30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2d40: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2d50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2d60: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2d70: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2d80: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2da0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
2db0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2dc0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2dd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2de0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
2df0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
2e00: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
2e10: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
2e20: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
2e30: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
2e40: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
2e50: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
2e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e70: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
2e80: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
2e90: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2ea0: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
2eb0: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
2ec0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
2ed0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
2ee0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
2ef0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
2f00: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
2f10: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
2f20: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
2f30: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2f40: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
2f50: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
2f60: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
2f70: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
2f80: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
2f90: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
2fa0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2fc0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
2fd0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
2fe0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3000: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
3010: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
3020: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
3030: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3040: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
3050: 69 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  i;..  if( v==0 )
3060: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
3070: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
3080: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
3090: 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   was a LIMIT cla
30a0: 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  use on the SELEC
30b0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
30c0: 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20  n do the check. 
30d0: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68   ** to see if th
30e0: 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65  is row should be
30f0: 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
3100: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
3110: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4f  ){.    if( p->iO
3120: 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20  ffset>=0 ){.    
3130: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
3140: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
3150: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
3160: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3170: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
3180: 4f 66 66 73 65 74 2c 20 61 64 64 72 2b 32 29 3b  Offset, addr+2);
3190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
31a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
31b0: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
31c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31d0: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
31e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
31f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
3200: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
3210: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
3220: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
3230: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
3240: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
3250: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
3260: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3270: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
3280: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3290: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
32a0: 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d  rcTab, i);.    }
32b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
32c0: 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  olumn = pEList->
32d0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
32e0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
32f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
3300: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
3310: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
3320: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3330: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3340: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3350: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
3360: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3370: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
3380: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
3390: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
33a0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
33b0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
33c0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
33d0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  lt..  */.  if( d
33e0: 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45  istinct>=0 && pE
33f0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
3400: 6e 45 78 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e  nExpr>0 ){.#if N
3410: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
3420: 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 56 64  NCT.    sqliteVd
3430: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
3440: 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e  Null, -pEList->n
3450: 45 78 70 72 2c 20 73 71 6c 69 74 65 56 64 62 65  Expr, sqliteVdbe
3460: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
3470: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
3480: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3490: 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c   OP_MakeKey, pEL
34a0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a  ist->nExpr, 1);.
34b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
34c0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
34d0: 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65  =4 ) sqliteAddKe
34e0: 79 54 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29  yType(v, pEList)
34f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
3500: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3510: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3520: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
3530: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
3540: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3550: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69  (v, OP_Pop, pELi
3560: 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b  st->nExpr+1, 0);
3570: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3580: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3590: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
35a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
35b0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
35c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
35d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
35e0: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69  OP_PutStrKey, di
35f0: 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a  stinct, 0);.  }.
3600: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
3610: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
3620: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
3630: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
3640: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
3650: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3660: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3670: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3680: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
3690: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
36a0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
36b0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
36c0: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
36d0: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
36e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
36f0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3720: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
3730: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3740: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
3750: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
3760: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
3770: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
3780: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
3790: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
37a0: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
37b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
37c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
37d0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
37e0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
37f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3800: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3810: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3820: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3830: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3840: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3850: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
3860: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3870: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3880: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
3890: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
38a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
38b0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
38c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
38d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
38e0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
38f0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
3900: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
3910: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
3920: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
3930: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
3940: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
3950: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
3960: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
3970: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3980: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
3990: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
39a0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  pt: {.      int 
39b0: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
39c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
39d0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
39e0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
39f0: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3a00: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3a10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3a20: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
3a30: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
3a40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3a50: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
3a60: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3a80: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
3a90: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
3aa0: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
3ab0: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
3ac0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
3ad0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
3ae0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
3af0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
3b00: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
3b10: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
3b20: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
3b30: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
3b40: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3b50: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
3b60: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 56 64  addr1 = sqliteVd
3b70: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3b80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
3b90: 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  2;.      assert(
3ba0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
3bb0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3bc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
3bd0: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29  ll, -1, addr1+3)
3be0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3bf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3c00: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
3c10: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 56 64  addr2 = sqliteVd
3c20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3c30: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  to, 0, 0);.     
3c40: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3c50: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3c60: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3c70: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3ca0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
3cb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
3cc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3cd0: 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
3ce0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
3cf0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
3d00: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
3d10: 61 64 64 72 32 2c 20 73 71 6c 69 74 65 56 64 62  addr2, sqliteVdb
3d20: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
3d30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3d40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3d50: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
3d60: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
3d70: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
3d80: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
3d90: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
3da0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
3db0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
3dc0: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
3dd0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
3de0: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
3df0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
3e00: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
3e10: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3e30: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3e40: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3e50: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3e60: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3e70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3e80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3e90: 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
3ea0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
3eb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3ec0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3ed0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ef0: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3f00: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3f10: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3f20: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f30: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3f40: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3f50: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3f60: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3f70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f80: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b  Op(v, OP_SortMak
3f90: 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  eRec, nColumn, 0
3fa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3fb0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3fc0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3fd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3fe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
3ff0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
4000: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4010: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4020: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4030: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4040: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
4060: 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  ke a subroutine 
4070: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  to handle the re
4080: 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72  sults.  The subr
4090: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20  outine itself.  
40a0: 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69    ** is responsi
40b0: 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20  ble for popping 
40c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20  the results off 
40d0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
40e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
40f0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4100: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4110: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4120: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4130: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4140: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4150: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4160: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
4170: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
4180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
41a0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
41b0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
41c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
41d0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  }..    /* Discar
41e0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
41f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4200: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4210: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
4220: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
4230: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
4240: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
4250: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
4260: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
4270: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
4280: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
4290: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
42a0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
42b0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
42c0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
42d0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
42e0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
42f0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
4300: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
4310: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4320: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4330: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4360: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4370: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4380: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4390: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
43a0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
43b0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
43c0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
43d0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
43e0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
43f0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
4400: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
4410: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
4420: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
4430: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
4440: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4450: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4460: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4480: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4490: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
44a0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
44b0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
44c0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
44d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
44e0: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
44f0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4510: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
4520: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
4530: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
4540: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
4550: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
4560: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
4570: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
4580: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
4590: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
45a0: 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c  .  int end = sql
45b0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
45c0: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
45d0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
45e0: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
45f0: 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  n;.  sqliteVdbeA
4600: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
4610: 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d   0, 0);.  addr =
4620: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4630: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
4640: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69 66 28 20   0, end);.  if( 
4650: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b  p->iOffset>=0 ){
4660: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4670: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4680: 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  cr, p->iOffset, 
4690: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c  addr+4);.    sql
46a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
46b0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
46c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
46d0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
46e0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69  , addr);.  }.  i
46f0: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
4700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
4710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4720: 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Incr, p->iLimit,
4730: 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 77 69   end);.  }.  swi
4740: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
4750: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4760: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ack: {.      sql
4770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4780: 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c  OP_SortCallback,
4790: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
47a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
47b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
47c0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
47d0: 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20  T_TempTable: {. 
47e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
47f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
4800: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
4810: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4820: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4830: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4840: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4850: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
4860: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4880: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
4890: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
48a0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
48b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
48c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
48d0: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64 62  l, -1, sqliteVdb
48e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
48f0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
4900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4910: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
4920: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4930: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4940: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
4950: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4960: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4970: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4980: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
4990: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
49a0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
49b0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
49c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
49d0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
49e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
49f0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4a00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4a10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
4a20: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
4a30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4a40: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4a50: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 20 20   0, end);.      
4a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a70: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4a80: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
4a90: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
4aa0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
4ab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
4ac0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4ad0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
4ae0: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
4af0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4b00: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
4b10: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
4b20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4b30: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4b40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b50: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
4b60: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
4b70: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
4b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4b90: 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41   }.  sqliteVdbeA
4ba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4bb0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
4bc0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
4bd0: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73  bel(v, end);.  s
4be0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4bf0: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
4c00: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
4c10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4c20: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
4c30: 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74 79   VDBE the dataty
4c40: 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  pes of.** column
4c50: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4c60: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  set..**.** This 
4c70: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e  routine only gen
4c80: 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20 74  erates code if t
4c90: 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77 5f  he "PRAGMA show_
4ca0: 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a  datatypes=on".**
4cb0: 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75 74   has been execut
4cc0: 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79 70  ed.  The datatyp
4cd0: 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  es are reported 
4ce0: 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  out in the azCol
4cf0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f  .** parameter to
4d00: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4d10: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 72  nction.  The fir
4d20: 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74  st N azCol[] ent
4d30: 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  ries.** are the 
4d40: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
4d50: 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 65  umns, and the se
4d60: 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20 61  cond N entries a
4d70: 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  re the.** dataty
4d80: 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  pes for the colu
4d90: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  mns..**.** The "
4da0: 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61 20  datatype" for a 
4db0: 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20 61  result that is a
4dc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70   column of a typ
4dd0: 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  e is the.** data
4de0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
4df0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4e00: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
4e10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
4e20: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61  e datatype for a
4e30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4e40: 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20 4e  either TEXT or N
4e50: 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20  UMERIC.  The.** 
4e60: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20 52  datatype for a R
4e70: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
4e80: 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  TEGER..*/.static
4e90: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
4ea0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
4eb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4ec0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4ed0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
4ee0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
4ef0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
4f00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4f10: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
4f20: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
4f30: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
4f40: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
4f50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4f60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
4f70: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
4f80: 62 61 63 6b 20 26 26 20 28 70 50 61 72 73 65 2d  back && (pParse-
4f90: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
4fa0: 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 29  ITE_ReportTypes)
4fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
4fc0: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
4fd0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
4fe0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
4ff0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
5000: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
5010: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
5020: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
5030: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
5040: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
5050: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
5060: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
5070: 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ab;.      int iC
5080: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
5090: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
50a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
50b0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
50c0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
50d0: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
50e0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
50f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
5100: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
5110: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
5120: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5130: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
5140: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
5150: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
5160: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
5170: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
5180: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
5190: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
51a0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
51b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
51c0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
51d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
51e0: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zType;.      }. 
51f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5200: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 54 79  if( sqliteExprTy
5210: 70 65 28 70 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  pe(p)==SQLITE_SO
5220: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
5230: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
5240: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5250: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 4e        zType = "N
5260: 55 4d 45 52 49 43 22 3b 0a 20 20 20 20 20 20 7d  UMERIC";.      }
5270: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5280: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5290: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b  _ColumnName, i +
52a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
52b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
52c0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
52d0: 2c 20 7a 54 79 70 65 2c 20 50 33 5f 53 54 41 54  , zType, P3_STAT
52e0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
52f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5300: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
5310: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
5320: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
5330: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
5340: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
5350: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
5360: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
5370: 7a 43 6f 6c 5b 5d 20 76 61 6f 6c 75 65 73 20 69  zCol[] vaolues i
5380: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
5390: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
53a0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
53b0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
53c0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
53d0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
53e0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
53f0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
5400: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
5410: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
5420: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
5430: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
5440: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
5450: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5460: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
5470: 20 6a 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   j;.  if( pParse
5480: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
5490: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 5f   v==0 || sqlite_
54a0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
54b0: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
54c0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
54d0: 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
54e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
54f0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
5500: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
5510: 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  e = 0;.    int s
5520: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20  howFullNames;.  
5530: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
5540: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
5550: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
5560: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
5570: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
5580: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
5590: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
55a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
55b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
55c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
55d0: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
55e0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
55f0: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
5600: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
5610: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
5620: 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 46 75 6c     }.    showFul
5630: 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72 73 65  lNames = (pParse
5640: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
5650: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
5660: 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 70  s)!=0;.    if( p
5670: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
5680: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
5690: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
56a0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
56b0: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
56c0: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
56d0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
56e0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
56f0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
5700: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
5710: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
5720: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
5730: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
5740: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
5750: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
5760: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5770: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
5780: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
5790: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
57a0: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
57b0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
57c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
57d0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
57e0: 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b  Col = "_ROWID_";
57f0: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
5800: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
5810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5820: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
5830: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
5840: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
5850: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5860: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a  .zType;.      }.
5870: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 70 61        if( p->spa
5880: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
5890: 5b 30 5d 20 26 26 20 21 73 68 6f 77 46 75 6c 6c  [0] && !showFull
58a0: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
58b0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
58c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50  teVdbeAddOp(v,OP
58d0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
58e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
58f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5900: 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  , -1, p->span.z,
5910: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
5920: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5930: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
5940: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  addr);.      }el
5950: 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  se if( pTabList-
5960: 3e 6e 53 72 63 3e 31 20 7c 7c 20 73 68 6f 77 46  >nSrc>1 || showF
5970: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
5980: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
5990: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
59a0: 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20  r *zTab;. .     
59b0: 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69     zTab = pTabLi
59c0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b  st->a[j].zAlias;
59d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f  .        if( sho
59e0: 77 46 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54  wFullNames || zT
59f0: 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70  ab==0 ) zTab = p
5a00: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
5a10: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
5a20: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62  ing(&zName, zTab
5a30: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
5a40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
5a50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5a60: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29  olumnName, i, 0)
5a70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5a80: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
5a90: 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  -1, zName, strle
5aa0: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
5ab0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
5ac0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
5ad0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5ae0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5af0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
5b00: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
5b10: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5b20: 2c 20 2d 31 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a  , -1, zCol, 0);.
5b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5b40: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
5b50: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
5b60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
5b70: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
5b80: 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e  dOp(v,OP_ColumnN
5b90: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
5ba0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
5bb0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73  geP3(v, -1, p->s
5bc0: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
5bd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5be0: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
5bf0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
5c00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
5c10: 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20   zName[30];.    
5c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
5c30: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54  =TK_COLUMN || pT
5c40: 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  abList==0 );.   
5c50: 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65     sprintf(zName
5c60: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
5c70: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5c80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5c90: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30  ColumnName, i, 0
5ca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5cb0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
5cc0: 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  1, zName, strlen
5cd0: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  (zName));.    }.
5ce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d    }.}../*.** Nam
5cf0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
5d00: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
5d10: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
5d20: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
5d30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
5d40: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
5d50: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
5d60: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
5d70: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
5d80: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
5d90: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
5da0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
5db0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
5dc0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
5dd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
5de0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
5df0: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
5e00: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
5e10: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
5e20: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
5e30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
5e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
5e50: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
5e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
5e70: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61  lInColumnList(Pa
5e80: 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  rse*, Select*);.
5e90: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
5ea0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
5eb0: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
5ec0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
5ed0: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
5ee0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
5ef0: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
5f00: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 52 65 73  Table *sqliteRes
5f10: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
5f20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
5f30: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65  ar *zTabName, Se
5f40: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
5f50: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
5f60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
5f70: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
5f80: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b 0a 0a   Column *aCol;..
5f90: 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75    if( fillInColu
5fa0: 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  mnList(pParse, p
5fb0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
5fc0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
5fd0: 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Tab = sqliteMall
5fe0: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
5ff0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
6000: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6010: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
6020: 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65  zName = zTabName
6030: 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   ? sqliteStrDup(
6040: 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20  zTabName) : 0;. 
6050: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
6060: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61  t->pEList;.  pTa
6070: 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74  b->nCol = pEList
6080: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
6090: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
60a0: 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20  );.  pTab->aCol 
60b0: 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d  = aCol = sqliteM
60c0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54  alloc( sizeof(pT
60d0: 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61  ab->aCol[0])*pTa
60e0: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72  b->nCol );.  for
60f0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
6100: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  ol; i++){.    Ex
6110: 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20  pr *p, *pR;.    
6120: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6130: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
6140: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  aCol[i].zName = 
6150: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c  sqliteStrDup(pEL
6160: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
6170: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6180: 28 70 3d 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (p=pEList->a[i].
6190: 70 45 78 70 72 29 2d 3e 6f 70 3d 3d 54 4b 5f 44  pExpr)->op==TK_D
61a0: 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OT .            
61b0: 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69     && (pR=p->pRi
61c0: 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74  ght)!=0 && pR->t
61d0: 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f  oken.z && pR->to
61e0: 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  ken.z[0] ){.    
61f0: 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 20    int cnt;.     
6200: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
6210: 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  g(&aCol[i].zName
6220: 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  , pR->token.z, p
6230: 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  R->token.n, 0);.
6240: 20 20 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d        for(j=cnt=
6250: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
6260: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6270: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
6280: 7a 4e 61 6d 65 2c 20 61 43 6f 6c 5b 69 5d 2e 7a  zName, aCol[i].z
6290: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
62a0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
62b0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
62c0: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [30];.          
62d0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
62e0: 64 22 2c 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  d",++cnt);.     
62f0: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
6300: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
6310: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
6320: 67 28 26 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  g(&aCol[i].zName
6330: 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  , pR->token.z, p
6340: 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 7a 42 75 66  R->token.n, zBuf
6350: 2c 20 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  , n,0);.        
6360: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
6370: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6380: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
6390: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
63a0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
63b0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
63c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
63d0: 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  me, p->span.z, p
63e0: 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20  ->span.n, 0);.  
63f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
6400: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
6410: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
6420: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
6430: 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  1);.      pTab->
6440: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  aCol[i].zName = 
6450: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42 75  sqliteStrDup(zBu
6460: 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  f);.    }.  }.  
6470: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
6480: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ;.  return pTab;
6490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  .}../*.** For th
64a0: 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
64b0: 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 68 72  tatement, do thr
64c0: 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a  ee things..**.**
64d0: 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20 69 6e      (1)  Fill in
64e0: 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
64f0: 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
6500: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
6510: 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
6520: 65 66 69 6e 65 73 20 74 68 65 20 73 65 74 20 6f  efines the set o
6530: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 68  f tables that sh
6540: 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65 64 2e  ould be scanned.
6550: 20 20 46 6f 72 20 76 69 65 77 73 2c 0a 2a 2a 20    For views,.** 
6560: 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
6570: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
6580: 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
6590: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
65a0: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
65b0: 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
65c0: 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
65d0: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
65e0: 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
65f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
6600: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
6610: 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
6620: 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
6630: 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
6640: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
6650: 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
6660: 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
6670: 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
6680: 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
6690: 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
66a0: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 64 64  *.**    (2)  Add
66b0: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
66c0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
66d0: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
66e0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
66f0: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
6700: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
6710: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
6720: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
6730: 28 33 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (3)  Scan the li
6740: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
6750: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
6760: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
6770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
6780: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
6790: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
67a0: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
67b0: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
67c0: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
67d0: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
67e0: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
67f0: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
6800: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
6810: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
6820: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
6830: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6840: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
6850: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
6860: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
6870: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
6880: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
6890: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
68a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
68b0: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72  InColumnList(Par
68c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
68d0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ct *p){.  int i,
68e0: 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63   j, k, rc;.  Src
68f0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
6900: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6910: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
6920: 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  b;..  if( p==0 |
6930: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29 20 72  | p->pSrc==0 ) r
6940: 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c  eturn 1;.  pTabL
6950: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
6960: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
6970: 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  ist;..  /* Look 
6980: 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 69  up every table i
6990: 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74  n the table list
69a0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
69b0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
69c0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rc; i++){.    if
69d0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
69e0: 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  .pTab ){.      /
69f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
6a00: 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20 20  as run before!  
6a10: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69  No need to conti
6a20: 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nue */.      ret
6a30: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
6a40: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
6a50: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
6a60: 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
6a70: 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
6a80: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
6a90: 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
6aa0: 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 61  ert( pTabList->a
6ab0: 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 29  [i].pSelect!=0 )
6ac0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
6ad0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
6ae0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
6af0: 63 68 61 72 20 7a 46 61 6b 65 4e 61 6d 65 5b 36  char zFakeName[6
6b00: 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  0];.        spri
6b10: 6e 74 66 28 7a 46 61 6b 65 4e 61 6d 65 2c 20 22  ntf(zFakeName, "
6b20: 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
6b30: 25 70 5f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %p_",.          
6b40: 20 28 76 6f 69 64 2a 29 70 54 61 62 4c 69 73 74   (void*)pTabList
6b50: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
6b60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
6b70: 65 74 53 74 72 69 6e 67 28 26 70 54 61 62 4c 69  etString(&pTabLi
6b80: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
6b90: 20 7a 46 61 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a   zFakeName, 0);.
6ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
6bb0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
6bc0: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
6bd0: 20 20 20 20 73 71 6c 69 74 65 52 65 73 75 6c 74      sqliteResult
6be0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
6bf0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  se, pTabList->a[
6c00: 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  i].zAlias,.     
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6c40: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
6c50: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
6c60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6c70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
6c80: 20 2f 2a 20 54 68 65 20 69 73 54 72 61 6e 73 69   /* The isTransi
6c90: 65 6e 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ent flag indicat
6ca0: 65 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c  es that the Tabl
6cb0: 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  e structure has 
6cc0: 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79  been.      ** dy
6cd0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
6ce0: 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66  ted and may be f
6cf0: 72 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65  reed at any time
6d00: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
6d10: 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62  s,.      ** pTab
6d20: 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
6d30: 20 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74   to a persistent
6d40: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
6d50: 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20   that defines.  
6d60: 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74      ** part of t
6d70: 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  he schema. */.  
6d80: 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61 6e      pTab->isTran
6d90: 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  sient = 1;.    }
6da0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
6db0: 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
6dc0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
6dd0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6de0: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 4c 69   */.      pTabLi
6df0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
6e00: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
6e10: 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61 62 6c  sqliteLocateTabl
6e20: 65 28 70 50 61 72 73 65 2c 70 54 61 62 4c 69 73  e(pParse,pTabLis
6e30: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70 54  t->a[i].zName,pT
6e40: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61  abList->a[i].zDa
6e50: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
6e60: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
6e70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6e90: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
6ea0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
6eb0: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
6ec0: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
6ed0: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
6ee0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
6ef0: 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f   sqliteViewGetCo
6f00: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
6f10: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
6f20: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6f40: 20 2f 2a 20 49 66 20 70 54 61 62 4c 69 73 74 2d   /* If pTabList-
6f50: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30  >a[i].pSelect!=0
6f60: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
6f70: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
6f80: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
6f90: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
6fa0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
6fb0: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
6fc0: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
6fd0: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
6fe0: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
6ff0: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
7000: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
7010: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7020: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
7030: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7040: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
7050: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
7060: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
7070: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
7080: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70   sqliteSelectDup
7090: 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b  (pTab->pSelect);
70a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
70b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
70c0: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
70d0: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
70e0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
70f0: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
7100: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
7110: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
7120: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
7130: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
7140: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
7150: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
7160: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
7170: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
7180: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
7190: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
71a0: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
71b0: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
71c0: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
71d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
71e0: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
71f0: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
7200: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
7210: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
7220: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
7230: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
7240: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
7250: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
7260: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
7270: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
7280: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
7290: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
72a0: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
72b0: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
72c0: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
72d0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
72e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
72f0: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
7300: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
7310: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
7320: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
7330: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
7340: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
7350: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
7360: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
7370: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
7380: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
7390: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
73a0: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
73b0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
73c0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
73d0: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
73e0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
73f0: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
7400: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
7410: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
7420: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
7430: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
7440: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
7450: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
7460: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
7470: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
7480: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
7490: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
74a0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
74b0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
74c0: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
74d0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
74e0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
74f0: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
7500: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
7510: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
7520: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
7530: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
7540: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
7550: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
7560: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
7570: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
7580: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
7590: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
75a0: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
75b0: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
75c0: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
75d0: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
75e0: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
75f0: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
7600: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
7610: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
7620: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
7630: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
7640: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
7650: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
7660: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
7670: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b  tAppend(pNew, a[
7680: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
7690: 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
76a0: 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
76b0: 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
76c0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
76d0: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
76e0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
76f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7700: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
7710: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
7720: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
7730: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
7740: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
7750: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
7760: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
7770: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
7780: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
7790: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
77a0: 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b     Token *pName;
77b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
77c0: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
77d0: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
77e0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
77f0: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
7800: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  {.          pNam
7810: 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e  e = &pE->pLeft->
7820: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  token;.        }
7830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7840: 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  pName = 0;.     
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
7860: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
7870: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
7880: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
7890: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
78a0: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
78b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
78c0: 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ame = pTabList->
78d0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[i].zAlias;.   
78e0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
78f0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
7900: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
7910: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
7920: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
7930: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7940: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
7950: 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30   && (zTabName==0
7960: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
7970: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
7980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 74          sqliteSt
7990: 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c  rNICmp(pName->z,
79a0: 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65   zTabName, pName
79b0: 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20  ->n)!=0 ||.     
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
79d0: 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d  Name[pName->n]!=
79e0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
79f0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7a10: 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
7a20: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
7a30: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
7a40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7a50: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c      Expr *pExpr,
7a60: 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74   *pLeft, *pRight
7a70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
7a80: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
7a90: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
7aa0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
7ab0: 28 20 69 3e 30 20 26 26 20 28 70 54 61 62 4c 69  ( i>0 && (pTabLi
7ac0: 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74  st->a[i-1].joint
7ad0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
7ae0: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
7af0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e          columnIn
7b00: 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  dex(pTabList->a[
7b10: 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65  i-1].pTab, zName
7b20: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
7b30: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
7b40: 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
7b50: 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
7b60: 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
7b70: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
7b80: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
7b90: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
7ba0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7bb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7bc0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
7bd0: 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65  sqliteIdListInde
7be0: 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d  x(pTabList->a[i-
7bf0: 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  1].pUsing, zName
7c00: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
7c10: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
7c20: 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
7c30: 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
7c40: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
7c50: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
7c60: 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
7c70: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
7c80: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
7c90: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
7cc0: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ht = sqliteExpr(
7cd0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
7ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7cf0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
7d00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7d10: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  pRight->token.z 
7d20: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
7d30: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7d40: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  en.n = strlen(zN
7d50: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
7d60: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7d70: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7d80: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
7d90: 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  e && pTabList->n
7da0: 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
7db0: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
7dc0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c  qliteExpr(TK_ID,
7dd0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
7de0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
7df0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44   sqliteExpr(TK_D
7e00: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
7e10: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
7e20: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
7e30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
7e40: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
7e50: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61  token.z = zTabNa
7e60: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
7e70: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e    pLeft->token.n
7e80: 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61   = strlen(zTabNa
7e90: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
7ea0: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
7eb0: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
7ed0: 53 74 72 69 6e 67 28 28 63 68 61 72 2a 2a 29 26  String((char**)&
7ee0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a  pExpr->span.z, z
7ef0: 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e  TabName, ".", zN
7f00: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
7f10: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
7f20: 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 45  an.n = strlen(pE
7f30: 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  xpr->span.z);.  
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7f50: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
7f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7f70: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
7f80: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
7f90: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
7fa0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7fb0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
7fc0: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7fe0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
7ff0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
8000: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
8010: 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
8020: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
8030: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
8040: 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  ew = sqliteExprL
8050: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
8060: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
8070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
8090: 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
80a0: 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29       if( pName )
80b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
80c0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
80d0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
80e0: 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61 6d 65 29  ble: %T", pName)
80f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8100: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
8110: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
8120: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
8130: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
8140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8150: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
8160: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8170: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 78    }.    sqliteEx
8180: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
8190: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
81a0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
81b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
81c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
81d0: 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 20 75  ne recursively u
81e0: 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c 65 63  nlinks the Selec
81f0: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20  t.pSrc.a[].pTab 
8200: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61  pointers.** in a
8210: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
8220: 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65 74 73  e.  It just sets
8230: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
8240: 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20   NULL.  This.** 
8250: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63 75 72  routine is recur
8260: 73 69 76 65 20 69 6e 20 74 68 65 20 73 65 6e 73  sive in the sens
8270: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 53 65  e that if the Se
8280: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53  lect.pSrc.a[].pS
8290: 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  elect.** pointer
82a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
82b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
82c0: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
82d0: 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74 65 72   on that pointer
82e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
82f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
8300: 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  n the Select str
8310: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
8320: 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e  nes a.** VIEW in
8330: 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f 20 61   order to undo a
8340: 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f 20 74  ny bindings to t
8350: 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69 73 20  ables.  This is 
8360: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63  necessary.** bec
8370: 61 75 73 65 20 74 68 6f 73 65 20 74 61 62 6c 65  ause those table
8380: 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f 50 65  s might be DROPe
8390: 64 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e  d by a subsequen
83a0: 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  t SQL command..*
83b0: 2a 20 49 66 20 74 68 65 20 62 69 6e 64 69 6e 67  * If the binding
83c0: 73 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f 76 65  s are not remove
83d0: 64 2c 20 74 68 65 6e 20 74 68 65 20 53 65 6c 65  d, then the Sele
83e0: 63 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e 70 54 61  ct.pSrc->a[].pTa
83f0: 62 20 66 69 65 6c 64 0a 2a 2a 20 77 69 6c 6c 20  b field.** will 
8400: 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
8410: 20 74 6f 20 61 20 64 65 61 6c 6c 6f 63 61 74 65   to a deallocate
8420: 64 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  d Table structur
8430: 65 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 44  e after the.** D
8440: 52 4f 50 20 61 6e 64 20 61 20 63 6f 72 65 64 75  ROP and a coredu
8450: 6d 70 20 77 69 6c 6c 20 6f 63 63 75 72 20 74 68  mp will occur th
8460: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
8470: 56 49 45 57 20 69 73 20 75 73 65 64 2e 0a 2a 2f  VIEW is used..*/
8480: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65  .void sqliteSele
8490: 63 74 55 6e 62 69 6e 64 28 53 65 6c 65 63 74 20  ctUnbind(Select 
84a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
84b0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
84c0: 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61 62 6c 65  p->pSrc;.  Table
84d0: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
84e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
84f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
8500: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
8510: 69 66 28 20 28 70 54 61 62 20 3d 20 70 53 72 63  if( (pTab = pSrc
8520: 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20  ->a[i].pTab)!=0 
8530: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
8540: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
8550: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8560: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
8570: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
8580: 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70      pSrc->a[i].p
8590: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Tab = 0;.      i
85a0: 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  f( pSrc->a[i].pS
85b0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
85c0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62   sqliteSelectUnb
85d0: 69 6e 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  ind(pSrc->a[i].p
85e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
85f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8600: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8610: 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72   associates entr
8620: 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ies in an ORDER 
8630: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  BY expression li
8640: 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d  st with.** colum
8650: 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20  ns in a result. 
8660: 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20   For each ORDER 
8670: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  BY expression, t
8680: 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20  he opcode of.** 
8690: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
86a0: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
86b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
86c0: 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  he iColumn value
86d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
86e0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
86f0: 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75  led in with colu
8700: 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  mn number and th
8710: 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  e iTable.** valu
8720: 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  e of the top-lev
8730: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
8740: 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61  d with iTable pa
8750: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  rameter..**.** I
8760: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f  f there are prio
8770: 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73  r SELECT clauses
8780: 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65  , they are proce
8790: 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d  ssed first.  A m
87a0: 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61  atch.** in an ea
87b0: 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b  rlier SELECT tak
87c0: 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76  es precedence ov
87d0: 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43  er a later SELEC
87e0: 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74  T..**.** Any ent
87f0: 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ry that does not
8800: 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65   match is flagge
8810: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  d as an error.  
8820: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
8830: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
8840: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
8850: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
8860: 20 63 6f 72 72 65 63 74 6c 79 20 69 6e 69 74 69   correctly initi
8870: 61 6c 69 7a 65 20 74 68 65 20 45 78 70 72 2e 64  alize the Expr.d
8880: 61 74 61 54 79 70 65 20 20 66 69 65 6c 64 0a 2a  ataType  field.*
8890: 2a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  * of the ORDER B
88a0: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  Y expressions.  
88b0: 54 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 53  The multiSelectS
88c0: 6f 72 74 4f 72 64 65 72 28 29 20 72 6f 75 74 69  ortOrder() routi
88d0: 6e 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63 61  ne.** must be ca
88e0: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 61 74 20  lled to do that 
88f0: 61 66 74 65 72 20 74 68 65 20 69 6e 64 69 76 69  after the indivi
8900: 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74  dual select stat
8910: 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 61  ements.** have a
8920: 6c 6c 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64  ll been analyzed
8930: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8940: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  is unable to com
8950: 70 75 74 65 20 45 78 70 72 2e 64 61 74 61 54 79  pute Expr.dataTy
8960: 70 65 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74  pe.** because it
8970: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
8980: 62 65 66 6f 72 65 20 74 68 65 20 69 6e 64 69 76  before the indiv
8990: 69 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61  idual select sta
89a0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20  tements.** have 
89b0: 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a  been analyzed..*
89c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
89d0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
89e0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
89f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8a00: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
8a10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
8a20: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
8a30: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
8a40: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
8a50: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
8a60: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
8a70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8a80: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
8a90: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
8aa0: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
8ab0: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
8ac0: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
8ad0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
8ae0: 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20  value in iTable 
8af0: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d  */.  int mustCom
8b00: 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20  plete        /* 
8b10: 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45  If TRUE all ORDE
8b20: 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68  R BYs must match
8b30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
8b40: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  r = 0;.  int i, 
8b50: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
8b60: 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  EList;..  if( pS
8b70: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
8b80: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
8b90: 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f   1;.  if( mustCo
8ba0: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f  mplete ){.    fo
8bb0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8bc0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20  y->nExpr; i++){ 
8bd0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8be0: 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20  one = 0; }.  }. 
8bf0: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
8c00: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
8c10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
8c20: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
8c30: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
8c40: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
8c50: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8c60: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
8c70: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
8c80: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
8c90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8ca0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
8cb0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
8cc0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
8cd0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8ce0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8cf0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
8d00: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8d10: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
8d20: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
8d30: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8d40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8d50: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
8d60: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
8d70: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
8d80: 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
8d90: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
8da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8db0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8dc0: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
8dd0: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
8de0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
8df0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
8e00: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
8e10: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
8e20: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
8e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8e50: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
8e60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
8e70: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
8e80: 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30   for(j=0; iCol<0
8e90: 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45   && j<pEList->nE
8ea0: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
8eb0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
8ec0: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
8ed0: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
8ee0: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
8ef0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8f00: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
8f10: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8f20: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
8f30: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
8f40: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
8f50: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
8f60: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
8f70: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
8f80: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
8f90: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
8fa0: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
8fb0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
8fc0: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
8fd0: 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20  abel)==0 ){ .   
8fe0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
8ff0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9000: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c     sqliteFree(zL
9010: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  abel);.      }. 
9020: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
9030: 26 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d  && sqliteExprCom
9040: 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d  pare(pE, pEList-
9050: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[j].pExpr) ){.
9060: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
9070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9080: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
9090: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
90a0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
90b0: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
90c0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
90d0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
90e0: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
90f0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
9100: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
9110: 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d  Col<0 && mustCom
9120: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73  plete ){.      s
9130: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
9140: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
9150: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
9160: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
9170: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
9180: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
9190: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
91a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
91b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
91c0: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rr;  .}../*.** G
91d0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
91e0: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
91f0: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
9200: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9210: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
9220: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9230: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
9240: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
9250: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
9260: 65 20 2a 73 71 6c 69 74 65 47 65 74 56 64 62 65  e *sqliteGetVdbe
9270: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
9280: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
9290: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
92a0: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
92b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
92c0: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72 65 61  = sqliteVdbeCrea
92d0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
92e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
92f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9300: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 45  utine sets the E
9310: 78 70 72 2e 64 61 74 61 54 79 70 65 20 66 69 65  xpr.dataType fie
9320: 6c 64 20 6f 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e  ld on all elemen
9330: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 4f 72  ts of.** the pOr
9340: 64 65 72 42 79 20 65 78 70 72 65 73 73 69 6f 6e  derBy expression
9350: 20 6c 69 73 74 2e 20 20 54 68 65 20 70 4f 72 64   list.  The pOrd
9360: 65 72 42 79 20 6c 69 73 74 20 77 69 6c 6c 20 68  erBy list will h
9370: 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 65 74 20  ave been.** set 
9380: 75 70 20 62 79 20 6d 61 74 63 68 4f 72 64 65 72  up by matchOrder
9390: 62 79 54 6f 43 6f 6c 75 6d 6e 28 29 2e 20 20 48  byToColumn().  H
93a0: 65 6e 63 65 20 65 61 63 68 20 65 78 70 72 65 73  ence each expres
93b0: 73 69 6f 6e 20 68 61 73 0a 2a 2a 20 61 20 54 4b  sion has.** a TK
93c0: 5f 43 4f 4c 55 4d 4e 20 61 73 20 69 74 73 20 72  _COLUMN as its r
93d0: 6f 6f 74 20 6e 6f 64 65 2e 20 20 54 68 65 20 45  oot node.  The E
93e0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 72 65 66 65  xpr.iColumn refe
93f0: 72 73 20 74 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75  rs to a .** colu
9400: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
9410: 20 73 65 74 2e 20 20 20 54 68 65 20 64 61 74 61   set.   The data
9420: 74 79 70 65 20 69 73 20 73 65 74 20 74 6f 20 53  type is set to S
9430: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a  QLITE_SO_TEXT.**
9440: 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   if the correspo
9450: 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  nding column in 
9460: 70 20 61 6e 64 20 65 76 65 72 79 20 53 45 4c 45  p and every SELE
9470: 43 54 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  CT to the left o
9480: 66 0a 2a 2a 20 70 20 68 61 73 20 61 20 64 61 74  f.** p has a dat
9490: 61 74 79 70 65 20 6f 66 20 53 51 4c 49 54 45 5f  atype of SQLITE_
94a0: 53 4f 5f 54 45 58 54 2e 20 20 49 66 20 74 68 65  SO_TEXT.  If the
94b0: 20 63 6f 6f 72 65 73 73 70 6f 6e 64 69 6e 67 20   cooressponding 
94c0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f  column.** in p o
94d0: 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6c 65 66  r any of the lef
94e0: 74 20 53 45 4c 45 43 54 73 20 69 73 20 53 51 4c  t SELECTs is SQL
94f0: 49 54 45 5f 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e  ITE_SO_NUM, then
9500: 20 74 68 65 20 64 61 74 61 74 79 70 65 0a 2a 2a   the datatype.**
9510: 20 6f 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   of the order-by
9520: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73   expression is s
9530: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f  et to SQLITE_SO_
9540: 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  NUM..**.** Examp
9550: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  les:.**.**     C
9560: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
9570: 61 20 49 4e 54 45 47 45 52 2c 20 62 20 54 45 58  a INTEGER, b TEX
9580: 54 29 3b 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  T);.**     CREAT
9590: 45 20 54 41 42 4c 45 20 74 77 6f 28 63 20 56 41  E TABLE two(c VA
95a0: 52 43 48 41 52 28 35 29 2c 20 64 20 46 4c 4f 41  RCHAR(5), d FLOA
95b0: 54 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  T);.**.**     SE
95c0: 4c 45 43 54 20 62 2c 20 62 20 46 52 4f 4d 20 6f  LECT b, b FROM o
95d0: 6e 65 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  ne UNION SELECT 
95e0: 64 2c 20 63 20 46 52 4f 4d 20 74 77 6f 20 4f 52  d, c FROM two OR
95f0: 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 2a 2a 0a  DER BY 1, 2;.**.
9600: 2a 2a 20 54 68 65 20 70 72 69 6d 61 72 79 20 73  ** The primary s
9610: 6f 72 74 20 6b 65 79 20 77 69 6c 6c 20 75 73 65  ort key will use
9620: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 62   SQLITE_SO_NUM b
9630: 65 63 61 75 73 65 20 74 68 65 20 22 64 22 20 69  ecause the "d" i
9640: 6e 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  n.** the second 
9650: 53 45 4c 45 43 54 20 69 73 20 6e 75 6d 65 72 69  SELECT is numeri
9660: 63 2e 20 20 54 68 65 20 31 73 74 20 63 6f 6c 75  c.  The 1st colu
9670: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
9680: 53 45 4c 45 43 54 0a 2a 2a 20 69 73 20 74 65 78  SELECT.** is tex
9690: 74 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  t but that does 
96a0: 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
96b0: 73 65 20 61 20 6e 75 6d 65 72 69 63 20 61 6c 77  se a numeric alw
96c0: 61 79 73 20 6f 76 65 72 72 69 64 65 73 0a 2a 2a  ays overrides.**
96d0: 20 61 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54   a text..**.** T
96e0: 68 65 20 73 65 63 6f 6e 64 61 72 79 20 6b 65 79  he secondary key
96f0: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 53 51   will use the SQ
9700: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 73 6f 72  LITE_SO_TEXT sor
9710: 74 20 6f 72 64 65 72 20 62 65 63 61 75 73 65 0a  t order because.
9720: 2a 2a 20 62 6f 74 68 20 74 68 65 20 28 73 65 63  ** both the (sec
9730: 6f 6e 64 29 20 22 62 22 20 69 6e 20 74 68 65 20  ond) "b" in the 
9740: 66 69 72 73 74 20 53 45 4c 45 43 54 20 61 6e 64  first SELECT and
9750: 20 74 68 65 20 22 63 22 20 69 6e 20 74 68 65 20   the "c" in the 
9760: 73 65 63 6f 6e 64 0a 2a 2a 20 53 45 4c 45 43 54  second.** SELECT
9770: 20 68 61 76 65 20 61 20 64 61 74 61 74 79 70 65   have a datatype
9780: 20 6f 66 20 74 65 78 74 2e 0a 2a 2f 20 0a 73 74   of text..*/ .st
9790: 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 53  atic void multiS
97a0: 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 53  electSortOrder(S
97b0: 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69  elect *p, ExprLi
97c0: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
97d0: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
97e0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 69 66  st *pEList;.  if
97f0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
9800: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 3d  return;.  if( p=
9810: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
9820: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
9830: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9840: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
9850: 2e 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65  .pExpr->dataType
9860: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
9870: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  T;.    }.    ret
9880: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69  urn;.  }.  multi
9890: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
98a0: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  p->pPrior, pOrde
98b0: 72 42 79 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rBy);.  pEList =
98c0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
98d0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
98e0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
98f0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
9900: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9910: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
9920: 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54  >dataType==SQLIT
9930: 45 5f 53 4f 5f 4e 55 4d 20 29 20 63 6f 6e 74 69  E_SO_NUM ) conti
9940: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
9950: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   pE->iColumn>=0 
9960: 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  );.    if( pELis
9970: 74 2d 3e 6e 45 78 70 72 3e 70 45 2d 3e 69 43 6f  t->nExpr>pE->iCo
9980: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 45  lumn ){.      pE
9990: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 73 71 6c  ->dataType = sql
99a0: 69 74 65 45 78 70 72 54 79 70 65 28 70 45 4c 69  iteExprType(pELi
99b0: 73 74 2d 3e 61 5b 70 45 2d 3e 69 43 6f 6c 75 6d  st->a[pE->iColum
99c0: 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  n].pExpr);.    }
99d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
99e0: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
99f0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
9a00: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
9a10: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
9a20: 2a 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  * nLimit and nOf
9a30: 66 73 65 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c  fset fields.  nL
9a40: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
9a50: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
9a60: 72 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  rs.** that appea
9a70: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
9a80: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
9a90: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
9aa0: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
9ab0: 79 77 6f 72 64 73 2e 20 20 4f 72 20 74 68 61 74  ywords.  Or that
9ac0: 20 68 6f 6c 64 20 2d 31 20 61 6e 64 20 30 20 69   hold -1 and 0 i
9ad0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
9ae0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a   are omitted..**
9af0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
9b00: 73 65 74 20 61 72 65 20 74 68 65 20 69 6e 74 65  set are the inte
9b10: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
9b20: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a  ter numbers for.
9b30: 2a 2a 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ** counters used
9b40: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
9b50: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
9b60: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
9b70: 6f 0a 2a 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  o.** limit and/o
9b80: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 69  r offset, then i
9b90: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
9ba0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
9bb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9bc0: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
9bd0: 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20  alues if iLimit 
9be0: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
9bf0: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
9c00: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
9c10: 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e  ned by nLimit an
9c20: 64 20 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d nOffset.  iLim
9c30: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
9c40: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
9c50: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
9c60: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
9c70: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
9c80: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
9c90: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
9ca0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
9cb0: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
9cc0: 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f   nLimit>=0 or nO
9cd0: 66 66 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c  ffset>0 do the l
9ce0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
9cf0: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
9d00: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
9d10: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
9d20: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
9d30: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
9d40: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
9d50: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
9d60: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
9d70: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
9d80: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
9d90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
9da0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
9db0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
9dc0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
9dd0: 20 2f 2a 20 0a 20 20 2a 2a 20 49 66 20 74 68 65   /* .  ** If the
9de0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 70   comparison is p
9df0: 2d 3e 6e 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20  ->nLimit>0 then 
9e00: 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 73 0a  "LIMIT 0" shows.
9e10: 20 20 2a 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20    ** all rows.  
9e20: 49 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  It is the same a
9e30: 73 20 6e 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74  s no limit. If t
9e40: 68 65 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69  he comparision i
9e50: 73 0a 20 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74  s.  ** p->nLimit
9e60: 3e 3d 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20  >=0 then "LIMIT 
9e70: 30 22 20 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20  0" show no rows 
9e80: 61 74 20 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49  at all..  ** "LI
9e90: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
9ea0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
9eb0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
9ec0: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
9ed0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
9ee0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
9ef0: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
9f00: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
9f10: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
9f20: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
9f30: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
9f40: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
9f50: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->nLimit>=0 ){.
9f60: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
9f70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
9f80: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
9f90: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
9fa0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
9fb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
9fc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9fd0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70  , OP_Integer, -p
9fe0: 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->nLimit, 0);.  
9ff0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a000: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
a010: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
a020: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d  p->iLimit = iMem
a030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e  ;.  }.  if( p->n
a040: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
a050: 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
a060: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56  e->nMem++;.    V
a070: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
a080: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a090: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a0a0: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
a0b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a0c0: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f  _Integer, -p->nO
a0d0: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
a0e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a0f0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
a100: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
a110: 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a  iOffset = iMem;.
a120: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
a130: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a140: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
a150: 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72   query that is r
a160: 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a  eally the union.
a170: 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ** or intersecti
a180: 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  on of two or mor
a190: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
a1a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  es..**.** "p" po
a1b0: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
a1c0: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
a1d0: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
a1e0: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
a1f0: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
a200: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
a210: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
a220: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
a230: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
a240: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
a250: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
a260: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
a270: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
a280: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
a290: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
a2a0: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
a2b0: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
a2c0: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
a2d0: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
a2e0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
a2f0: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
a300: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
a310: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
a320: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
a330: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
a340: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
a350: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
a360: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
a370: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
a380: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
a390: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
a3a0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
a3b0: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
a3c0: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
a3d0: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
a3f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a400: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
a410: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
a420: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
a430: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
a440: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
a450: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
a460: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
a470: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
a480: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
a490: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
a4a0: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
a4b0: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
a4c0: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
a4d0: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
a4e0: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
a4f0: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
a500: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
a510: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
a520: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
a530: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
a540: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
a550: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
a560: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
a570: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
a580: 6c 74 69 53 65 6c 65 63 74 28 50 61 72 73 65 20  ltiSelect(Parse 
a590: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
a5a0: 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
a5b0: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74  nt iParm){.  int
a5c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
a5d0: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
a5e0: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
a5f0: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
a600: 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41  pPrior;     /* A
a610: 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
a620: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
a630: 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
a640: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v;            /
a650: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
a660: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
a670: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a680: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
a690: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
a6a0: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
a6b0: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
a6c0: 2a 20 74 68 65 20 6c 61 73 74 20 53 45 4c 45 43  * the last SELEC
a6d0: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
a6e0: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
a6f0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
a700: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   */.  if( p==0 |
a710: 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  | p->pPrior==0 )
a720: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50 72   return 1;.  pPr
a730: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
a740: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
a750: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
a760: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
a770: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
a780: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
a790: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
a7a0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
a7b0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
a7c0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
a7d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
a7e0: 6f 72 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c  or->nLimit>=0 ||
a7f0: 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74   pPrior->nOffset
a800: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
a810: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a820: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
a830: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
a840: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
a850: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
a860: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
a870: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
a880: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
a890: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75   have a valid qu
a8a0: 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20  ery engine.  If 
a8b0: 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65  not, create a ne
a8c0: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20  w one..  */.  v 
a8d0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
a8e0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
a8f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a900: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
a910: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
a920: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
a930: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
a940: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
a950: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
a960: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a970: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
a980: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
a990: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
a9a0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
a9b0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
a9c0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
a9d0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
a9e0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
a9f0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
aa00: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
aa10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
aa20: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
aa30: 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d      pPrior->nLim
aa40: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
aa50: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
aa60: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
aa70: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63  fset;.        rc
aa80: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
aa90: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
aaa0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
aab0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
aac0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
aad0: 72 63 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  rc;.        p->p
aae0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
aaf0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
ab00: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
ab10: 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
ab20: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
ab30: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  set;.        p->
ab40: 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  nLimit = -1;.   
ab50: 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20       p->nOffset 
ab60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
ab70: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
ab80: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
ab90: 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29   iParm, 0, 0, 0)
aba0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
abb0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
abc0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
abd0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
abe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
abf0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
ac00: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
ac10: 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
ac20: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
ac30: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
ac40: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
ac50: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
ac60: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
ac70: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
ac80: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
ac90: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
aca0: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
acb0: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
acc0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
acd0: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
ace0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
acf0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
ad00: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
ad10: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
ad20: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
ad30: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
ad40: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  lects */.      i
ad50: 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73  nt nLimit, nOffs
ad60: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
ad70: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
ad80: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
ad90: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
ada0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a  t *pOrderBy;  /*
adb0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
adc0: 61 75 73 65 20 66 6f 72 20 74 68 65 20 72 69 67  ause for the rig
add0: 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  ht SELECT */..  
ade0: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d      priorOp = p-
adf0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52  >op==TK_ALL ? SR
ae00: 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e  T_Table : SRT_Un
ae10: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65  ion;.      if( e
ae20: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
ae30: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
ae40: 26 26 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26  && p->nLimit<0 &
ae50: 26 20 70 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30 20  & p->nOffset==0 
ae60: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
ae70: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
ae80: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
ae90: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
aea0: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
aeb0: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
aec0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
aed0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
aee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
aef0: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
af00: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
af10: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
af20: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
af30: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
af40: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
af50: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
af60: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
af70: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
af80: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
af90: 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20  ->pOrderBy .    
afa0: 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65      && matchOrde
afb0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
afc0: 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
afd0: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  By, unionTab, 1)
afe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
aff0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
b000: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
b010: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20  >op!=TK_ALL ){. 
b020: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
b030: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b040: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
b050: 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  b, 1);.         
b060: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b070: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
b080: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a  , unionTab, 1);.
b090: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b0a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
b0b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b0c0: 70 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61  penTemp, unionTa
b0d0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
b0e0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
b0f0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
b100: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
b110: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
b120: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
b130: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
b140: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
b150: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
b160: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
b170: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
b180: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
b190: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
b1a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
b1b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69      */.      swi
b1c0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
b1d0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45         case TK_E
b1e0: 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54  XCEPT:  op = SRT
b1f0: 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b  _Except;   break
b200: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
b210: 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d  TK_UNION:   op =
b220: 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62   SRT_Union;    b
b230: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
b240: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
b250: 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20  op = SRT_Table; 
b260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b270: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
b280: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72  r = 0;.      pOr
b290: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
b2a0: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
b2b0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
b2c0: 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c    nLimit = p->nL
b2d0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
b2e0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
b2f0: 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e    nOffset = p->n
b300: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
b310: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
b320: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
b330: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
b340: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30   op, unionTab, 0
b350: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
b360: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
b370: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
b380: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
b390: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
b3a0: 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
b3b0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f   p->nOffset = nO
b3c0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
b3d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b3e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
b3f0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
b400: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
b410: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
b420: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
b430: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
b440: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
b450: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
b460: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
b470: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
b480: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
b490: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
b4a0: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
b4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b4c0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
b4d0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
b4e0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
b4f0: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
b500: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
b510: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
b520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  );.          gen
b530: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
b540: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
b550: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
b560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b570: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56  iBreak = sqliteV
b580: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b590: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
b5a0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
b5b0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
b5c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b5d0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
b5e0: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
b5f0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
b600: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
b610: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
b620: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
b630: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
b640: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 6d  dr(v);.        m
b650: 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72  ultiSelectSortOr
b660: 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72  der(p, p->pOrder
b670: 42 79 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  By);.        rc 
b680: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
b690: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
b6a0: 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
b6b0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
b6c0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
b6f0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
b700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
b720: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
b730: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
b740: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
b750: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
b760: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
b770: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b780: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
b790: 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
b7a0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
b7b0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
b7c0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
b7d0: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
b7e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b7f0: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
b800: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
b810: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
b820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
b830: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
b840: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
b850: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
b860: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rm);.        }. 
b870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
b880: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b890: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
b8a0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
b8b0: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
b8c0: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
b8d0: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
b8e0: 69 6e 74 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66  int nLimit, nOff
b8f0: 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  set;..      /* I
b900: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
b910: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
b920: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
b930: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
b940: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
b950: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
b960: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
b970: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
b980: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
b990: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
b9a0: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
b9b0: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
b9c0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
b9d0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
b9e0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
b9f0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
ba00: 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72  By && matchOrder
ba10: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
ba20: 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c  e,p,p->pOrderBy,
ba30: 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20  tab1,1) ){.     
ba40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ba50: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ba60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ba70: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c  _OpenTemp, tab1,
ba80: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
ba90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
baa0: 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31  _KeyAsData, tab1
bab0: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 1);..      /* 
bac0: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
bad0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
bae0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
baf0: 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
bb00: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
bb10: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
bb20: 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55  e, pPrior, SRT_U
bb30: 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30  nion, tab1, 0, 0
bb40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
bb50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
bb60: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
bb70: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
bb80: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
bb90: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
bba0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
bbb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bbc0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62  OP_OpenTemp, tab
bbd0: 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 1);.      sql
bbe0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bbf0: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
bc00: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  b2, 1);.      p-
bc10: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
bc20: 20 20 20 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e     nLimit = p->n
bc30: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
bc40: 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  nLimit = -1;.   
bc50: 20 20 20 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e     nOffset = p->
bc60: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  nOffset;.      p
bc70: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
bc80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bc90: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
bca0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
bcb0: 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  2, 0, 0, 0);.   
bcc0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
bcd0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
bce0: 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b  nLimit = nLimit;
bcf0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
bd00: 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  t = nOffset;.   
bd10: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
bd20: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
bd30: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
bd40: 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
bd50: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
bd60: 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
bd70: 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
bd80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
bd90: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
bda0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
bdb0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
bdc0: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  ){.        gener
bdd0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
bde0: 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c  Parse, 0, p->pEL
bdf0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 67 65  ist);.        ge
be00: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
be10: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
be20: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  c, p->pEList);. 
be30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
be40: 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65  eak = sqliteVdbe
be50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
be60: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
be70: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
be80: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
be90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bea0: 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
beb0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d  reak);.      com
bec0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
bed0: 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
bee0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
bef0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
bf00: 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62   OP_FullKey, tab
bf10: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
bf20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bf30: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
bf40: 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  2, iCont);.     
bf50: 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74   multiSelectSort
bf60: 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72 64  Order(p, p->pOrd
bf70: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 72 63 20  erBy);.      rc 
bf80: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
bf90: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
bfa0: 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d  pEList, tab1, p-
bfb0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
bfe0: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
bff0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
c020: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
c030: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c040: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  1;.      sqliteV
c050: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
c060: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
c070: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c080: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
c090: 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
c0a0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
c0b0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
c0c0: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
c0d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c0e0: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
c0f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
c100: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
c110: 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
c120: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
c130: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
c140: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
c150: 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74  (p, v, p->pEList
c160: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
c170: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
c180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c190: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
c1a0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
c1b0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
c1c0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
c1d0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
c1e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
c1f0: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
c200: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
c210: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
c220: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
c230: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
c240: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
c250: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
c260: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
c270: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
c280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c290: 7d 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61 20  }..  /* Issue a 
c2a0: 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66  null callback if
c2b0: 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74 68   that is what th
c2c0: 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20 20  e user wants..  
c2d0: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
c2e0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26 26 0a  SRT_Callback &&.
c2f0: 20 20 20 20 28 70 50 61 72 73 65 2d 3e 75 73 65      (pParse->use
c300: 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20 28  Callback==0 || (
c310: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
c320: 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43  s & SQLITE_NullC
c330: 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20 20 29  allback)!=0).  )
c340: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
c350: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
c360: 43 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 45 4c  Callback, p->pEL
c370: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  ist->nExpr, 0);.
c380: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
c390: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
c3a0: 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
c3b0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
c3c0: 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
c3d0: 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
c3e0: 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
c3f0: 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
c400: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
c410: 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
c420: 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
c430: 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
c440: 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
c450: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
c460: 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
c470: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
c480: 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
c490: 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
c4a0: 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
c4b0: 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
c4c0: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
c4d0: 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
c4e0: 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
c4f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
c500: 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
c510: 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
c520: 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
c530: 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
c540: 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
c550: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
c560: 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
c570: 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
c580: 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
c590: 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
c5a0: 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
c5b0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
c5c0: 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
c5d0: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
c5e0: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
c5f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c600: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45   substExprList(E
c610: 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70  xprList*,int,Exp
c620: 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72  rList*);  /* For
c630: 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61  ward Decl */.sta
c640: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
c650: 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  pr(Expr *pExpr, 
c660: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
c670: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
c680: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
c690: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
c6a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
c6b0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
c6c0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
c6d0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
c6e0: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
c6f0: 65 77 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ew;.    assert( 
c700: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
c710: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
c720: 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
c730: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
c740: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
c750: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20  r->pRight==0 && 
c760: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
c770: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 45  );.    pNew = pE
c780: 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
c790: 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
c7a0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
c7b0: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c7c0: 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a  >op = pNew->op;.
c7d0: 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54      pExpr->dataT
c7e0: 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74 61  ype = pNew->data
c7f0: 54 79 70 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Type;.    assert
c800: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
c810: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
c820: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78  pLeft = sqliteEx
c830: 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66  prDup(pNew->pLef
c840: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
c850: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
c860: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70   );.    pExpr->p
c870: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78  Right = sqliteEx
c880: 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67  prDup(pNew->pRig
c890: 68 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ht);.    assert(
c8a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
c8b0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70   );.    pExpr->p
c8c0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70  List = sqliteExp
c8d0: 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70  rListDup(pNew->p
c8e0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
c8f0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
c900: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 45 78  >iTable;.    pEx
c910: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e  pr->iColumn = pN
c920: 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ew->iColumn;.   
c930: 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
c940: 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 73  New->iAgg;.    s
c950: 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26  qliteTokenCopy(&
c960: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pExpr->token, &p
c970: 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  New->token);.   
c980: 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79   sqliteTokenCopy
c990: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  (&pExpr->span, &
c9a0: 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d  pNew->span);.  }
c9b0: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
c9c0: 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
c9d0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
c9e0: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
c9f0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
ca00: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ca10: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
ca20: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
ca30: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ca40: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ca50: 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69  oid .substExprLi
ca60: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
ca70: 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  st, int iTable, 
ca80: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ca90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
caa0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
cab0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
cac0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
cad0: 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45  i++){.    substE
cae0: 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
caf0: 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
cb00: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  EList);.  }.}../
cb10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cb20: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
cb30: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
cb40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
cb50: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
cb60: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
cb70: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
cb80: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
cb90: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
cba0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
cbb0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
cbc0: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
cbd0: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
cbe0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
cbf0: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
cc00: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
cc10: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
cc20: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
cc30: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
cc40: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
cc50: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
cc60: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
cc70: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
cc80: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
cc90: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
cca0: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
ccb0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
ccc0: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
ccd0: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
cce0: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
ccf0: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
cd00: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
cd10: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
cd20: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
cd30: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
cd40: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
cd50: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
cd60: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
cd70: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cd80: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
cd90: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
cda0: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
cdb0: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
cdc0: 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
cdd0: 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
cde0: 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
cdf0: 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
ce00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ce10: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
ce20: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
ce30: 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
ce40: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
ce50: 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
ce60: 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
ce70: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
ce80: 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
ce90: 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
cea0: 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
ceb0: 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
cec0: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
ced0: 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
cee0: 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
cef0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
cf00: 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
cf10: 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
cf20: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
cf30: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
cf40: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
cf50: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
cf60: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
cf70: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
cf80: 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
cf90: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
cfa0: 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
cfb0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
cfc0: 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
cfd0: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
cfe0: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
cff0: 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
d000: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
d010: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
d020: 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
d030: 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
d040: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
d050: 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
d060: 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
d070: 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
d080: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
d090: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
d0a0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d0b0: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
d0c0: 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
d0d0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
d0e0: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
d0f0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
d100: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
d110: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
d120: 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
d130: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
d140: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
d150: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
d160: 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
d170: 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
d180: 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
d190: 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
d1a0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
d1b0: 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
d1c0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
d1d0: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
d1e0: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
d1f0: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
d200: 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
d210: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
d220: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
d230: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
d240: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
d250: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
d260: 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
d270: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
d280: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
d290: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
d2a0: 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
d2b0: 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
d2c0: 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
d2d0: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
d2e0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
d2f0: 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
d300: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
d310: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
d320: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
d330: 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
d340: 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
d350: 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
d360: 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
d370: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
d380: 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
d390: 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
d3a0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
d3b0: 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
d3c0: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
d3d0: 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
d3e0: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
d3f0: 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
d400: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
d410: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
d420: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
d430: 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
d440: 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
d450: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
d460: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
d470: 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
d480: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
d490: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
d4a0: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
d4b0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
d4c0: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
d4d0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
d4e0: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
d4f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
d500: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
d510: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
d520: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
d530: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
d540: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
d550: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
d560: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
d570: 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
d580: 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
d590: 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
d5a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
d5b0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
d5c0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
d5d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
d5e0: 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
d5f0: 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
d600: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
d610: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
d620: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
d630: 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
d640: 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
d650: 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
d660: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d670: 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
d680: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
d690: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
d6a0: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
d6b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
d6c0: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
d6d0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
d6e0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
d6f0: 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
d700: 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
d710: 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
d720: 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
d730: 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
d740: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
d750: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d760: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d770: 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
d780: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
d790: 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
d7a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d7b0: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
d7c0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
d7d0: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
d7e0: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
d7f0: 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
d800: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
d810: 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
d820: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
d830: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
d840: 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68  pWhere;..  /* Ch
d850: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
d860: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
d870: 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
d880: 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
d890: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
d8a0: 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
d8b0: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
d8c0: 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
d8d0: 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
d8e0: 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20  >nSrc );.  pSub 
d8f0: 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  = pSrc->a[iFrom]
d900: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  .pSelect;.  asse
d910: 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
d920: 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
d930: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
d940: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75  turn 0;.  if( su
d950: 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
d960: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
d970: 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72  turn 0;.  pSubSr
d980: 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
d990: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
d9a0: 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53  c );.  if( pSubS
d9b0: 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
d9c0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
d9d0: 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  Sub->isDistinct 
d9e0: 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  || pSub->nLimit>
d9f0: 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e  =0) &&  (pSrc->n
da00: 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
da10: 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
da20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  ;.  }.  if( (p->
da30: 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d  isDistinct || p-
da40: 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73  >nLimit>=0) && s
da50: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
da60: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
da70: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
da80: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
da90: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52  eturn 0;..  /* R
daa0: 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
dab0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
dac0: 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
dad0: 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
dae0: 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
daf0: 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
db00: 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
db10: 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
db20: 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
db30: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
db40: 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
db50: 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
db60: 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
db70: 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
db80: 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
db90: 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
dba0: 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
dbb0: 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
dbc0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
dbd0: 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
dbe0: 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
dbf0: 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
dc00: 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  thing..  */.  if
dc10: 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
dc20: 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20  1 && iFrom>0 && 
dc30: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
dc40: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
dc50: 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
dc60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
dc70: 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
dc80: 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
dc90: 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
dca0: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
dcb0: 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
dcc0: 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
dcd0: 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
dce0: 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
dcf0: 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
dd00: 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
dd10: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
dd20: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
dd30: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
dd40: 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
dd50: 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
dd60: 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
dd70: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
dd80: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
dd90: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
dda0: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
ddb0: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
ddc0: 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
ddd0: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
dde0: 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
ddf0: 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
de00: 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
de10: 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
de20: 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
de30: 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
de40: 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
de50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72  ..  */.  if( iFr
de60: 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
de70: 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
de80: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
de90: 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62  0 .      && pSub
dea0: 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20  ->pWhere!=0 ){. 
deb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dec0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
ded0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
dee0: 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
def0: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
df00: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72  for the.  ** iFr
df10: 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
df20: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
df30: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
df40: 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f  y..  */..  /* Mo
df50: 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
df60: 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
df70: 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
df80: 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
df90: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
dfa0: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
dfb0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
dfc0: 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
dfd0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
dfe0: 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
dff0: 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
e000: 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
e010: 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
e020: 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
e030: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
e040: 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
e050: 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
e060: 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
e070: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
e080: 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
e090: 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
e0a0: 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
e0b0: 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
e0c0: 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
e0d0: 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
e0e0: 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
e0f0: 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
e100: 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
e110: 20 69 50 61 72 65 6e 74 20 3d 20 70 53 72 63 2d   iParent = pSrc-
e120: 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f  >a[iFrom].iCurso
e130: 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e  r;.  {.    int n
e140: 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
e150: 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->nSrc;.    int 
e160: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 72 63 2d  jointype = pSrc-
e170: 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
e180: 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  pe;..    if( pSr
e190: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
e1a0: 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f   && pSrc->a[iFro
e1b0: 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m].pTab->isTrans
e1c0: 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
e1d0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
e1e0: 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  0, pSrc->a[iFrom
e1f0: 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ].pTab);.    }. 
e200: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
e210: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61  rc->a[iFrom].zDa
e220: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
e230: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
e240: 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iFrom].zName);. 
e250: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
e260: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c  rc->a[iFrom].zAl
e270: 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ias);.    if( nS
e280: 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
e290: 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
e2a0: 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
e2b0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53  for(i=1; i<nSubS
e2c0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
e2d0: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 53    pSrc = sqliteS
e2e0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72  rcListAppend(pSr
e2f0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  c, 0, 0);.      
e300: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20  }.      p->pSrc 
e310: 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
e320: 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
e330: 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
e340: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
e350: 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
e360: 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
e370: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e380: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
e390: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
e3a0: 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
e3b0: 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
e3c0: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
e3d0: 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
e3e0: 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
e3f0: 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
e400: 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
e410: 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f  om+nSubSrc-1].jo
e420: 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
e430: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  e;.  }..  /* Now
e440: 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
e450: 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
e460: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
e470: 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65  ons for .  ** re
e480: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
e490: 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
e4a0: 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a  uter query..  **
e4b0: 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a   .  ** Example:.
e4c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45    **.  **   SELE
e4d0: 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
e4e0: 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
e4f0: 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
e500: 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
e510: 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20  ;.  **   \      
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
e530: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
e540: 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
e550: 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
e560: 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
e570: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
e580: 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
e590: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e5a0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20  _______/.  **.  
e5b0: 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
e5c0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
e5d0: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
e5e0: 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
e5f0: 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61  e we see.  ** "a
e600: 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
e610: 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
e620: 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
e630: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
e640: 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75  y+10"..  */.  su
e650: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
e660: 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
e670: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
e680: 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69   pList = p->pELi
e690: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
e6a0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
e6b0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
e6c0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c  Expr;.    if( pL
e6d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
e6e0: 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70  =0 && (pExpr = p
e6f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
e700: 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a  )->span.z!=0 ){.
e710: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
e720: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
e730: 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73  StrNDup(pExpr->s
e740: 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70  pan.z, pExpr->sp
e750: 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  an.n);.    }.  }
e760: 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
e770: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
e780: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  t(p->pGroupBy, i
e790: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e7a0: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
e7b0: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
e7c0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
e7d0: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69  pEList);.  }.  i
e7e0: 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
e7f0: 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
e800: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
e810: 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
e820: 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
e830: 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  rBy;.    pSub->p
e840: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
e850: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64  else if( p->pOrd
e860: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73  erBy ){.    subs
e870: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
e880: 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
e890: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
e8a0: 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
e8b0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
e8c0: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
e8d0: 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
e8e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e8f0: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
e900: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
e910: 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
e920: 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
e930: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
e940: 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
e950: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
e960: 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
e970: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
e980: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
e990: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
e9a0: 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 20  ( pSub->pHaving 
e9b0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
e9c0: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45  Having = sqliteE
e9d0: 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61  xprDup(pSub->pHa
e9e0: 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ving);.      if(
e9f0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
ea00: 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e         p->pHavin
ea10: 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  g = sqliteExpr(T
ea20: 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e  K_AND, p->pHavin
ea30: 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a  g, pHaving, 0);.
ea40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ea50: 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20       p->pHaving 
ea60: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 20  = pHaving;.     
ea70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
ea80: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
ea90: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47  ==0 );.    p->pG
eaa0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 45  roupBy = sqliteE
eab0: 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d  xprListDup(pSub-
eac0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
ead0: 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72  lse if( p->pWher
eae0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  e==0 ){.    p->p
eaf0: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
eb00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
eb10: 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
eb20: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
eb30: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
eb40: 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( pWhere ){.    
eb50: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
eb60: 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c  liteExpr(TK_AND,
eb70: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65   p->pWhere, pWhe
eb80: 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  re, 0);.    }.  
eb90: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  }..  /* The flat
eba0: 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
ebb0: 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
ebc0: 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
ebd0: 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  he.  ** outer qu
ebe0: 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
ebf0: 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69   .  */.  p->isDi
ec00: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
ec10: 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e  stinct || pSub->
ec20: 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
ec30: 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6c  * Transfer the l
ec40: 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
ec50: 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72  from the subquer
ec60: 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a 20  y to the outer. 
ec70: 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   ** query..  */.
ec80: 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d    if( pSub->nLim
ec90: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  it>=0 ){.    if(
eca0: 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a   p->nLimit<0 ){.
ecb0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
ecc0: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a  = pSub->nLimit;.
ecd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
ece0: 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73  >nLimit+p->nOffs
ecf0: 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  et > pSub->nLimi
ed00: 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  t+pSub->nOffset 
ed10: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  ){.      p->nLim
ed20: 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  it = pSub->nLimi
ed30: 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65  t + pSub->nOffse
ed40: 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t - p->nOffset;.
ed50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
ed60: 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e  Offset += pSub->
ed70: 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46  nOffset;..  /* F
ed80: 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
ed90: 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
eda0: 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
edb0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
edc0: 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
edd0: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
ede0: 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
edf0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
ee00: 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
ee10: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
ee20: 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
ee30: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
ee40: 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
ee50: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
ee60: 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
ee70: 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
ee80: 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
ee90: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
eea0: 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
eeb0: 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
eec0: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
eed0: 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
eee0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
eef0: 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
ef00: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
ef10: 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
ef20: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
ef30: 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
ef40: 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
ef50: 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
ef60: 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
ef70: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
ef80: 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
ef90: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
efa0: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
efb0: 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
efc0: 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
efd0: 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
efe0: 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
eff0: 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
f000: 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
f010: 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
f020: 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
f030: 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
f040: 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
f050: 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
f060: 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
f070: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
f080: 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
f090: 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
f0a0: 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
f0b0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
f0c0: 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
f0d0: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
f0e0: 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
f0f0: 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
f100: 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a  qliteSelect()..*
f110: 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  * See the header
f120: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74   comment on that
f130: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
f140: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
f150: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
f160: 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  nt simpleMinMaxQ
f170: 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
f180: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
f190: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
f1a0: 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45  arm){.  Expr *pE
f1b0: 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  xpr;.  int iCol;
f1c0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
f1d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f1e0: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62   int base;.  Vdb
f1f0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b  e *v;.  int seek
f200: 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a  Op;.  int cont;.
f210: 20 20 45 78 70 72 4c 69 73 74 20 65 4c 69 73 74    ExprList eList
f220: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
f230: 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74  ist_item eListIt
f240: 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  em;..  /* Check 
f250: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71  to see if this q
f260: 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
f270: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
f280: 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20  query.  Return. 
f290: 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69   ** zero if it i
f2a0: 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  s  not..  */.  i
f2b0: 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c  f( p->pGroupBy |
f2c0: 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20  | p->pHaving || 
f2d0: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
f2e0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
f2f0: 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
f300: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
f310: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
f320: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
f330: 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
f340: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
f350: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
f360: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
f370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f380: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  f( pExpr->pList=
f390: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69  =0 || pExpr->pLi
f3a0: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
f3b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
f3c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33  Expr->token.n!=3
f3d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f3e0: 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
f3f0: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
f400: 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
f410: 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
f420: 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20  Rewind;.  }else 
f430: 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43  if( sqliteStrNIC
f440: 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  mp(pExpr->token.
f450: 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b  z,"max",3)==0 ){
f460: 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50  .    seekOp = OP
f470: 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _Last;.  }else{.
f480: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f490: 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 45 78 70  }.  pExpr = pExp
f4a0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
f4b0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
f4c0: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
f4d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f4e0: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
f4f0: 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70  lumn;.  pTab = p
f500: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
f510: 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  b;..  /* If we g
f520: 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d  et to here, it m
f530: 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69  eans the query i
f540: 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74  s of the correct
f550: 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63   form..  ** Chec
f560: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77  k to make sure w
f570: 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20  e have an index 
f580: 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f  and make pIdx po
f590: 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  int to the.  ** 
f5a0: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
f5b0: 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29  x.  If the min()
f5c0: 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20   or max() is on 
f5d0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
f5e0: 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75  RY.  ** key colu
f5f0: 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20  mn, no index is 
f600: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74  necessary so set
f610: 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20   pIdx to NULL.  
f620: 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c  If no.  ** usabl
f630: 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64  e index is found
f640: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
f650: 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b  .  if( iCol<0 ){
f660: 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20  .    pIdx = 0;. 
f670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
f680: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f690: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f6a0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f6b0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
f6c0: 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
f6d0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
f6e0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
f6f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
f700: 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
f710: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
f720: 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
f730: 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65  lumn types if we
f740: 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
f750: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68  he callback.  Th
f760: 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
f770: 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
f780: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
f790: 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d  o a table or a m
f7a0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a  emory cell..  **
f7b0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
f7c0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
f7d0: 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e  een generated in
f7e0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
f7f0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20  ction..  */.  v 
f800: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
f810: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
f820: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f830: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
f840: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
f850: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
f860: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ypes(pParse, p->
f870: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
f880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
f890: 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
f8a0: 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
f8b0: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
f8c0: 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
f8d0: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
f8e0: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
f8f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f900: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
f910: 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
f920: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
f930: 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e  ting code to fin
f940: 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65  d the min or the
f950: 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79   max.  Basically
f960: 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   all we have.  *
f970: 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20  * to do is find 
f980: 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65  the first or the
f990: 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
f9a0: 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e  he chosen index.
f9b0: 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69    If.  ** the mi
f9c0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
f9d0: 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  on the INTEGER P
f9e0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
f9f0: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a   find the first.
fa00: 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74    ** or last ent
fa10: 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ry in the main t
fa20: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  able..  */.  sql
fa30: 69 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68  iteCodeVerifySch
fa40: 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
fa50: 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d  ->iDb);.  base =
fa60: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69   p->pSrc->a[0].i
fa70: 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74  Cursor;.  comput
fa80: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
fa90: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 73 71  pParse, p);.  sq
faa0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fab0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
fac0: 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71  b->iDb, 0);.  sq
fad0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fae0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61   OP_OpenRead, ba
faf0: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b  se, pTab->tnum);
fb00: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61  .  sqliteVdbeCha
fb10: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
fb20: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
fb30: 54 49 43 29 3b 0a 20 20 63 6f 6e 74 20 3d 20 73  TIC);.  cont = s
fb40: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
fb50: 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64  el(v);.  if( pId
fb60: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
fb70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  teVdbeAddOp(v, s
fb80: 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
fb90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
fba0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fbb0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64   OP_Integer, pId
fbc0: 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  x->iDb, 0);.    
fbd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fbe0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
fbf0: 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e  base+1, pIdx->tn
fc00: 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  um);.    sqliteV
fc10: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
fc20: 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
fc30: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
fc40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fc50: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b  v, seekOp, base+
fc60: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fc70: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fc80: 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b  _IdxRecno, base+
fc90: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
fca0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fcb0: 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20  _Close, base+1, 
fcc0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
fcd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
fce0: 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veTo, base, 0);.
fcf0: 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
fd00: 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
fd10: 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
fd20: 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
fd30: 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
fd40: 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
fd50: 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
fd60: 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
fd70: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
fd80: 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
fd90: 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
fda0: 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
fdb0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  t);.  sqliteVdbe
fdc0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
fdd0: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56  cont);.  sqliteV
fde0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
fdf0: 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  lose, base, 0);.
fe00: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
fe10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
fe20: 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
fe30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fe40: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
fe50: 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
fe60: 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
fe70: 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
fe80: 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  n the.** value o
fe90: 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72  f eDest and iPar
fea0: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65  m..**.**     eDe
feb0: 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52  st Value       R
fec0: 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
fed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
fee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
ff10: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
ff20: 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
ff30: 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
ff40: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
ff50: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
ff60: 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
ff70: 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
ff80: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72  memory cell iPar
ff90: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
ffa0: 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
ffb0: 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
ffc0: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74  s of a table wit
ffd0: 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a  h cursor iParm.*
ffe0: 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
fff0: 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
10000 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
10010 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
10020 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
10030 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
10040 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
10050 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
10060 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
10070 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
10080 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
10090 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
100a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
100b0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Parm.**.** The t
100c0 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e  able above is in
100d0 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74  complete.  Addit
100e0 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75  ional eDist valu
100f0 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a  e have be added.
10100 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  ** since this co
10110 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65  mment was writte
10120 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65  n.  See the sele
10130 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75  ctInnerLoop() fu
10140 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20  nction for.** a 
10150 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67  complete listing
10160 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20   of the allowed 
10170 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20  values of eDest 
10180 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e  and their meanin
10190 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gs..**.** This r
101a0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
101b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
101c0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
101d0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
101e0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
101f0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
10200 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
10210 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
10220 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
10230 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
10240 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
10250 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
10260 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
10270 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
10280 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
10290 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  hat..**.** The p
102a0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
102b0 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41  b, and *pParentA
102c0 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69  gg fields are fi
102d0 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a  lled in if this.
102e0 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73  ** SELECT is a s
102f0 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72  ubquery.  This r
10300 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74  outine may try t
10310 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53  o combine this S
10320 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74  ELECT.** with it
10330 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d  s parent to form
10340 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71   a single flat q
10350 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69  uery.  In so doi
10360 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20  ng, it might.** 
10370 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e  change the paren
10380 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e  t query from a n
10390 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20  on-aggregate to 
103a0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
103b0 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20  ry..** For that 
103c0 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72  reason, the pPar
103d0 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70  entAgg flag is p
103e0 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74  assed as a point
103f0 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e  er, so it.** can
10400 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a   be changed..**.
10410 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20  ** Example 1:   
10420 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
10430 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
10440 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  eter..**.**    S
10450 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
10460 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20  JOIN (SELECT x, 
10470 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
10480 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20  ) JOIN t3;.**   
10490 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
104a0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
104b0 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
104c0 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20  _/        /.**  
104d0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20            /.**  
10510 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10520 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
10530 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
10540 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a  _________/.**.**
10550 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10560 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
10570 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73  outer query firs
10580 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61  t.   For that ca
10590 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77  ll,.** pParent w
105a0 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75  ill be NULL.  Du
105b0 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73  ring the process
105c0 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ing of the outer
105d0 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a   query, this .**
105e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
105f0 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ed recursively t
10600 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62  o handle the sub
10610 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20  query.  For the 
10620 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  recursive.** cal
10630 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  l, pParent will 
10640 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  point to the out
10650 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75  er query.  Becau
10660 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  se the subquery 
10670 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  is.** the second
10680 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68   element in a th
10690 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68  ree-way join, th
106a0 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61  e parentTab para
106b0 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  meter will.** be
106c0 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75   1 (the 2nd valu
106d0 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64  e of a 0-indexed
106e0 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20   array.).*/.int 
106f0 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20 20  sqliteSelect(.  
10700 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10710 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10720 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
10730 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10750 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10760 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
10770 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
10780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
10790 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
107a0 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
107b0 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
107c0 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61         /* A para
107d0 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68  meter used by th
107e0 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c  e eDest disposal
107f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c   method */.  Sel
10800 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
10810 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
10820 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
10830 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
10840 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
10850 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
10860 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
10870 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
10880 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
10890 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20 20   *pParentAgg    
108a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
108b0 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
108c0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
108d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
108e0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
108f0 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  fo;.  Vdbe *v;. 
10900 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20   int isAgg = 0; 
10910 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10920 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
10930 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
10940 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10950 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
10960 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
10970 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
10980 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
10990 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
109a0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
109b0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
109c0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
109d0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
109e0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
109f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
10a00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
10a10 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
10a20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
10a30 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
10a40 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
10a50 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
10a60 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
10a70 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
10a80 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
10a90 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
10aa0 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
10ab0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
10ac0 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
10ad0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
10ae0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
10af0 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
10b00 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
10b10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
10b20 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
10b30 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
10b40 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
10b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
10b60 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
10b70 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
10b80 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  n */..  if( sqli
10b90 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
10ba0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10bb0 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72   || p==0 ) retur
10bc0 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
10bd0 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
10be0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
10bf0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
10c00 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 1;..  /* If 
10c10 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
10c20 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
10c30 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
10c40 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
10c50 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
10c60 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
10c70 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
10c80 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
10c90 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iParm);.  }..  /
10ca0 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
10cb0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
10cc0 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
10cd0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
10ce0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
10cf0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
10d00 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42  Where;.  pOrderB
10d10 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
10d20 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
10d30 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
10d40 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
10d50 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
10d60 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
10d70 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10d80 56 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f 72  VDBE cursors for
10d90 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
10da0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
10db0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 53 72 63 4c   */.  sqliteSrcL
10dc0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
10dd0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
10de0 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  t);..  /* .  ** 
10df0 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
10e00 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
10e10 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
10e20 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
10e30 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
10e40 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
10e50 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
10e60 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
10e70 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
10e80 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61  _end;..  /* Expa
10e90 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73  nd any "*" terms
10ea0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
10eb0 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c  et.  (For exampl
10ec0 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a  e the "*" in.  *
10ed0 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  * "SELECT * FROM
10ee0 20 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49   t1")  The fillI
10ef0 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f  nColumnlist() ro
10f00 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
10f10 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20  some.  ** other 
10f20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73  housekeeping - s
10f30 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
10f40 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c  mment for detail
10f50 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69  s..  */.  if( fi
10f60 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
10f70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
10f80 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
10f90 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d  ;.  }.  pWhere =
10fa0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45   p->pWhere;.  pE
10fb0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
10fc0 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
10fd0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
10fe0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
10ff0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
11000 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
11010 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
11020 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
11030 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
11040 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  /.  if( (eDest==
11050 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
11060 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
11070 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
11080 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
11090 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
110a0 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
110b0 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
110c0 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
110d0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
110e0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
110f0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
11100 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
11110 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
11120 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
11130 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
11140 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
11150 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
11160 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65  _Union:.    case
11170 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20   SRT_Except:.   
11180 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72   case SRT_Discar
11190 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  d:.      pOrderB
111a0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  y = 0;.      bre
111b0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
111c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
111d0 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
111e0 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64  point, we should
111f0 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20   have allocated 
11200 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20  all the cursors 
11210 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65  that we.  ** nee
11220 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71  d to handle subq
11230 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72  uerys and tempor
11240 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20  ary tables.  .  
11250 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20  **.  ** Resolve 
11260 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
11270 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74   and do a semant
11280 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c  ics check on all
11290 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
112a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
112b0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
112c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
112d0 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
112e0 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
112f0 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73  abList, 0, pELis
11300 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
11310 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11320 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11330 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11340 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
11350 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
11360 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b  r, 1, &isAgg) ){
11370 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
11380 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
11390 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 29  }.  if( pWhere )
113a0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
113b0 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
113c0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
113d0 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65 29   pEList, pWhere)
113e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
113f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
11400 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
11410 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
11420 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29   pWhere, 0, 0) )
11430 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11440 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11450 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
11460 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f   ){.    if( pGro
11470 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
11480 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
11490 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50  pParse, "a GROUP
114a0 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65   BY clause is re
114b0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41  quired before HA
114c0 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f  VING");.      go
114d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
114e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
114f0 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
11500 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
11510 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76  st, pEList, pHav
11520 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ing) ){.      go
11530 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11540 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
11550 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
11560 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c  rse, pHaving, 1,
11570 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20   &isAgg) ){.    
11580 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11590 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  d;.    }.  }.  i
115a0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
115b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
115c0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
115d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
115e0 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20  Col;.      Expr 
115f0 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
11600 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
11610 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11620 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
11630 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26  Col) && iCol>0 &
11640 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
11650 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
11660 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
11670 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70  e(pE);.        p
11680 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
11690 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
116a0 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  eExprDup(pEList-
116b0 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
116c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
116d0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
116e0 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
116f0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
11700 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  st, pE) ){.     
11710 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11720 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11730 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11740 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
11750 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20  , isAgg, 0) ){. 
11760 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
11770 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
11780 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11790 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
117a0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  E) ){.        if
117b0 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  ( sqliteExprIsIn
117c0 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
117d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
117e0 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
117f0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11800 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74       "ORDER BY t
11810 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65  erms must not be
11820 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e   non-integer con
11830 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  stants");.      
11840 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11850 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  end;.        }el
11860 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c  se if( iCol<=0 |
11870 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
11880 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
11890 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
118a0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
118b0 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
118c0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25   column number %
118d0 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  d out of range -
118e0 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
118f0 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
11900 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43  en 1 and %d", iC
11910 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
11920 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  r);.          go
11930 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11950 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11960 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
11970 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
11980 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
11990 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
119a0 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  l;.      Expr *p
119b0 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
119c0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
119d0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
119e0 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
119f0 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20  l) && iCol>0 && 
11a00 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
11a10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
11a20 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
11a30 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20  pE);.        pE 
11a40 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
11a50 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45  .pExpr = sqliteE
11a60 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61  xprDup(pEList->a
11a70 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b  [iCol-1].pExpr);
11a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11a90 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
11aa0 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
11ab0 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
11ac0 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  , pE) ){.       
11ad0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11af0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
11b00 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20  eck(pParse, pE, 
11b10 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20  isAgg, 0) ){.   
11b20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11b30 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
11b40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
11b50 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
11b60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11b70 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
11b80 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d  ger(pE, &iCol)==
11b90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
11ba0 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
11bb0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
11bc0 20 20 22 47 52 4f 55 50 20 42 59 20 74 65 72 6d    "GROUP BY term
11bd0 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
11be0 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
11bf0 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nts");.         
11c00 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11c10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11c20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
11c30 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
11c40 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
11c50 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
11c60 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
11c70 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f 6c     "GROUP BY col
11c80 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
11c90 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
11ca0 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
11cb0 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
11cc0 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20   and %d", iCol, 
11cd0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
11ce0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
11cf0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11d00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11d10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67   }.  }..  /* Beg
11d20 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
11d30 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
11d40 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
11d50 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
11d60 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
11d70 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd;..  /* Identi
11d80 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
11d90 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
11da0 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
11db0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
11dc0 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
11dd0 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
11de0 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
11df0 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
11e00 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
11e10 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
11e20 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
11e30 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
11e40 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
11e50 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
11e60 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
11e70 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
11e80 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
11e90 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
11ea0 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
11eb0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
11ec0 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
11ed0 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
11ee0 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
11ef0 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
11f00 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
11f10 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
11f20 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11f30 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
11f40 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
11f50 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f  clause.  */.  fo
11f60 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
11f70 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
11f80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11f90 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
11fa0 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65  ;.    int needRe
11fb0 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20  storeContext;.. 
11fc0 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
11fd0 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[i].pSelect==0
11fe0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11ff0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
12000 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a  [i].zName!=0 ){.
12010 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68        zSavedAuth
12020 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
12030 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
12040 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41        pParse->zA
12050 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61  uthContext = pTa
12060 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
12070 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e;.      needRes
12080 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b  toreContext = 1;
12090 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
120a0 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e    needRestoreCon
120b0 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  text = 0;.    }.
120c0 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
120d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
120e0 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  t->a[i].pSelect,
120f0 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20   SRT_TempTable, 
12100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12110 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
12120 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20  .iCursor, p, i, 
12130 26 69 73 41 67 67 29 3b 0a 20 20 20 20 69 66 28  &isAgg);.    if(
12140 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
12150 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
12160 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
12170 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
12180 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
12190 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
121a0 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
121b0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
121c0 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
121d0 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d  Union && eDest!=
121e0 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44  SRT_Except && eD
121f0 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64  est!=SRT_Discard
12200 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
12210 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f  ;.    }.    pGro
12230 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
12240 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20  By;.    pHaving 
12250 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
12260 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
12270 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
12280 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
12290 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
122a0 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  a subquery that 
122b0 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65  can be "flattene
122c0 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  d" into its pare
122d0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74  nt..  ** If flat
122e0 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73  tening is a poss
122f0 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e  iblity, do so an
12300 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
12310 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  tely.  .  */.  i
12320 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50  f( pParent && pP
12330 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20  arentAgg &&.    
12340 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72    flattenSubquer
12350 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e  y(pParse, pParen
12360 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70  t, parentTab, *p
12370 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67  ParentAgg, isAgg
12380 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41  ) ){.    if( isA
12390 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67  gg ) *pParentAgg
123a0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
123b0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
123c0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
123d0 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69    */.  computeLi
123e0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
123f0 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49  rse, p);..  /* I
12400 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
12410 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
12420 62 65 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 62  be using a callb
12430 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
12440 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
12450 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
12460 20 67 6f 69 6e 67 20 74 6f 20 61 20 64 65 73 74   going to a dest
12470 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 0a 20 20  ination other.  
12480 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c 6c 62 61  ** than a callba
12490 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  ck..  **.  ** We
124a0 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
124b0 20 73 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d   separately from
124c0 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
124d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
124e0 2a 2a 20 61 62 6f 76 65 20 62 65 63 61 75 73 65  ** above because
124f0 20 69 66 20 74 68 65 20 70 54 61 62 4c 69 73 74   if the pTabList
12500 20 63 6f 6e 74 61 69 6e 73 20 76 69 65 77 73 20   contains views 
12510 74 68 65 6e 20 74 68 65 79 20 77 69 6c 6c 20 6e  then they will n
12520 6f 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ot.  ** have bee
12530 6e 20 72 65 73 6f 6c 76 65 64 20 61 6e 64 20 77  n resolved and w
12540 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
12550 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  the column types
12560 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e 6f 77 2e   until.  ** now.
12570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
12580 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
12590 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
125a0 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
125b0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
125c0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
125d0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
125e0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
125f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
12600 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
12610 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
12620 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
12630 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
12640 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
12650 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
12660 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  0);.  }..  /* Do
12670 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
12680 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
12690 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  sions..  */.  sq
126a0 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
126b0 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
126c0 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70    if( isAgg || p
126d0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61  GroupBy ){.    a
126e0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
126f0 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73  Agg==0 );.    is
12700 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  Agg = 1;.    for
12710 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
12720 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12730 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
12740 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
12750 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  es(pParse, pELis
12760 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
12770 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
12780 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
12790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
127a0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
127b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
127c0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
127d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
127e0 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
127f0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
12800 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
12810 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
12820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
12830 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
12840 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12850 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
12860 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e   && sqliteExprAn
12870 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
12880 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29  pParse, pHaving)
12890 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
128a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
128b0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
128c0 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
128d0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
128e0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
128f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
12900 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
12910 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72  ates(pParse, pOr
12920 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
12930 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
12940 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12960 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12970 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  /* Reset the agg
12980 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69  regator.  */.  i
12990 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
129a0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
129b0 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20  v, OP_AggReset, 
129c0 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29  0, pParse->nAgg)
129d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
129e0 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
129f0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  ++){.      FuncD
12a00 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20  ef *pFunc;.     
12a10 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50   if( (pFunc = pP
12a20 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
12a30 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63  unc)!=0 && pFunc
12a40 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
12a50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12a60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12a70 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 29 3b 0a  AggInit, 0, i);.
12a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
12a90 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
12aa0 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20  , (char*)pFunc, 
12ab0 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
12ac0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12ad0 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
12ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
12af0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
12b00 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
12b10 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12b20 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75  Op(v, OP_AggFocu
12b30 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  s, 0, 0);.    }.
12b40 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
12b50 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
12b60 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a  cell to NULL.  *
12b70 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
12b80 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  RT_Mem ){.    sq
12b90 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12ba0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
12bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
12bc0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
12bd0 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
12be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
12bf0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
12c00 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
12c10 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
12c20 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73    */.  if( isDis
12c30 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73  tinct ){.    dis
12c40 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
12c50 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
12c60 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12c70 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74  P_OpenTemp, dist
12c80 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  inct, 1);.  }els
12c90 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
12ca0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
12cb0 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
12cc0 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70  se scan.  */.  p
12cd0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68  WInfo = sqliteWh
12ce0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
12cf0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
12d00 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20     pGroupBy ? 0 
12d30 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  : &pOrderBy);.  
12d40 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
12d50 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
12d60 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  ..  /* Use the s
12d70 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
12d80 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  op if we are not
12d90 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
12da0 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20  ** aggregates.  
12db0 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
12dc0 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  ){.    if( selec
12dd0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
12de0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
12df0 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
12e00 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f     iParm, pWInfo
12e30 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
12e40 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a  nfo->iBreak) ){.
12e50 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
12e60 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
12e70 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
12e80 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
12e90 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20  ggregates, then 
12ea0 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61  do the special a
12eb0 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72  ggregate.  ** pr
12ec0 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f  ocessing.  .  */
12ed0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28  .  else{.    if(
12ee0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
12ef0 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20     int lbl1;.   
12f00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
12f10 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
12f20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
12f30 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
12f40 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
12f50 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
12f60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
12f70 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
12f80 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79  akeKey, pGroupBy
12f90 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
12fa0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64     if( pParse->d
12fb0 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
12fc0 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79  4 ) sqliteAddKey
12fd0 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42 79  Type(v, pGroupBy
12fe0 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
12ff0 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
13000 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
13010 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13020 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
13030 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f   lbl1);.      fo
13040 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
13050 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
13060 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
13070 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
13080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13090 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
130a0 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  e(pParse, pParse
130b0 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29  ->aAgg[i].pExpr)
130c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
130d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
130e0 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20  AggSet, 0, i);. 
130f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13100 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
13110 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
13120 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
13130 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
13140 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
13150 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74  r *pE;.      int
13160 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   j;.      if( !p
13170 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
13180 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
13190 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61 72  .      pE = pPar
131a0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
131b0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
131c0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
131d0 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
131e0 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20    if( pE->pList 
131f0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
13200 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d  =0; j<pE->pList-
13210 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
13220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
13230 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13240 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  E->pList->a[j].p
13250 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
13260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13270 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
13280 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
13290 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
132a0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
132b0 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d  _AggFunc, 0, pE-
132c0 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69  >pList ? pE->pLi
132d0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
132e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
132f0 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
13300 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unc!=0 );.      
13310 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13320 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78  aAgg[i].pFunc->x
13330 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
13340 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
13350 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
13360 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  *)pParse->aAgg[i
13370 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e  ].pFunc, P3_POIN
13380 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TER);.    }.  }.
13390 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61  .  /* End the da
133a0 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
133b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57  ..  */.  sqliteW
133c0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
133d0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
133e0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
133f0 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20  egates, we need 
13400 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f  to set up a seco
13410 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65  nd loop.  ** ove
13420 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67  r all of the agg
13430 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e  regate values an
13440 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a  d process them..
13450 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
13460 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61   ){.    int enda
13470 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  gg = sqliteVdbeM
13480 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
13490 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20   int startagg;. 
134a0 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71     startagg = sq
134b0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
134c0 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
134d0 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61  endagg);.    pPa
134e0 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b  rse->useAgg = 1;
134f0 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
13500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13510 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
13520 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
13530 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
13540 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
13550 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
13560 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
13570 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
13580 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
135b0 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20  , endagg) ){.   
135c0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
135d0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
135e0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
135f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61   OP_Goto, 0, sta
13600 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  rtagg);.    sqli
13610 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
13620 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
13630 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13640 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
13650 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
13660 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20  ->useAgg = 0;.  
13670 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
13680 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
13690 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
136a0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
136b0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
136c0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
136d0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
136e0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
136f0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
13700 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
13710 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74  ail(p, v, pEList
13720 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
13730 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20  iParm);.  }...  
13740 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20  /* Issue a null 
13750 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74  callback if that
13760 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73 65   is what the use
13770 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  r wants..  */.  
13780 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
13790 61 6c 6c 62 61 63 6b 20 26 26 0a 20 20 20 20 28  allback &&.    (
137a0 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62  pParse->useCallb
137b0 61 63 6b 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ack==0 || (pPars
137c0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
137d0 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
137e0 63 6b 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20  ck)!=0).  ){.   
137f0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
13800 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62  (v, OP_NullCallb
13810 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ack, pEList->nEx
13820 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pr, 0);.  }..  /
13830 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20  * If this was a 
13840 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76  subquery, we hav
13850 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20  e now converted 
13860 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
13870 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  o a.  ** tempora
13880 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65  ry table.  So de
13890 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72  lete the subquer
138a0 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  y structure from
138b0 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
138c0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   to prevent this
138d0 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
138e0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
138f0 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
13900 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75  e the.  ** the u
13910 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  se of the tempor
13920 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ary table..  */.
13930 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
13940 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
13950 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  rent->pSrc->nSrc
13960 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20  >parentTab );.  
13970 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
13980 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
13990 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70  tTab].pSelect==p
139a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   );.    sqliteSe
139b0 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20  lectDelete(p);. 
139c0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
139d0 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
139e0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a  Select = 0;.  }.
139f0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
13a00 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
13a10 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
13a20 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
13a30 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
13a40 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
13a50 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
13a60 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
13a70 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
13a80 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
13a90 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
13aa0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
13ab0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
13ac0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
13ad0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71  select_end:.  sq
13ae0 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
13af0 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
13b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.