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

Artifact b5bc89a56d3d9162559bc173b7d5110f20249057:


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 34 39  select.c,v 1.149
0200: 20 32 30 30 34 2f 30 31 2f 32 34 20 32 30 3a 31   2004/01/24 20:1
0210: 38 3a 31 33 20 64 72 68 20 45 78 70 20 24 0a 2a  8:13 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 47 65 6e 65  ;.  }..  /* Gene
f890: 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66  rating code to f
f8a0: 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74  ind the min or t
f8b0: 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c  he max.  Basical
f8c0: 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20  ly all we have. 
f8d0: 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e   ** to do is fin
f8e0: 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74  d the first or t
f8f0: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
f900: 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65   the chosen inde
f910: 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20  x.  If.  ** the 
f920: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
f930: 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52  s on the INTEGER
f940: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
f950: 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  en find the firs
f960: 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65  t.  ** or last e
f970: 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e  ntry in the main
f980: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73   table..  */.  s
f990: 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79 53  qliteCodeVerifyS
f9a0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54  chema(pParse, pT
f9b0: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65  ab->iDb);.  base
f9c0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
f9d0: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70  .iCursor;.  comp
f9e0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
f9f0: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
fa00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fa10: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
fa20: 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Tab->iDb, 0);.  
fa30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fa40: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
fa50: 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  base, pTab->tnum
fa60: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43  );.  sqliteVdbeC
fa70: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
fa80: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
fa90: 54 41 54 49 43 29 3b 0a 20 20 63 6f 6e 74 20 3d  TATIC);.  cont =
faa0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
fab0: 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70  abel(v);.  if( p
fac0: 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Idx==0 ){.    sq
fad0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fae0: 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30   seekOp, base, 0
faf0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fb00: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fb10: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
fb20: 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Idx->iDb, 0);.  
fb30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fb40: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  p(v, OP_OpenRead
fb50: 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e  , base+1, pIdx->
fb60: 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  tnum);.    sqlit
fb70: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
fb80: 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
fb90: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
fba0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fbb0: 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
fbc0: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
fbd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fbe0: 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73  OP_IdxRecno, bas
fbf0: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
fc00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fc10: 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31  OP_Close, base+1
fc20: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fc30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fc40: 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29  MoveTo, base, 0)
fc50: 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45  ;.  }.  eList.nE
fc60: 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65  xpr = 1;.  memse
fc70: 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c  t(&eListItem, 0,
fc80: 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65   sizeof(eListIte
fc90: 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d  m));.  eList.a =
fca0: 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65   &eListItem;.  e
fcb0: 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20  List.a[0].pExpr 
fcc0: 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63  = pExpr;.  selec
fcd0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
fce0: 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c  e, p, &eList, 0,
fcf0: 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74   0, 0, -1, eDest
fd00: 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63  , iParm, cont, c
fd10: 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  ont);.  sqliteVd
fd20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
fd30: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
fd40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fd50: 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29  _Close, base, 0)
fd60: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
fd70: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
fd80: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76  code for the giv
fd90: 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
fda0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ent..**.** The r
fdb0: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72  esults are distr
fdc0: 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75  ibuted in variou
fdd0: 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67  s ways depending
fde0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   on the.** value
fdf0: 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50   of eDest and iP
fe00: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65  arm..**.**     e
fe10: 44 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20  Dest Value      
fe20: 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d   Result.**     -
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
fe70: 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20    SRT_Callback  
fe80: 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c    Invoke the cal
fe90: 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72  lback for each r
fea0: 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
feb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
fec0: 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72  Mem         Stor
fed0: 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69  e first result i
fee0: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50  n memory cell iP
fef0: 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
ff00: 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74  T_Set         St
ff10: 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b  ore results as k
ff20: 65 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77  eys of a table w
ff30: 69 74 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d  ith cursor iParm
ff40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
ff50: 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
ff60: 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
ff70: 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
ff80: 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
ff90: 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
ffa0: 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
ffb0: 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74  sults from the t
ffc0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
ffd0: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
ffe0: 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
fff0: 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
10000 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10010 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65   iParm.**.** The
10020 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20   table above is 
10030 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64  incomplete.  Add
10040 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61  itional eDist va
10050 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65  lue have be adde
10060 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20  d.** since this 
10070 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74  comment was writ
10080 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65  ten.  See the se
10090 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
100a0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  function for.** 
100b0 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69  a complete listi
100c0 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65  ng of the allowe
100d0 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73  d values of eDes
100e0 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e  t and their mean
100f0 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ings..**.** This
10100 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
10110 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
10120 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
10130 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
10140 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
10150 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
10160 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
10170 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
10180 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
10190 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
101a0 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
101b0 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
101c0 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
101d0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
101e0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
101f0 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   that..**.** The
10200 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
10210 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e  Tab, and *pParen
10220 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20  tAgg fields are 
10230 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69  filled in if thi
10240 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61  s.** SELECT is a
10250 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
10260 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79   routine may try
10270 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73   to combine this
10280 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
10290 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f  its parent to fo
102a0 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  rm a single flat
102b0 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64   query.  In so d
102c0 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a  oing, it might.*
102d0 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72  * change the par
102e0 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61  ent query from a
102f0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74   non-aggregate t
10300 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  o an aggregate q
10310 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61  uery..** For tha
10320 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50  t reason, the pP
10330 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73  arentAgg flag is
10340 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69   passed as a poi
10350 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63  nter, so it.** c
10360 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  an be changed..*
10370 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
10380 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
10390 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   the pParent par
103a0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ameter..**.**   
103b0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
103c0 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78  1 JOIN (SELECT x
103d0 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
103e0 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20  t2) JOIN t3;.** 
103f0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
10400 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10410 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
10420 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a  ___/        /.**
10430 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20       \          
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
10470 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
10480 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
10490 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
104a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a  ___________/.**.
104b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
104c0 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
104d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69  e outer query fi
104e0 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20  rst.   For that 
104f0 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74  call,.** pParent
10500 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20   will be NULL.  
10510 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65  During the proce
10520 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74  ssing of the out
10530 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a  er query, this .
10540 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
10550 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
10560 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73   to handle the s
10570 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68  ubquery.  For th
10580 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63  e recursive.** c
10590 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c  all, pParent wil
105a0 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f  l point to the o
105b0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63  uter query.  Bec
105c0 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72  ause the subquer
105d0 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f  y is.** the seco
105e0 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20  nd element in a 
105f0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20  three-way join, 
10600 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61  the parentTab pa
10610 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20  rameter will.** 
10620 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61  be 1 (the 2nd va
10630 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78  lue of a 0-index
10640 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e  ed array.).*/.in
10650 74 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a  t sqliteSelect(.
10660 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10680 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
10690 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
106a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
106b0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
106c0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
106d0 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
106e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
106f0 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
10700 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
10710 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
10720 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61           /* A pa
10730 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20  rameter used by 
10740 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73  the eDest dispos
10750 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53  al method */.  S
10760 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
10770 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
10780 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
10790 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
107a0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
107b0 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
107c0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
107d0 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
107e0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
107f0 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20  nt *pParentAgg  
10800 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10810 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
10820 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
10830 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
10840 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
10850 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
10860 0a 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30  .  int isAgg = 0
10870 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
10880 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
10890 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
108a0 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
108b0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
108c0 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
108d0 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
108e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
108f0 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
10900 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
10910 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
10920 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
10930 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
10940 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
10950 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
10960 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
10970 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
10980 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
10990 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
109a0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
109b0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
109c0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
109d0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
109e0 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
109f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
10a00 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
10a10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
10a20 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
10a30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10a40 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
10a50 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
10a60 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
10a70 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
10a80 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
10a90 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
10aa0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
10ab0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
10ac0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
10ad0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
10ae0 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71  ion */..  if( sq
10af0 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
10b00 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
10b10 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74  rr || p==0 ) ret
10b20 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
10b30 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
10b40 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
10b50 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
10b60 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49  eturn 1;..  /* I
10b70 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
10b80 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
10b90 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
10ba0 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
10bb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
10bc0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
10bd0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
10be0 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
10bf0 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20  , iParm);.  }.. 
10c00 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
10c10 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
10c20 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
10c30 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
10c40 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
10c50 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
10c60 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65  >pWhere;.  pOrde
10c70 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
10c80 79 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  y;.  pGroupBy = 
10c90 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
10ca0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
10cb0 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  ing;.  isDistinc
10cc0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
10cd0 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  t;..  /* Allocat
10ce0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 66  e VDBE cursors f
10cf0 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
10d00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
10d10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 53 72  .  */.  sqliteSr
10d20 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
10d30 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
10d40 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ist);..  /* .  *
10d50 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
10d60 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
10d70 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
10d80 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
10d90 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
10da0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
10db0 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
10dc0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
10dd0 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
10de0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78  ct_end;..  /* Ex
10df0 70 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72  pand any "*" ter
10e00 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ms in the result
10e10 20 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d   set.  (For exam
10e20 70 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20  ple the "*" in. 
10e30 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52   ** "SELECT * FR
10e40 4f 4d 20 74 31 22 29 20 20 54 68 65 20 66 69 6c  OM t1")  The fil
10e50 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20  lInColumnlist() 
10e60 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65  routine also doe
10e70 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65  s some.  ** othe
10e80 72 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d  r housekeeping -
10e90 20 73 65 65 20 74 68 65 20 68 65 61 64 65 72 20   see the header 
10ea0 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61  comment for deta
10eb0 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ils..  */.  if( 
10ec0 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
10ed0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
10ee0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10ef0 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65  nd;.  }.  pWhere
10f00 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
10f10 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
10f20 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
10f30 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
10f40 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
10f50 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
10f60 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
10f70 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
10f80 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
10f90 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
10fa0 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74   */.  if( (eDest
10fb0 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
10fc0 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
10fd0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
10fe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
10ff0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
11000 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
11010 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
11020 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
11030 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
11040 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
11050 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
11060 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
11070 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
11080 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
11090 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
110a0 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  */.  switch( eDe
110b0 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
110c0 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61  RT_Union:.    ca
110d0 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20  se SRT_Except:. 
110e0 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63     case SRT_Disc
110f0 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65  ard:.      pOrde
11100 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  rBy = 0;.      b
11110 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
11120 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t:.      break;.
11130 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
11140 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75  s point, we shou
11150 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65  ld have allocate
11160 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72  d all the cursor
11170 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e  s that we.  ** n
11180 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75  eed to handle su
11190 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70  bquerys and temp
111a0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a  orary tables.  .
111b0 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76    **.  ** Resolv
111c0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
111d0 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61  es and do a sema
111e0 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61  ntics check on a
111f0 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
11200 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
11210 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
11220 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
11230 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
11240 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
11250 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c  pTabList, 0, pEL
11260 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
11270 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
11280 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
11290 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
112a0 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
112b0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
112c0 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20  xpr, 1, &isAgg) 
112d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
112e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
112f0 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
11300 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
11310 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
11320 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
11330 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72  t, pEList, pWher
11340 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
11350 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11360 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
11370 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
11380 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29  e, pWhere, 0, 0)
11390 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
113a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
113b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69  .  }.  if( pHavi
113c0 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47  ng ){.    if( pG
113d0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
113e0 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
113f0 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
11400 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
11410 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
11420 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20  HAVING");.      
11430 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
11450 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
11460 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11470 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 48  List, pEList, pH
11480 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20  aving) ){.      
11490 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
114a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
114b0 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
114c0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
114d0 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20  1, &isAgg) ){.  
114e0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
114f0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  end;.    }.  }. 
11500 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
11510 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11520 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
11530 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11540 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70   iCol;.      Exp
11550 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
11560 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
11570 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
11580 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
11590 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30  &iCol) && iCol>0
115a0 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74   && iCol<=pEList
115b0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
115c0 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
115d0 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20  ete(pE);.       
115e0 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e   pE = pOrderBy->
115f0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
11600 69 74 65 45 78 70 72 44 75 70 28 70 45 4c 69 73  iteExprDup(pELis
11610 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
11620 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
11630 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11640 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
11650 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
11660 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
11670 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11680 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
11690 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
116a0 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
116b0 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
116c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
116d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
116e0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
116f0 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
11700 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (pE) ){.        
11710 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
11720 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
11730 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
11740 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
11750 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
11760 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
11770 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
11780 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
11790 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20  onstants");.    
117a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
117b0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
117c0 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30  else if( iCol<=0
117d0 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
117e0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
117f0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
11800 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
11810 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
11820 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
11830 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
11840 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
11850 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74              "bet
11860 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
11870 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
11880 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
11890 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
118a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
118b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
118c0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
118d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
118e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
118f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
11900 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20  Col;.      Expr 
11910 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  *pE = pGroupBy->
11920 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
11930 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11940 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
11950 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26  Col) && iCol>0 &
11960 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
11970 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
11980 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
11990 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70  e(pE);.        p
119a0 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
119b0 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
119c0 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  eExprDup(pEList-
119d0 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
119e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
119f0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
11a00 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
11a10 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
11a20 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  st, pE) ){.     
11a30 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11a40 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11a50 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11a60 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
11a70 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20  , isAgg, 0) ){. 
11a80 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
11a90 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
11aa0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11ab0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
11ac0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  E) ){.        if
11ad0 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  ( sqliteExprIsIn
11ae0 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
11af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11b00 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
11b10 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11b20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 74 65      "GROUP BY te
11b30 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  rms must not be 
11b40 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73  non-integer cons
11b50 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  tants");.       
11b60 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11b70 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
11b80 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
11b90 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
11ba0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
11bb0 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
11bc0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11bd0 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63       "GROUP BY c
11be0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20  olumn number %d 
11bf0 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
11c00 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
11c10 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
11c20 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c   1 and %d", iCol
11c30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
11c40 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
11c50 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
11c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11c70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
11c80 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
11c90 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
11ca0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
11cb0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
11cc0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
11cd0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  _end;..  /* Iden
11ce0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
11cf0 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
11d00 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20  using them in a 
11d10 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
11d20 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
11d30 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
11d40 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73  ut is going to s
11d50 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e  ome other destin
11d60 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ation..  */.  if
11d70 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
11d80 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
11d90 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
11da0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
11db0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
11dc0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
11dd0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
11de0 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   of a min() or m
11df0 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79  ax() function by
11e00 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20   itself.  ** in 
11e10 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
11e20 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c    */.  if( simpl
11e30 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61  eMinMaxQuery(pPa
11e40 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
11e50 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20  Parm) ){.    rc 
11e60 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 0;.    goto se
11e70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
11e80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
11e90 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
11ea0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
11eb0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
11ec0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
11ed0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
11ee0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11ef0 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
11f00 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  xt;.    int need
11f10 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a  RestoreContext;.
11f20 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
11f30 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d  t->a[i].pSelect=
11f40 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11f50 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
11f60 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29  >a[i].zName!=0 )
11f70 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75  {.      zSavedAu
11f80 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
11f90 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
11fa0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
11fb0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
11fc0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
11fd0 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52  ame;.      needR
11fe0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20  estoreContext = 
11ff0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
12000 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43      needRestoreC
12010 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ontext = 0;.    
12020 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  }.    sqliteSele
12030 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ct(pParse, pTabL
12040 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
12050 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t, SRT_TempTable
12060 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12070 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
12080 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69  i].iCursor, p, i
12090 2c 20 26 69 73 41 67 67 29 3b 0a 20 20 20 20 69  , &isAgg);.    i
120a0 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
120b0 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
120c0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
120d0 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
120e0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
120f0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
12100 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
12110 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
12120 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52     if( eDest!=SR
12130 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74  T_Union && eDest
12140 21 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20  !=SRT_Except && 
12150 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61  eDest!=SRT_Disca
12160 72 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  rd ){.      pOrd
12170 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
12180 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47  By;.    }.    pG
12190 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
121a0 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e  upBy;.    pHavin
121b0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
121c0 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
121d0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
121e0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
121f0 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69  to see if this i
12200 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61  s a subquery tha
12210 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65  t can be "flatte
12220 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61  ned" into its pa
12230 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c  rent..  ** If fl
12240 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f  attening is a po
12250 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20  ssiblity, do so 
12260 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
12270 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20  iately.  .  */. 
12280 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
12290 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20  pParentAgg &&.  
122a0 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75      flattenSubqu
122b0 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61 72  ery(pParse, pPar
122c0 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
122d0 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41  *pParentAgg, isA
122e0 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69  gg) ){.    if( i
122f0 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41  sAgg ) *pParentA
12300 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  gg = 1;.    retu
12310 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
12320 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
12330 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ..  */.  compute
12340 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
12350 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a  Parse, p);..  /*
12360 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
12370 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c   types if we wil
12380 6c 20 62 65 20 75 73 69 6e 67 20 61 20 63 61 6c  l be using a cal
12390 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
123a0 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
123b0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
123c0 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 64 65  is going to a de
123d0 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 0a  stination other.
123e0 20 20 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c 6c    ** than a call
123f0 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
12400 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
12410 69 73 20 73 65 70 61 72 61 74 65 6c 79 20 66 72  is separately fr
12420 6f 6d 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  om the creation 
12430 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  of column names.
12440 20 20 2a 2a 20 61 62 6f 76 65 20 62 65 63 61 75    ** above becau
12450 73 65 20 69 66 20 74 68 65 20 70 54 61 62 4c 69  se if the pTabLi
12460 73 74 20 63 6f 6e 74 61 69 6e 73 20 76 69 65 77  st contains view
12470 73 20 74 68 65 6e 20 74 68 65 79 20 77 69 6c 6c  s then they will
12480 20 6e 6f 74 0a 20 20 2a 2a 20 68 61 76 65 20 62   not.  ** have b
12490 65 65 6e 20 72 65 73 6f 6c 76 65 64 20 61 6e 64  een resolved and
124a0 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f   we will not kno
124b0 77 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  w the column typ
124c0 65 73 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e 6f  es until.  ** no
124d0 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  w..  */.  if( eD
124e0 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
124f0 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
12500 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
12510 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
12520 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
12530 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
12540 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
12550 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
12560 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
12570 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
12580 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
12590 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
125a0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
125b0 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d  _OpenTemp, iParm
125c0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
125d0 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
125e0 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  f aggregate expr
125f0 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
12600 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
12610 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
12620 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c  ;.  if( isAgg ||
12630 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
12640 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12650 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20  >nAgg==0 );.    
12660 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66  isAgg = 1;.    f
12670 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
12680 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12690 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
126a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
126b0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c  ates(pParse, pEL
126c0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
126d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
126e0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
126f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12700 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
12710 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12720 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
12730 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
12740 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  f( sqliteExprAna
12750 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
12760 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
12770 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
12780 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
12790 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
127a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
127b0 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
127c0 6e 67 20 26 26 20 73 71 6c 69 74 65 45 78 70 72  ng && sqliteExpr
127d0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
127e0 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  s(pParse, pHavin
127f0 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
12800 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12810 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65   }.    if( pOrde
12820 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  rBy ){.      for
12830 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
12840 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12850 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
12860 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
12870 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
12880 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
12890 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
128a0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
128b0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
128c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
128d0 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61    /* Reset the a
128e0 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20  ggregator.  */. 
128f0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
12900 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12910 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74  p(v, OP_AggReset
12920 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67  , 0, pParse->nAg
12930 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  g);.    for(i=0;
12940 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
12950 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e   i++){.      Fun
12960 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20  cDef *pFunc;.   
12970 20 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20     if( (pFunc = 
12980 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
12990 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75  pFunc)!=0 && pFu
129a0 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  nc->xFinalize!=0
129b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
129c0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
129d0 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 29  P_AggInit, 0, i)
129e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
129f0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
12a00 2d 31 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63  -1, (char*)pFunc
12a10 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
12a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12a30 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
12a40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12a50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12a60 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
12a70 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12a80 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f  ddOp(v, OP_AggFo
12a90 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cus, 0, 0);.    
12aa0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  }.  }..  /* Init
12ab0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
12ac0 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20  y cell to NULL. 
12ad0 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
12ae0 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20  =SRT_Mem ){.    
12af0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12b00 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
12b10 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
12b20 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
12b30 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20  emStore, iParm, 
12b40 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  1);.  }..  /* Op
12b50 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  en a temporary t
12b60 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
12b70 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
12b80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
12b90 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64  istinct ){.    d
12ba0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
12bb0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
12bc0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12bd0 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69   OP_OpenTemp, di
12be0 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65  stinct, 1);.  }e
12bf0 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
12c00 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
12c10 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
12c20 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
12c30 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
12c40 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
12c50 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
12c60 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ere, 0, .       
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20       pGroupBy ? 
12c90 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a  0 : &pOrderBy);.
12ca0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
12cb0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
12cc0 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  d;..  /* Use the
12cd0 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
12ce0 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e  loop if we are n
12cf0 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a  ot dealing with.
12d00 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a    ** aggregates.
12d10 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67    */.  if( !isAg
12d20 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c  g ){.    if( sel
12d30 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
12d40 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
12d50 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
12d60 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c  distinct, eDest,
12d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12d80 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e       iParm, pWIn
12d90 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
12da0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29  WInfo->iBreak) )
12db0 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  {.       goto se
12dc0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
12dd0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
12de0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
12df0 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68 65   aggregates, the
12e00 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c  n do the special
12e10 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20   aggregate.  ** 
12e20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20  processing.  .  
12e30 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69  */.  else{.    i
12e40 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
12e50 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20       int lbl1;. 
12e60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12e70 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
12e80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
12e90 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
12ea0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
12eb0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
12ec0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12ed0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12ee0 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70  _MakeKey, pGroup
12ef0 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  By->nExpr, 0);. 
12f00 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
12f10 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
12f20 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b  >=4 ) sqliteAddK
12f30 65 79 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70  eyType(v, pGroup
12f40 42 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20  By);.      lbl1 
12f50 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
12f60 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
12f70 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12f80 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20  v, OP_AggFocus, 
12f90 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20  0, lbl1);.      
12fa0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
12fb0 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
12fc0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
12fd0 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
12fe0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12ff0 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
13000 6f 64 65 28 70 50 61 72 73 65 2c 20 70 50 61 72  ode(pParse, pPar
13010 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
13020 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
13030 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13040 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b  P_AggSet, 0, i);
13050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13060 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
13070 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a  Label(v, lbl1);.
13080 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
13090 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
130a0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  g; i++){.      E
130b0 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
130c0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
130d0 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d  !pParse->aAgg[i]
130e0 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
130f0 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50  e;.      pE = pP
13100 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
13110 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
13120 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  t( pE->op==TK_AG
13130 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
13140 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73      if( pE->pLis
13150 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  t ){.        for
13160 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73  (j=0; j<pE->pLis
13170 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
13180 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13190 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
131a0 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d   pE->pList->a[j]
131b0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
131c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
131d0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
131e0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
131f0 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
13200 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
13210 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70  OP_AggFunc, 0, p
13220 45 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70  E->pList ? pE->p
13230 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
13240 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13250 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
13260 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20  pFunc!=0 );.    
13270 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
13280 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d  ->aAgg[i].pFunc-
13290 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20  >xStep!=0 );.   
132a0 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
132b0 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP3(v, -1, (ch
132c0 61 72 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67  ar*)pParse->aAgg
132d0 5b 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f  [i].pFunc, P3_PO
132e0 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  INTER);.    }.  
132f0 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  }..  /* End the 
13300 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
13310 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  op..  */.  sqlit
13320 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  eWhereEnd(pWInfo
13330 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  );..  /* If we a
13340 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  re processing ag
13350 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65  gregates, we nee
13360 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65  d to set up a se
13370 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f  cond loop.  ** o
13380 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ver all of the a
13390 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20  ggregate values 
133a0 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d  and process them
133b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  ..  */.  if( isA
133c0 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e  gg ){.    int en
133d0 64 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62  dagg = sqliteVdb
133e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
133f0 20 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b     int startagg;
13400 0a 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20  .    startagg = 
13410 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13420 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30  v, OP_AggNext, 0
13430 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70  , endagg);.    p
13440 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
13450 31 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  1;.    if( pHavi
13460 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
13470 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
13480 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73  arse, pHaving, s
13490 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20  tartagg, 1);.   
134a0 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63   }.    if( selec
134b0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
134c0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
134d0 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
134e0 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61     iParm, starta
13510 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20  gg, endagg) ){. 
13520 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
13530 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
13540 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13550 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
13560 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71  tartagg);.    sq
13570 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
13580 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b  abel(v, endagg);
13590 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
135a0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
135b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72   0, 0);.    pPar
135c0 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a  se->useAgg = 0;.
135d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
135e0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
135f0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
13600 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
13610 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
13620 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
13630 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
13640 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
13650 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
13660 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
13670 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69  tTail(p, v, pELi
13680 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
13690 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a  , iParm);.  }...
136a0 20 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c    /* Issue a nul
136b0 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  l callback if th
136c0 61 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75  at is what the u
136d0 73 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a  ser wants..  */.
136e0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
136f0 5f 43 61 6c 6c 62 61 63 6b 20 26 26 0a 20 20 20  _Callback &&.   
13700 20 28 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c   (pParse->useCal
13710 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20 28 70 50 61  lback==0 || (pPa
13720 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
13730 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c   SQLITE_NullCall
13740 62 61 63 6b 29 21 3d 30 29 0a 20 20 29 7b 0a 20  back)!=0).  ){. 
13750 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13760 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c  Op(v, OP_NullCal
13770 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e  lback, pEList->n
13780 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Expr, 0);.  }.. 
13790 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
137a0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
137b0 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
137c0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
137d0 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
137e0 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
137f0 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
13800 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
13810 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
13820 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
13830 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
13840 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
13850 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
13860 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
13870 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  lect_end:.  sqli
13880 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
13890 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20  eset(pParse);.  
138a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.