/ Hex Artifact Content
Login

Artifact 3b8eaf1a9585cbcf7a90bc9915b9b2f75ffe3921:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 35 36  select.c,v 1.156
0200: 20 32 30 30 34 2f 30 32 2f 31 36 20 30 33 3a 34   2004/02/16 03:4
0210: 34 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a 2a  4:02 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 66 6f 72   int i, j;.  for
4f70: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
4f80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
4f90: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
4fa0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
4fb0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
4fc0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   0;.    if( p==0
4fd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4fe0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
4ff0: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
5000: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
5010: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e   *pTab;.      in
5020: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
5030: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
5040: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
5050: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
5060: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
5070: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
5080: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
5090: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
50a0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
50b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
50c0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
50d0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
50e0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
50f0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
5100: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5110: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5120: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5130: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
5140: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
5150: 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  GER";.      }els
5160: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
5170: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
5180: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
5190: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
51a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
51b0: 70 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54  prType(p)==SQLIT
51c0: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
51d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
51e0: 58 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  XT";.      }else
51f0: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
5200: 3d 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20  = "NUMERIC";.   
5210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5220: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5230: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5240: 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i + pEList->nEx
5250: 70 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  pr, 0);.    sqli
5260: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5270: 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 30 29 3b  , -1, zType, 0);
5280: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
5290: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
52a0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
52b0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
52c0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
52d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
52e0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
52f0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
5300: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
5310: 5b 5d 20 76 61 6f 6c 75 65 73 20 69 6e 20 74 68  [] vaolues in th
5320: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
5330: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
5340: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
5350: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5360: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
5370: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
5380: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
5390: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
53a0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
53b0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
53c0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
53d0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
53e0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
53f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
5400: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
5410: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
5420: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
5430: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76  colNamesSet || v
5440: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  ==0 || sqlite_ma
5450: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
5460: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
5470: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
5480: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
5490: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
54a0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
54b0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20      char *zType 
54c0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 68 6f  = 0;.    int sho
54d0: 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  wFullNames;.    
54e0: 69 6e 74 20 70 32 20 3d 20 69 3d 3d 70 45 4c 69  int p2 = i==pELi
54f0: 73 74 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20  st->nExpr-1;.   
5500: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
5510: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
5520: 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   p==0 ) continue
5530: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
5540: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
5550: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
5560: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
5570: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
5580: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5590: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
55a0: 69 2c 20 70 32 29 3b 0a 20 20 20 20 20 20 73 71  i, p2);.      sq
55b0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
55c0: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
55d0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
55e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
55f0: 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 46 75 6c     }.    showFul
5600: 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72 73 65  lNames = (pParse
5610: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
5620: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
5630: 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 70  s)!=0;.    if( p
5640: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
5650: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
5660: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
5670: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
5680: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
5690: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
56a0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
56b0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
56c0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
56d0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
56e0: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
56f0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
5700: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
5710: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
5720: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
5730: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5740: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
5750: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
5760: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
5770: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
5780: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
5790: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
57a0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
57b0: 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b  Col = "_ROWID_";
57c0: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
57d0: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
57e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
57f0: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
5800: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
5810: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
5820: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5830: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a  .zType;.      }.
5840: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 70 61        if( p->spa
5850: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
5860: 5b 30 5d 20 26 26 20 21 73 68 6f 77 46 75 6c 6c  [0] && !showFull
5870: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
5880: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
5890: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50  teVdbeAddOp(v,OP
58a0: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
58b0: 70 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  p2);.        sql
58c0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
58d0: 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a  v, -1, p->span.z
58e0: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
58f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5900: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
5910: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 65   addr);.      }e
5920: 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74  lse if( pTabList
5930: 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 73 68 6f 77  ->nSrc>1 || show
5940: 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  FullNames ){.   
5950: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
5960: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
5970: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
5980: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
5990: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
59a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68  ;.        if( sh
59b0: 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  owFullNames || z
59c0: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
59d0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
59e0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
59f0: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61  ring(&zName, zTa
5a00: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29  b, ".", zCol, 0)
5a10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5a20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5a30: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70  ColumnName, i, p
5a40: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
5a50: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5a60: 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  , -1, zName, str
5a70: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
5a80: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
5a90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
5aa0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5ab0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5ac0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
5ad0: 2c 20 70 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , p2);.        s
5ae0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5af0: 33 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c 20 30  3(v, -1, zCol, 0
5b00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5b10: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
5b20: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
5b30: 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
5b40: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
5b50: 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75  eAddOp(v,OP_Colu
5b60: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 70 32 29 3b 0a  mnName, i, p2);.
5b70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5b80: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
5b90: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
5ba0: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  an.n);.      sql
5bb0: 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53  iteVdbeCompressS
5bc0: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
5bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5be0: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
5bf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
5c00: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
5c10: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
5c20: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
5c30: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
5c40: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
5c50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5c60: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
5c70: 69 2c 20 70 32 29 3b 0a 20 20 20 20 20 20 73 71  i, p2);.      sq
5c80: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5c90: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
5ca0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
5cb0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
5cc0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
5cd0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
5ce0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
5cf0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
5d00: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5d10: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
5d20: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
5d30: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
5d40: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
5d50: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
5d60: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
5d70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5d80: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
5d90: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
5da0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5db0: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
5dc0: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
5dd0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
5de0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
5df0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
5e00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5e10: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
5e20: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
5e30: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
5e40: 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  t fillInColumnLi
5e50: 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  st(Parse*, Selec
5e60: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t*);../*.** Give
5e70: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
5e80: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
5e90: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
5ea0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
5eb0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
5ec0: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
5ed0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
5ee0: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
5ef0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
5f00: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
5f10: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
5f20: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
5f30: 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ab;.  int i, j;.
5f40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5f50: 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43  st;.  Column *aC
5f60: 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49  ol;..  if( fillI
5f70: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72  nColumnList(pPar
5f80: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
5f90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5fa0: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
5fb0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5fc0: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
5fd0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
5fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
5ff0: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61  Tab->zName = zTa
6000: 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74  bName ? sqliteSt
6010: 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a  rDup(zTabName) :
6020: 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
6030: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
6040: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70    pTab->nCol = p
6050: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
6060: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
6070: 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  ol>0 );.  pTab->
6080: 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71  aCol = aCol = sq
6090: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
60a0: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
60b0: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
60c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
60d0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
60e0: 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b     Expr *p, *pR;
60f0: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
6100: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
6110: 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61       aCol[i].zNa
6120: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
6130: 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  p(pEList->a[i].z
6140: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
6150: 20 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d 3e   if( (p=pEList->
6160: 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 6f 70 3d  a[i].pExpr)->op=
6170: 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20  =TK_DOT .       
6180: 20 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70          && (pR=p
6190: 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20  ->pRight)!=0 && 
61a0: 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70  pR->token.z && p
61b0: 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b  R->token.z[0] ){
61c0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a  .      int cnt;.
61d0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
61e0: 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e  String(&aCol[i].
61f0: 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e  zName, pR->token
6200: 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c  .z, pR->token.n,
6210: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a   0);.      for(j
6220: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
6230: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
6240: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 61 43 6f  qliteStrICmp(aCo
6250: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6f 6c  l[j].zName, aCol
6260: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
6270: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
6280: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
6290: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20   zBuf[30];.     
62a0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
62b0: 66 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74 29 3b 0a  f,"_%d",++cnt);.
62c0: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74            n = st
62d0: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
62e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
62f0: 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b 69 5d 2e  String(&aCol[i].
6300: 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f 6b 65 6e  zName, pR->token
6310: 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e 2e 6e 2c  .z, pR->token.n,
6320: 20 7a 42 75 66 2c 20 6e 2c 30 29 3b 0a 20 20 20   zBuf, n,0);.   
6330: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
6340: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6350: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
6360: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
6370: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
6380: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
6390: 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  ng(&pTab->aCol[i
63a0: 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e  ].zName, p->span
63b0: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30  .z, p->span.n, 0
63c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
63d0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
63e0: 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ];.      sprintf
63f0: 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64  (zBuf, "column%d
6400: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70  ", i+1);.      p
6410: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
6420: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
6430: 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  p(zBuf);.    }. 
6440: 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79   }.  pTab->iPKey
6450: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
6460: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pTab;.}../*.** F
6470: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
6480: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 64  ECT statement, d
6490: 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73 2e 0a  o three things..
64a0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46 69  **.**    (1)  Fi
64b0: 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
64c0: 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
64d0: 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
64e0: 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
64f0: 20 20 20 20 64 65 66 69 6e 65 73 20 74 68 65 20      defines the 
6500: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
6510: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63 61  at should be sca
6520: 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69 65 77 73  nned.  For views
6530: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
6540: 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
6550: 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
6560: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
6570: 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
6580: 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
6590: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
65a0: 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
65b0: 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
65c0: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
65d0: 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
65e0: 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
65f0: 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
6600: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
6610: 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
6620: 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
6630: 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
6640: 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
6650: 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
6660: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
6670: 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  ew..**.**    (2)
6680: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
6690: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
66a0: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
66b0: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
66c0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
66d0: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
66e0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
66f0: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
6700: 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74  *    (3)  Scan t
6710: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
6720: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
6730: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
6740: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
6750: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
6760: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
6770: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
6780: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
6790: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
67a0: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
67b0: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
67c0: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
67d0: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
67e0: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
67f0: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
6800: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
6810: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
6820: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
6830: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
6840: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6850: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
6860: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
6870: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
6880: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
6890: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
68a0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
68b0: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
68c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
68d0: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
68e0: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
68f0: 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70   *pTab;..  if( p
6900: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
6910: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
6920: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
6930: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
6940: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
6950: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
6960: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
6970: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f   list..  */.  fo
6980: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
6990: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
69a0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
69b0: 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20  >a[i].pTab ){.  
69c0: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
69d0: 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
69e0: 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  re!  No need to 
69f0: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20  continue */.    
6a00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6a10: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  }.    if( pTabLi
6a20: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
6a30: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
6a40: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
6a50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
6a60: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
6a70: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
6a80: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6a90: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
6aa0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6ab0: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
6ac0: 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e       char zFakeN
6ad0: 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20  ame[60];.       
6ae0: 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61   sprintf(zFakeNa
6af0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  me, "sqlite_subq
6b00: 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20  uery_%p_",.     
6b10: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61        (void*)pTa
6b20: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6b30: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ect);.        sq
6b40: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
6b50: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
6b60: 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c  lias, zFakeName,
6b70: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
6b80: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6b90: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
6ba0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52  .        sqliteR
6bb0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
6bc0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
6bd0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a  t->a[i].zAlias,.
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
6c10: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
6c20: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
6c30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
6c40: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
6c50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54        /* The isT
6c60: 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e  ransient flag in
6c70: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
6c80: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
6c90: 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
6ca0: 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  ** dynamically a
6cb0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79  llocated and may
6cc0: 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79   be freed at any
6cd0: 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72   time.  In other
6ce0: 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a   words,.      **
6cf0: 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69   pTab is not poi
6d00: 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69  nting to a persi
6d10: 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  stent table stru
6d20: 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e  cture that defin
6d30: 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74  es.      ** part
6d40: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20   of the schema. 
6d50: 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  */.      pTab->i
6d60: 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a  sTransient = 1;.
6d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d80: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
6d90: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
6da0: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
6db0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70  lause */.      p
6dc0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
6dd0: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
6de0: 20 20 20 20 20 73 71 6c 69 74 65 4c 6f 63 61 74       sqliteLocat
6df0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 54  eTable(pParse,pT
6e00: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
6e10: 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  me,pTabList->a[i
6e20: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
6e30: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
6e40: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6e50: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
6e60: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
6e70: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
6e80: 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
6e90: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
6ea0: 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
6eb0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
6ec0: 20 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77    if( sqliteView
6ed0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
6ee0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
6ef0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6f00: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
6f10: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 61 62        /* If pTab
6f20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6f30: 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77  ct!=0 it means w
6f40: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
6f50: 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  th a.        ** 
6f60: 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69  view within a vi
6f70: 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  ew.  The SELECT 
6f80: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c  structure has al
6f90: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20  ready been.     
6fa0: 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20     ** copied by 
6fb0: 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73  the outer view s
6fc0: 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68  o we can skip th
6fd0: 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65  e copy step here
6fe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
6ff0: 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20  he inner view.. 
7000: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7010: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
7020: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[i].pSelect==0 
7030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
7040: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
7050: 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65  ect = sqliteSele
7060: 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c  ctDup(pTab->pSel
7070: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
7080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7090: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
70a0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
70b0: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
70c0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
70d0: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
70e0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
70f0: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
7100: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
7110: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
7120: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
7130: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
7140: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
7150: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
7160: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
7170: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
7180: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
7190: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
71a0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
71b0: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
71c0: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
71d0: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
71e0: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
71f0: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
7200: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
7210: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
7220: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
7230: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
7240: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
7250: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
7260: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
7270: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
7280: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
7290: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
72a0: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
72b0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
72c0: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
72d0: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
72e0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
72f0: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
7300: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
7310: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
7320: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
7330: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
7340: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
7350: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
7360: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
7370: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
7380: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
7390: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
73a0: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
73b0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
73c0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
73d0: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
73e0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
73f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
7400: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
7410: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
7420: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
7430: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
7440: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
7450: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
7460: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
7470: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
7480: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
7490: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
74a0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
74b0: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
74c0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
74d0: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
74e0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
74f0: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
7500: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
7510: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
7520: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
7530: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
7540: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
7550: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
7560: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
7570: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
7580: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
7590: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
75a0: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
75b0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
75c0: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
75d0: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
75e0: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
75f0: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
7600: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
7610: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
7620: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
7630: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78   pNew = sqliteEx
7640: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
7650: 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30  w, a[k].pExpr, 0
7660: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
7670: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
7680: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
7690: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b  Name;.        a[
76a0: 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
76b0: 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
76c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
76d0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
76e0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
76f0: 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
7700: 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
7710: 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
7720: 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
7730: 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
7740: 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
7750: 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
7760: 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
7770: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
7780: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
7790: 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
77a0: 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
77b0: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
77c0: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c  TK_DOT && pE->pL
77d0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
77e0: 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c   pName = &pE->pL
77f0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
7800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7810: 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a       pName = 0;.
7820: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7830: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
7840: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
7850: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
7860: 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c  le *pTab = pTabL
7870: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a  ist->a[i].pTab;.
7880: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7890: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c  zTabName = pTabL
78a0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
78b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
78c0: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
78d0: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
78e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
78f0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
7900: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7910: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7920: 70 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  pName && (zTabNa
7930: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
7940: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7960: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d  iteStrNICmp(pNam
7970: 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  e->z, zTabName, 
7980: 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a  pName->n)!=0 ||.
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d   zTabName[pName-
79b0: 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  >n]!=0) ){.     
79c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
79d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79e0: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
79f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
7a00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
7a10: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
7a20: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7a30: 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70  Expr, *pLeft, *p
7a40: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
7a50: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
7a60: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
7a70: 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20  Name;..         
7a80: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 28 70     if( i>0 && (p
7a90: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7aa0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
7ab0: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
7ad0: 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
7ae0: 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20  t->a[i-1].pTab, 
7af0: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
7b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7b10: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
7b20: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
7b30: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
7b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
7b50: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
7b60: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
7b70: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7b90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
7ba0: 30 20 26 26 20 73 71 6c 69 74 65 49 64 4c 69 73  0 && sqliteIdLis
7bb0: 74 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d  tIndex(pTabList-
7bc0: 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20  >a[i-1].pUsing, 
7bd0: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
7be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7bf0: 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
7c00: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
7c10: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
7c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
7c30: 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
7c40: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
7c50: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7c70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7c80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7c90: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
7ca0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
7cb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7cc0: 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20    if( pRight==0 
7cd0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
7ce0: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7cf0: 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  en.z = zName;.  
7d00: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
7d10: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c  ->token.n = strl
7d20: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  en(zName);.     
7d30: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
7d40: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
7d50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
7d60: 61 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69  abName && pTabLi
7d70: 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
7d90: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
7da0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
7dc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
7dd0: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
7de0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7df0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
7e00: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
7e20: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  eft->token.z = z
7e30: 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  TabName;.       
7e40: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
7e50: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
7e60: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
7e70: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
7e80: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7ea0: 74 65 53 65 74 53 74 72 69 6e 67 28 28 63 68 61  teSetString((cha
7eb0: 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e  r**)&pExpr->span
7ec0: 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e  .z, zTabName, ".
7ed0: 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", zName, 0);.  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7ef0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c  r->span.n = strl
7f00: 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  en(pExpr->span.z
7f10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7f20: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
7f30: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
7f40: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
7f50: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .z = 0;.        
7f60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
7f70: 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.n = 0;.      
7f80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
7f90: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
7fa0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
7fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7fc0: 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
7fe0: 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72  pr->span = pExpr
7ff0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
8000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8010: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
8020: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
8030: 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  New, pExpr, 0);.
8040: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8050: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8060: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
8070: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
8080: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
8090: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
80a0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
80b0: 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70  ch table: %T", p
80c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
80d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
80e0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
80f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
8100: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
8110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8120: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
8130: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8140: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8150: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
8160: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
8170: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
8180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
81a0: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
81b0: 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  ely unlinks the 
81c0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
81d0: 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  pTab pointers.**
81e0: 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72   in a select str
81f0: 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74  ucture.  It just
8200: 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65   sets the pointe
8210: 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  rs to NULL.  Thi
8220: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
8230: 72 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65  recursive in the
8240: 20 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74   sense that if t
8250: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
8260: 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f  [].pSelect.** po
8270: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
8280: 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  L, this routine 
8290: 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
82a0: 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f  ively on that po
82b0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
82c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
82d0: 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63  led on the Selec
82e0: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
82f0: 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49   defines a.** VI
8300: 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75  EW in order to u
8310: 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73  ndo any bindings
8320: 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69   to tables.  Thi
8330: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a  s is necessary.*
8340: 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  * because those 
8350: 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20  tables might be 
8360: 44 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73  DROPed by a subs
8370: 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61  equent SQL comma
8380: 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69  nd..** If the bi
8390: 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72  ndings are not r
83a0: 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65  emoved, then the
83b0: 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b   Select.pSrc->a[
83c0: 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20  ].pTab field.** 
83d0: 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
83e0: 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c  nting to a deall
83f0: 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72  ocated Table str
8400: 75 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65  ucture after the
8410: 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63  .** DROP and a c
8420: 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63  oredump will occ
8430: 75 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ur the next time
8440: 20 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65   the VIEW is use
8450: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8460: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65  eSelectUnbind(Se
8470: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
8480: 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  i;.  SrcList *pS
8490: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
84a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
84b0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
84c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
84d0: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
84e0: 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d  .    if( (pTab =
84f0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62   pSrc->a[i].pTab
8500: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
8510: 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ( pTab->isTransi
8520: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ent ){.        s
8530: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
8540: 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  (0, pTab);.     
8550: 20 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61   }.      pSrc->a
8560: 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20  [i].pTab = 0;.  
8570: 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
8580: 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  i].pSelect ){.  
8590: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65        sqliteSele
85a0: 63 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61  ctUnbind(pSrc->a
85b0: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
85c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
85d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
85e0: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
85f0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
8600: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
8610: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
8620: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
8630: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
8640: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
8650: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
8660: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
8670: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
8680: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
8690: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
86a0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
86b0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
86c0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
86d0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
86e0: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
86f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
8700: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
8710: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
8720: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
8730: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
8740: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
8750: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
8760: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
8770: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
8780: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
8790: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
87a0: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
87b0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
87c0: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
87d0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
87e0: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
87f0: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
8800: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
8810: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
8820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
8830: 73 20 4e 4f 54 20 63 6f 72 72 65 63 74 6c 79 20  s NOT correctly 
8840: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 45  initialize the E
8850: 78 70 72 2e 64 61 74 61 54 79 70 65 20 20 66 69  xpr.dataType  fi
8860: 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 52  eld.** of the OR
8870: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8880: 6e 73 2e 20 20 54 68 65 20 6d 75 6c 74 69 53 65  ns.  The multiSe
8890: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 29 20  lectSortOrder() 
88a0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
88b0: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  be called to do 
88c0: 74 68 61 74 20 61 66 74 65 72 20 74 68 65 20 69  that after the i
88d0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
88e0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68   statements.** h
88f0: 61 76 65 20 61 6c 6c 20 62 65 65 6e 20 61 6e 61  ave all been ana
8900: 6c 79 7a 65 64 2e 20 20 54 68 69 73 20 72 6f 75  lyzed.  This rou
8910: 74 69 6e 65 20 69 73 20 75 6e 61 62 6c 65 20 74  tine is unable t
8920: 6f 20 63 6f 6d 70 75 74 65 20 45 78 70 72 2e 64  o compute Expr.d
8930: 61 74 61 54 79 70 65 0a 2a 2a 20 62 65 63 61 75  ataType.** becau
8940: 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  se it must be ca
8950: 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  lled before the 
8960: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
8970: 74 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  t statements.** 
8980: 68 61 76 65 20 62 65 65 6e 20 61 6e 61 6c 79 7a  have been analyz
8990: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
89a0: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
89b0: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
89c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
89d0: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
89e0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
89f0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
8a00: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
8a10: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
8a20: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
8a30: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
8a40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
8a50: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
8a60: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
8a70: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
8a80: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
8a90: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
8aa0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
8ab0: 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54  this value in iT
8ac0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
8ad0: 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20  stComplete      
8ae0: 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c    /* If TRUE all
8af0: 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20   ORDER BYs must 
8b00: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
8b10: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e  t nErr = 0;.  in
8b20: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
8b30: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
8b40: 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  f( pSelect==0 ||
8b50: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
8b60: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d  eturn 1;.  if( m
8b70: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
8b80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
8b90: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8ba0: 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61  ++){ pOrderBy->a
8bb0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a  [i].done = 0; }.
8bc0: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e    }.  if( fillIn
8bd0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
8be0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
8bf0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
8c00: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
8c10: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
8c20: 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  ( matchOrderbyTo
8c30: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
8c40: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20  Select->pPrior, 
8c50: 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
8c60: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
8c70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
8c80: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
8c90: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
8ca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
8cb0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
8cc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
8cd0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
8ce0: 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69  pExpr;.    int i
8cf0: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Col = -1;.    if
8d00: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
8d10: 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  .done ) continue
8d20: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
8d30: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
8d40: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
8d50: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
8d60: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
8d70: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
8d80: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
8d90: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
8da0: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
8db0: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
8dc0: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
8dd0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
8de0: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
8df0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
8e00: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
8e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8e20: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
8e30: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8e40: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
8e50: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
8e60: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
8e70: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
8e80: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
8e90: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
8ea0: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
8eb0: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
8ec0: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
8ed0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
8ee0: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
8ef0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
8f00: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
8f10: 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74 6f    assert( pE->to
8f20: 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20  ken.z );.       
8f30: 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65   zLabel = sqlite
8f40: 53 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65  StrNDup(pE->toke
8f50: 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pE->token.n
8f60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8f70: 65 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29  eDequote(zLabel)
8f80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
8f90: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d  liteStrICmp(zNam
8fa0: 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b  e, zLabel)==0 ){
8fb0: 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c   .          iCol
8fc0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
8fd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
8fe0: 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ee(zLabel);.    
8ff0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
9000: 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 45 78  ol<0 && sqliteEx
9010: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45  prCompare(pE, pE
9020: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
9030: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
9040: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  l = j;.      }. 
9050: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
9060: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  l>=0 ){.      pE
9070: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
9080: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c  ;.      pE->iCol
9090: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
90a0: 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pE->iTable = i
90b0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72  Table;.      pOr
90c0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
90d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
90e0: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75  if( iCol<0 && mu
90f0: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
9100: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
9110: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
9120: 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72     "ORDER BY ter
9130: 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73  m number %d does
9140: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72   not match any r
9150: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69  esult column", i
9160: 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  +1);.      nErr+
9170: 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
9180: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9190: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
91a0: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
91b0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
91c0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
91d0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
91e0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
91f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9200: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
9210: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
9220: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
9230: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65  /.Vdbe *sqliteGe
9240: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
9250: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
9260: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9270: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
9280: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
9290: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62  Vdbe = sqliteVdb
92a0: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
92b0: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
92c0: 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n v;.}../*.** Th
92d0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
92e0: 74 68 65 20 45 78 70 72 2e 64 61 74 61 54 79 70  the Expr.dataTyp
92f0: 65 20 66 69 65 6c 64 20 6f 6e 20 61 6c 6c 20 65  e field on all e
9300: 6c 65 6d 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68  lements of.** th
9310: 65 20 70 4f 72 64 65 72 42 79 20 65 78 70 72 65  e pOrderBy expre
9320: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
9330: 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 77   pOrderBy list w
9340: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ill have been.**
9350: 20 73 65 74 20 75 70 20 62 79 20 6d 61 74 63 68   set up by match
9360: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
9370: 29 2e 20 20 48 65 6e 63 65 20 65 61 63 68 20 65  ).  Hence each e
9380: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 0a 2a 2a  xpression has.**
9390: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 73 20   a TK_COLUMN as 
93a0: 69 74 73 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 20  its root node.  
93b0: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
93c0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 0a 2a 2a   refers to a .**
93d0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
93e0: 65 73 75 6c 74 20 73 65 74 2e 20 20 20 54 68 65  esult set.   The
93f0: 20 64 61 74 61 74 79 70 65 20 69 73 20 73 65 74   datatype is set
9400: 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45   to SQLITE_SO_TE
9410: 58 54 0a 2a 2a 20 69 66 20 74 68 65 20 63 6f 72  XT.** if the cor
9420: 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
9430: 6e 20 69 6e 20 70 20 61 6e 64 20 65 76 65 72 79  n in p and every
9440: 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 6c   SELECT to the l
9450: 65 66 74 20 6f 66 0a 2a 2a 20 70 20 68 61 73 20  eft of.** p has 
9460: 61 20 64 61 74 61 74 79 70 65 20 6f 66 20 53 51  a datatype of SQ
9470: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 2e 20 20 49  LITE_SO_TEXT.  I
9480: 66 20 74 68 65 20 63 6f 6f 72 65 73 73 70 6f 6e  f the cooresspon
9490: 64 69 6e 67 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69  ding column.** i
94a0: 6e 20 70 20 6f 72 20 61 6e 79 20 6f 66 20 74 68  n p or any of th
94b0: 65 20 6c 65 66 74 20 53 45 4c 45 43 54 73 20 69  e left SELECTs i
94c0: 73 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2c  s SQLITE_SO_NUM,
94d0: 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 74 79   then the dataty
94e0: 70 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 72 64  pe.** of the ord
94f0: 65 72 2d 62 79 20 65 78 70 72 65 73 73 69 6f 6e  er-by expression
9500: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
9510: 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20  E_SO_NUM..**.** 
9520: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
9530: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9540: 20 6f 6e 65 28 61 20 49 4e 54 45 47 45 52 2c 20   one(a INTEGER, 
9550: 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20 20  b TEXT);.**     
9560: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f  CREATE TABLE two
9570: 28 63 20 56 41 52 43 48 41 52 28 35 29 2c 20 64  (c VARCHAR(5), d
9580: 20 46 4c 4f 41 54 29 3b 0a 2a 2a 0a 2a 2a 20 20   FLOAT);.**.**  
9590: 20 20 20 53 45 4c 45 43 54 20 62 2c 20 62 20 46     SELECT b, b F
95a0: 52 4f 4d 20 6f 6e 65 20 55 4e 49 4f 4e 20 53 45  ROM one UNION SE
95b0: 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 74  LECT d, c FROM t
95c0: 77 6f 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32  wo ORDER BY 1, 2
95d0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 69 6d  ;.**.** The prim
95e0: 61 72 79 20 73 6f 72 74 20 6b 65 79 20 77 69 6c  ary sort key wil
95f0: 6c 20 75 73 65 20 53 51 4c 49 54 45 5f 53 4f 5f  l use SQLITE_SO_
9600: 4e 55 4d 20 62 65 63 61 75 73 65 20 74 68 65 20  NUM because the 
9610: 22 64 22 20 69 6e 0a 2a 2a 20 74 68 65 20 73 65  "d" in.** the se
9620: 63 6f 6e 64 20 53 45 4c 45 43 54 20 69 73 20 6e  cond SELECT is n
9630: 75 6d 65 72 69 63 2e 20 20 54 68 65 20 31 73 74  umeric.  The 1st
9640: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
9650: 69 72 73 74 20 53 45 4c 45 43 54 0a 2a 2a 20 69  irst SELECT.** i
9660: 73 20 74 65 78 74 20 62 75 74 20 74 68 61 74 20  s text but that 
9670: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20  does not matter 
9680: 62 65 63 61 75 73 65 20 61 20 6e 75 6d 65 72 69  because a numeri
9690: 63 20 61 6c 77 61 79 73 20 6f 76 65 72 72 69 64  c always overrid
96a0: 65 73 0a 2a 2a 20 61 20 74 65 78 74 2e 0a 2a 2a  es.** a text..**
96b0: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 61 72  .** The secondar
96c0: 79 20 6b 65 79 20 77 69 6c 6c 20 75 73 65 20 74  y key will use t
96d0: 68 65 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  he SQLITE_SO_TEX
96e0: 54 20 73 6f 72 74 20 6f 72 64 65 72 20 62 65 63  T sort order bec
96f0: 61 75 73 65 0a 2a 2a 20 62 6f 74 68 20 74 68 65  ause.** both the
9700: 20 28 73 65 63 6f 6e 64 29 20 22 62 22 20 69 6e   (second) "b" in
9710: 20 74 68 65 20 66 69 72 73 74 20 53 45 4c 45 43   the first SELEC
9720: 54 20 61 6e 64 20 74 68 65 20 22 63 22 20 69 6e  T and the "c" in
9730: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 53   the second.** S
9740: 45 4c 45 43 54 20 68 61 76 65 20 61 20 64 61 74  ELECT have a dat
9750: 61 74 79 70 65 20 6f 66 20 74 65 78 74 2e 0a 2a  atype of text..*
9760: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  / .static void m
9770: 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72  ultiSelectSortOr
9780: 64 65 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 45  der(Select *p, E
9790: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
97a0: 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  y){.  int i;.  E
97b0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
97c0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
97d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
97e0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( p==0 ){.    f
97f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
9800: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
9810: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
9820: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 64 61 74  >a[i].pExpr->dat
9830: 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53  aType = SQLITE_S
9840: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  O_TEXT;.    }.  
9850: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9860: 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f  multiSelectSortO
9870: 72 64 65 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20  rder(p->pPrior, 
9880: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 45 4c  pOrderBy);.  pEL
9890: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
98a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
98b0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
98c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
98d0: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
98e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
98f0: 28 20 70 45 2d 3e 64 61 74 61 54 79 70 65 3d 3d  ( pE->dataType==
9900: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 20  SQLITE_SO_NUM ) 
9910: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
9920: 73 65 72 74 28 20 70 45 2d 3e 69 43 6f 6c 75 6d  sert( pE->iColum
9930: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  n>=0 );.    if( 
9940: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 70 45  pEList->nExpr>pE
9950: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
9960: 20 20 20 70 45 2d 3e 64 61 74 61 54 79 70 65 20     pE->dataType 
9970: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
9980: 28 70 45 4c 69 73 74 2d 3e 61 5b 70 45 2d 3e 69  (pEList->a[pE->i
9990: 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 29 3b 0a  Column].pExpr);.
99a0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
99b0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
99c0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
99d0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
99e0: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
99f0: 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74 20 61 6e  the.** nLimit an
9a00: 64 20 6e 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d nOffset fields
9a10: 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f  .  nLimit and nO
9a20: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 69  ffset hold the i
9a30: 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68 61 74 20  ntegers.** that 
9a40: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
9a50: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
9a60: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
9a70: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
9a80: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
9a90: 20 74 68 61 74 20 68 6f 6c 64 20 2d 31 20 61 6e   that hold -1 an
9aa0: 64 20 30 20 69 66 20 74 68 6f 73 65 20 6b 65 79  d 0 if those key
9ab0: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
9ac0: 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  d..** iLimit and
9ad0: 20 69 4f 66 66 73 65 74 20 61 72 65 20 74 68 65   iOffset are the
9ae0: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
9af0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
9b00: 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74 65 72 73   for.** counters
9b10: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
9b20: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
9b30: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
9b40: 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d 69 74 20   is no.** limit 
9b50: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
9b60: 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  hen iLimit and i
9b70: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
9b80: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
9b90: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
9ba0: 74 68 65 20 76 61 6c 75 65 73 20 69 66 20 69 4c  the values if iL
9bb0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
9bc0: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
9bd0: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
9be0: 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c 69 6d   defined by nLim
9bf0: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e 20  it and nOffset. 
9c00: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
9c10: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
9c20: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
9c30: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
9c40: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
9c50: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
9c60: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
9c70: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
9c80: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
9c90: 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30 20  ly if nLimit>=0 
9ca0: 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f 20  or nOffset>0 do 
9cb0: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
9cc0: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
9cd0: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
9ce0: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
9cf0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
9d00: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
9d10: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
9d20: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
9d30: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
9d40: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
9d50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9d60: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
9d70: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
9d80: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
9d90: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
9da0: 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 49  p){.  /* .  ** I
9db0: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
9dc0: 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74 3e 30 20   is p->nLimit>0 
9dd0: 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73  then "LIMIT 0" s
9de0: 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c 20 72 6f  hows.  ** all ro
9df0: 77 73 2e 20 20 49 74 20 69 73 20 74 68 65 20 73  ws.  It is the s
9e00: 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d 69 74 2e  ame as no limit.
9e10: 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   If the comparis
9e20: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70 2d 3e 6e  ion is.  ** p->n
9e30: 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e 20 22 4c  Limit>=0 then "L
9e40: 49 4d 49 54 20 30 22 20 73 68 6f 77 20 6e 6f 20  IMIT 0" show no 
9e50: 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a 20 20 2a  rows at all..  *
9e60: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
9e70: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
9e80: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
9e90: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65  me.  ** contrave
9ea0: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
9eb0: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
9ec0: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
9ed0: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
9ee0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
9ef0: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
9f00: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
9f10: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
9f20: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d   if( p->nLimit>=
9f30: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65  0 ){.    int iMe
9f40: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
9f50: 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  ++;.    Vdbe *v 
9f60: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
9f70: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
9f80: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
9f90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9fa0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9fb0: 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30  r, -p->nLimit, 0
9fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
9fd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
9fe0: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b  Store, iMem, 1);
9ff0: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
a000: 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28   iMem;.  }.  if(
a010: 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b   p->nOffset>0 ){
a020: 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
a030: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
a040: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
a050: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
a060: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
a070: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a080: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a090: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
a0a0: 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->nOffset, 0);.
a0b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a0c0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
a0d0: 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  re, iMem, 1);.  
a0e0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
a0f0: 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Mem;.  }.}../*.*
a100: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a110: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
a120: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
a130: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
a140: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
a150: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
a160: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
a170: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
a180: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
a190: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
a1a0: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
a1b0: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
a1c0: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
a1d0: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
a1e0: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
a1f0: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
a200: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
a210: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
a220: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
a230: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
a240: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
a250: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
a260: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
a270: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
a280: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
a290: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
a2a0: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
a2b0: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
a2c0: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
a2d0: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
a2e0: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
a2f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
a300: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
a310: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
a320: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
a330: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
a340: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
a350: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
a360: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a370: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
a380: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
a390: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
a3a0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
a3b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a3c0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
a3d0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
a3e0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
a3f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
a400: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
a410: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
a420: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
a430: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
a440: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
a450: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
a460: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
a470: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
a480: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
a490: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
a4a0: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
a4b0: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
a4c0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
a4d0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
a4e0: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
a4f0: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
a500: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
a510: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
a520: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
a530: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a540: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
a550: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 50  nt multiSelect(P
a560: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a570: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
a580: 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
a590: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a5a0: 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73        /* Success
a5b0: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
a5c0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
a5d0: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
a5e0: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
a5f0: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
a600: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
a610: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
a620: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
a630: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
a640: 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  E */..  /* Make 
a650: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
a660: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
a670: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
a680: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
a690: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
a6a0: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
a6b0: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
a6c0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
a6d0: 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IT..  */.  if( p
a6e0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
a6f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a700: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
a710: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69  rior;.  if( pPri
a720: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
a730: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
a740: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
a750: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
a760: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
a770: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
a780: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
a790: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74  p->op));.    ret
a7a0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
a7b0: 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 3e   pPrior->nLimit>
a7c0: 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 6e 4f  =0 || pPrior->nO
a7d0: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
a7e0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
a7f0: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
a800: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
a810: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
a820: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
a830: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
a840: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
a850: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
a860: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
a870: 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e  id query engine.
a880: 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65    If not, create
a890: 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
a8a0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
a8b0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a8c0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
a8d0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n 1;..  /* Creat
a8e0: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
a8f0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
a900: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
a910: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
a920: 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29  =SRT_TempTable )
a930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
a940: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
a950: 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b  Temp, iParm, 0);
a960: 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54  .    eDest = SRT
a970: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
a980: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
a990: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
a9a0: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
a9b0: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
a9c0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
a9d0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
a9e0: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L: {.      if( p
a9f0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ->pOrderBy==0 ){
aa00: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
aa10: 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69  >nLimit = p->nLi
aa20: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
aa30: 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70  ior->nOffset = p
aa40: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->nOffset;.     
aa50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
aa60: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
aa70: 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  ior, eDest, iPar
aa80: 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  m, 0, 0, 0);.   
aa90: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
aaa0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
aab0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
aac0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
aad0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
aae0: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
aaf0: 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
ab00: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
ab10: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31    p->nLimit = -1
ab20: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4f 66  ;.        p->nOf
ab30: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
ab40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
ab50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ect(pParse, p, e
ab60: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
ab70: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 0);.        p
ab80: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
ab90: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  r;.        if( r
aba0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
abb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
abc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
abd0: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
abe0: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
abf0: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
ac00: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
ac10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
ac20: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
ac30: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
ac40: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
ac50: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
ac60: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
ac70: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
ac80: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
ac90: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
aca0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
acb0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
acc0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
acd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
ace0: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
acf0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
ad00: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
ad10: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
ad20: 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c 20      int nLimit, 
ad30: 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  nOffset; /* Save
ad40: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
ad50: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
ad60: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 45 78  fset */.      Ex
ad70: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ad80: 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20  ;  /* The ORDER 
ad90: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
ada0: 65 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a  e right SELECT *
adb0: 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  /..      priorOp
adc0: 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
add0: 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
ade0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
adf0: 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72  if( eDest==prior
ae00: 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  Op && p->pOrderB
ae10: 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c 69 6d 69  y==0 && p->nLimi
ae20: 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66 66 73 65  t<0 && p->nOffse
ae30: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
ae40: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
ae50: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
ae60: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
ae70: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
ae80: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
ae90: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
aea0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
aeb0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
aec0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
aed0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
aee0: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
aef0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
af00: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
af10: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
af20: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
af30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
af40: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
af50: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
af60: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
af70: 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63  .        && matc
af80: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
af90: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
afa0: 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61  OrderBy, unionTa
afb0: 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b, 1) ){.       
afc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
afd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
afe0: 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  f( p->op!=TK_ALL
aff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b000: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b010: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e   OP_OpenTemp, un
b020: 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20  ionTab, 1);.    
b030: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b040: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
b050: 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c  sData, unionTab,
b060: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
b070: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
b080: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b090: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e   OP_OpenTemp, un
b0a0: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
b0b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
b0c0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
b0d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b0e0: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
b0f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
b100: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
b110: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
b120: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
b130: 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
b140: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
b150: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
b160: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
b170: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
b180: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
b190: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
b1a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
b1b0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
b1c0: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
b1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b1e0: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
b1f0: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
b200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b210: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
b220: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
b230: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
b240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
b250: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
b260: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
b270: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
b280: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
b290: 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d 20  .      nLimit = 
b2a0: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->nLimit;.     
b2b0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->nLimit = -1;
b2c0: 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20 3d  .      nOffset =
b2d0: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
b2e0: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
b2f0: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
b300: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
b310: 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54  e, p, op, unionT
b320: 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ab, 0, 0, 0);.  
b330: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
b340: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
b350: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
b360: 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  erBy;.      p->n
b370: 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a  Limit = nLimit;.
b380: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b390: 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20   = nOffset;.    
b3a0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b3b0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
b3c0: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
b3d0: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
b3e0: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
b3f0: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
b400: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
b410: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
b420: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
b430: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
b440: 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69  !=priorOp || uni
b450: 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a  onTab!=iParm ){.
b460: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
b470: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
b480: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
b490: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
b4a0: 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73          if( eDes
b4b0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
b4c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
b4d0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
b4e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
b4f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
b500: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b510: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Types(pParse, p-
b520: 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74  >pSrc, p->pEList
b530: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b540: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
b550: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
b560: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
b570: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ont = sqliteVdbe
b580: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
b590: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b5a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
b5b0: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
b5c0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 63  reak);.        c
b5d0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
b5e0: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ters(pParse, p);
b5f0: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
b600: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  = sqliteVdbeCurr
b610: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
b620: 20 20 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53      multiSelectS
b630: 6f 72 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70  ortOrder(p, p->p
b640: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
b650: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
b660: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
b670: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
b680: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
b690: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
b6c0: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
b6d0: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
b700: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b710: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
b720: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b730: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b740: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
b750: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b760: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
b770: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
b780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b790: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b7a0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b7b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b7c0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
b7d0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
b7e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
b7f0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
b800: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
b810: 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69  il(p, v, p->pELi
b820: 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
b830: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
b840: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b860: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
b870: 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  SECT: {.      in
b880: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
b890: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
b8a0: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
b8b0: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 2c       int nLimit,
b8c0: 20 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   nOffset;..     
b8d0: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
b8e0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
b8f0: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
b900: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
b910: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
b920: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
b930: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
b940: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
b950: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
b960: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
b970: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
b980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
b990: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
b9a0: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
b9b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
b9c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
b9d0: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
b9e0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
b9f0: 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64  pParse,p,p->pOrd
ba00: 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a  erBy,tab1,1) ){.
ba10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
ba20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ba30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ba40: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
ba50: 74 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab1, 1);.      
ba60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ba70: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
ba80: 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20   tab1, 1);..    
ba90: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
baa0: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
bab0: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
bac0: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
bad0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
bae0: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
baf0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
bb00: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c  SRT_Union, tab1,
bb10: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
bb20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
bb30: 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   rc;..      /* C
bb40: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
bb50: 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
bb60: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
bb70: 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
bb80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bb90: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
bba0: 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20  , tab2, 1);.    
bbb0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bbc0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
bbd0: 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20  a, tab2, 1);.   
bbe0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
bbf0: 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74 20 3d  ;.      nLimit =
bc00: 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20   p->nLimit;.    
bc10: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31    p->nLimit = -1
bc20: 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65 74 20  ;.      nOffset 
bc30: 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  = p->nOffset;.  
bc40: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
bc50: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
bc60: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
bc70: 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e  se, p, SRT_Union
bc80: 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 29  , tab2, 0, 0, 0)
bc90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
bca0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
bcb0: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c    p->nLimit = nL
bcc0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  imit;.      p->n
bcd0: 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74  Offset = nOffset
bce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
bcf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
bd00: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
bd10: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
bd20: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
bd30: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
bd40: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
bd50: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
bd60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
bd70: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
bd80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
bd90: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
bda0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
bdb0: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
bdc0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
bdd0: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
bde0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
bdf0: 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73  ->pSrc, p->pELis
be00: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
be10: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
be20: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
be30: 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
be40: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
be50: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
be60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
be70: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
be80: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
be90: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
bea0: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
beb0: 70 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  p);.      iStart
bec0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
bed0: 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79  Op(v, OP_FullKey
bee0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
bef0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bf00: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
bf10: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a  , tab2, iCont);.
bf20: 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c 65 63        multiSelec
bf30: 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20 70 2d  tSortOrder(p, p-
bf40: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
bf50: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
bf60: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
bf70: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
bf80: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
bf90: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d    p->pOrderBy, -
bfc0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
bfd0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
bff0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
c000: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
c010: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 73 71  turn 1;.      sq
c020: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
c030: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
c040: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
c050: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
c060: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
c070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
c080: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c090: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
c0a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c0b0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
c0c0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
c0d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c0e0: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
c0f0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  0);.      if( p-
c100: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
c110: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
c120: 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70  tTail(p, v, p->p
c130: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
c140: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
c150: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
c170: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c180: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
c190: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
c1a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
c1b0: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
c1c0: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
c1d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c1e0: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
c1f0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
c200: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
c210: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
c220: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
c230: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
c240: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
c250: 70 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  p));.    return 
c260: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
c270: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  0;.}../*.** Scan
c280: 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
c290: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
c2a0: 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
c2b0: 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
c2c0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
c2d0: 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
c2e0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
c2f0: 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
c300: 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
c310: 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
c320: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
c330: 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
c340: 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
c350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c360: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
c370: 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
c380: 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
c390: 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
c3a0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
c3b0: 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
c3c0: 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
c3d0: 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
c3e0: 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
c3f0: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
c400: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
c410: 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
c420: 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
c430: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
c440: 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
c450: 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
c460: 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
c470: 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
c480: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
c490: 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
c4a0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
c4b0: 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
c4c0: 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
c4d0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
c4e0: 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
c4f0: 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c  t(ExprList*,int,
c500: 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20  ExprList*);  /* 
c510: 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a  Forward Decl */.
c520: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
c530: 74 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70  tExpr(Expr *pExp
c540: 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  r, int iTable, E
c550: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
c560: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
c570: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
c580: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
c590: 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
c5a0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
c5b0: 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
c5c0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
c5d0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
c5e0: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
c5f0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
c600: 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
c610: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
c620: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
c630: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
c640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c650: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
c660: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
c670: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
c680: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
c690: 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  New = pEList->a[
c6a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
c6b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
c6c0: 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a  ert( pNew!=0 );.
c6d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
c6e0: 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20  = pNew->op;.    
c6f0: 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70    pExpr->dataTyp
c700: 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74 61 54 79  e = pNew->dataTy
c710: 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
c720: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
c730: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
c740: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
c750: 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ExprDup(pNew->pL
c760: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
c770: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
c780: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
c790: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  xpr->pRight = sq
c7a0: 6c 69 74 65 45 78 70 72 44 75 70 28 70 4e 65 77  liteExprDup(pNew
c7b0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
c7c0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
c7d0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
c7e0: 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d    pExpr->pList =
c7f0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
c800: 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  up(pNew->pList);
c810: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
c820: 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
c830: 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ble;.      pExpr
c840: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77  ->iColumn = pNew
c850: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
c860: 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
c870: 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20  New->iAgg;.     
c880: 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79   sqliteTokenCopy
c890: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
c8a0: 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e       sqliteToken
c8c0: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61  Copy(&pExpr->spa
c8d0: 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
c8e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c8f0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
c900: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
c910: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
c920: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
c930: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
c940: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
c950: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45 78  ubstExprList(pEx
c960: 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c  pr->pList, iTabl
c970: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
c980: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73  }.static void .s
c990: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
c9a0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
c9b0: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
c9c0: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
c9d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
c9e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
c9f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
ca00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
ca10: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
ca20: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
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 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
ca50: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
ca60: 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
ca70: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
ca80: 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
ca90: 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
caa0: 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
cab0: 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
cac0: 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
cad0: 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
cae0: 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
caf0: 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
cb00: 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
cb10: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
cb20: 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
cb30: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
cb40: 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
cb50: 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
cb60: 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
cb70: 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
cb80: 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
cb90: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
cba0: 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
cbb0: 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
cbc0: 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
cbd0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
cbe0: 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
cbf0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
cc00: 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
cc10: 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
cc20: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
cc30: 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
cc40: 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
cc50: 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
cc60: 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
cc70: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
cc80: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
cc90: 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
cca0: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
ccb0: 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
ccc0: 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
ccd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
cce0: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
ccf0: 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
cd00: 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
cd10: 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
cd20: 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
cd30: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
cd40: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
cd50: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
cd60: 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
cd70: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
cd80: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
cd90: 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
cda0: 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
cdb0: 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
cdc0: 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
cdd0: 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
cde0: 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
cdf0: 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
ce00: 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
ce10: 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
ce20: 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
ce30: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
ce40: 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
ce50: 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
ce60: 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
ce70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ce80: 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
ce90: 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
cea0: 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
ceb0: 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
cec0: 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
ced0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
cee0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
cef0: 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
cf00: 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
cf10: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
cf20: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
cf30: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
cf40: 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
cf50: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
cf60: 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72  t outer join, or
cf70: 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
cf80: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69  ubquery is not i
cf90: 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28  tself a join.  (
cfa0: 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a  Ticket #306).**.
cfb0: 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
cfc0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
cfd0: 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
cfe0: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
cff0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
d000: 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
d010: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
d020: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
d030: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
d040: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
d050: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
d060: 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
d070: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
d080: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
d090: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
d0a0: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
d0b0: 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
d0c0: 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
d0d0: 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
d0e0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
d0f0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
d100: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
d110: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
d120: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
d130: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
d140: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
d150: 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
d160: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
d170: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
d180: 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
d190: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
d1a0: 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
d1b0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
d1c0: 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
d1d0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
d1e0: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
d1f0: 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
d200: 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
d210: 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
d220: 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
d230: 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
d240: 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
d250: 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62  *  (12)  The sub
d260: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
d270: 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
d280: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
d290: 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
d2a0: 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e    subquery has n
d2b0: 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  o WHERE clause. 
d2c0: 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65   (added by ticke
d2d0: 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e  t #350).**.** In
d2e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
d2f0: 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
d300: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
d310: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d320: 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
d330: 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
d340: 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
d350: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
d360: 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
d370: 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
d380: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
d390: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
d3a0: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
d3b0: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
d3c0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
d3d0: 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
d3e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
d3f0: 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
d400: 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
d410: 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
d420: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
d430: 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
d440: 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
d450: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
d460: 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
d470: 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
d480: 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
d490: 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
d4a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
d4b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
d4c0: 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
d4d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d4e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
d4f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d500: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
d510: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
d520: 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
d530: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
d540: 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
d550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
d560: 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
d570: 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
d580: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
d590: 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
d5a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
d5b0: 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
d5c0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
d5d0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
d5e0: 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
d5f0: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
d600: 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
d610: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
d620: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
d630: 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
d640: 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
d650: 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
d660: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
d670: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
d680: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
d690: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
d6a0: 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
d6b0: 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
d6c0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
d6d0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
d6e0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
d6f0: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
d700: 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
d710: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
d720: 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
d730: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
d740: 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
d750: 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
d760: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
d770: 3b 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  ;.  Expr *pWhere
d780: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
d790: 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
d7a0: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
d7b0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
d7c0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
d7d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d7e0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
d7f0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
d800: 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
d810: 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
d820: 29 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63  );.  pSub = pSrc
d830: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65  ->a[iFrom].pSele
d840: 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
d850: 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
d860: 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
d870: 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
d880: 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  ;.  if( subquery
d890: 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
d8a0: 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
d8b0: 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ;.  pSubSrc = pS
d8c0: 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
d8d0: 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
d8e0: 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
d8f0: 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
d900: 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69  ;.  if( (pSub->i
d910: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
d920: 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26  b->nLimit>=0) &&
d930: 20 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20    (pSrc->nSrc>1 
d940: 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
d950: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d960: 20 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74    if( (p->isDist
d970: 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69  inct || p->nLimi
d980: 74 3e 3d 30 29 20 26 26 20 73 75 62 71 75 65 72  t>=0) && subquer
d990: 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
d9a0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  0;.  if( p->pOrd
d9b0: 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
d9c0: 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
d9d0: 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  0;..  /* Restric
d9e0: 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
d9f0: 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
da00: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
da10: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
da20: 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
da30: 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
da40: 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
da50: 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
da60: 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
da70: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
da80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
da90: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
daa0: 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
dab0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
dac0: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
dad0: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
dae0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
daf0: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
db00: 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
db10: 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
db20: 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
db30: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
db40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
db50: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69  Src->nSrc>1 && i
db60: 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
db70: 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
db80: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
db90: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
dba0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
dbb0: 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
dbc0: 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
dbd0: 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
dbe0: 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
dbf0: 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
dc00: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
dc10: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
dc20: 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
dc30: 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
dc40: 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
dc50: 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
dc60: 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
dc70: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
dc80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
dc90: 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
dca0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
dcb0: 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
dcc0: 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
dcd0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
dce0: 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
dcf0: 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
dd00: 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
dd10: 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
dd20: 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
dd30: 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
dd40: 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
dd50: 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
dd60: 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
dd70: 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
dd80: 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
dd90: 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  .  if( iFrom>0 &
dda0: 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
ddb0: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
ddc0: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
ddd0: 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65     && pSub->pWhe
dde0: 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
ddf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
de00: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
de10: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
de20: 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
de30: 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
de40: 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
de50: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
de60: 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
de70: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
de80: 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
de90: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
dea0: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
deb0: 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
dec0: 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
ded0: 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
dee0: 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
def0: 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
df00: 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
df10: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
df20: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
df30: 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
df40: 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
df50: 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
df60: 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
df70: 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
df80: 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
df90: 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
dfa0: 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
dfb0: 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
dfc0: 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
dfd0: 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
dfe0: 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
dff0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
e000: 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
e010: 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
e020: 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
e030: 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
e040: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
e050: 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72  nt = pSrc->a[iFr
e060: 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  om].iCursor;.  {
e070: 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
e080: 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
e090: 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
e0a0: 70 65 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72  pe = pSrc->a[iFr
e0b0: 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20  om].jointype;.. 
e0c0: 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
e0d0: 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53  From].pTab && pS
e0e0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
e0f0: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
e100: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
e110: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72  leteTable(0, pSr
e120: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
e130: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e140: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
e150: 69 46 72 6f 6d 5d 2e 7a 44 61 74 61 62 61 73 65  iFrom].zDatabase
e160: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e170: 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  e(pSrc->a[iFrom]
e180: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  .zName);.    sql
e190: 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b  iteFree(pSrc->a[
e1a0: 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b 0a  iFrom].zAlias);.
e1b0: 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
e1c0: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
e1d0: 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
e1e0: 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
e1f0: 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
e200: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
e210: 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74   = sqliteSrcList
e220: 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20  Append(pSrc, 0, 
e230: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e240: 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
e250: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
e260: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78  rc->nSrc-1; i-ex
e270: 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29  tra>=iFrom; i--)
e280: 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e  {.        pSrc->
e290: 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  a[i] = pSrc->a[i
e2a0: 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d  -extra];.      }
e2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
e2c0: 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
e2d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d  ++){.      pSrc-
e2e0: 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
e2f0: 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
e300: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
e310: 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
e320: 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
e330: 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
e340: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75  Src->a[iFrom+nSu
e350: 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  bSrc-1].jointype
e360: 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d   = jointype;.  }
e370: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e  ..  /* Now begin
e380: 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
e390: 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
e3a0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
e3b0: 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  r .  ** referenc
e3c0: 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
e3d0: 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
e3e0: 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  uery..  ** .  **
e3f0: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
e400: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
e410: 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
e420: 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
e430: 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
e440: 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a   WHERE a>b;.  **
e450: 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
e460: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
e470: 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
e480: 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
e490: 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20        /.  **    
e4a0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
e4b0: 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
e4c0: 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
e4d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e4e0: 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  _/.  **.  ** We 
e4f0: 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
e500: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
e510: 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
e520: 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
e530: 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73  ee.  ** "a" we s
e540: 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
e550: 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
e560: 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
e570: 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
e580: 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70  .  */.  substExp
e590: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
e5a0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
e5b0: 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74  pEList);.  pList
e5c0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
e5d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e5e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e5f0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
e600: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
e610: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
e620: 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
e630: 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
e640: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
e650: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
e660: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
e670: 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
e680: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
e690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e6a0: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
e6b0: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
e6c0: 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
e6d0: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
e6e0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
e6f0: 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
e700: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
e710: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
e720: 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
e730: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
e740: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
e750: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
e760: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
e770: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
e780: 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
e790: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
e7a0: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
e7b0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
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 57 68 65 72 65 20  f( pSub->pWhere 
e7f0: 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  ){.    pWhere = 
e800: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 53  sqliteExprDup(pS
e810: 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d  ub->pWhere);.  }
e820: 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65  else{.    pWhere
e830: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
e840: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
e850: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e860: 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
e870: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
e880: 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d  ->pWhere;.    p-
e890: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
e8a0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
e8b0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
e8c0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
e8d0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  t);.    if( pSub
e8e0: 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
e8f0: 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67     Expr *pHaving
e900: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
e910: 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b  (pSub->pHaving);
e920: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48  .      if( p->pH
e930: 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
e940: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71   p->pHaving = sq
e950: 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c  liteExpr(TK_AND,
e960: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61   p->pHaving, pHa
e970: 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  ving, 0);.      
e980: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
e990: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
e9a0: 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ing;.      }.   
e9b0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e9c0: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
e9d0: 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
e9e0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
e9f0: 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75  tDup(pSub->pGrou
ea00: 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  pBy);.  }else if
ea10: 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29  ( p->pWhere==0 )
ea20: 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  {.    p->pWhere 
ea30: 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73  = pWhere;.  }els
ea40: 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
ea50: 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  (p->pWhere, iPar
ea60: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
ea70: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65  t);.    if( pWhe
ea80: 72 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  re ){.      p->p
ea90: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78  Where = sqliteEx
eaa0: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57  pr(TK_AND, p->pW
eab0: 68 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29  here, pWhere, 0)
eac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ead0: 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
eae0: 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
eaf0: 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
eb00: 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a  inner or the.  *
eb10: 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
eb20: 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f   distinct. .  */
eb30: 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  .  p->isDistinct
eb40: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
eb50: 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74   || pSub->isDist
eb60: 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  inct;..  /* Tran
eb70: 73 66 65 72 20 74 68 65 20 6c 69 6d 69 74 20 65  sfer the limit e
eb80: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
eb90: 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 74  he subquery to t
eba0: 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75  he outer.  ** qu
ebb0: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ery..  */.  if( 
ebc0: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  pSub->nLimit>=0 
ebd0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c  ){.    if( p->nL
ebe0: 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  imit<0 ){.      
ebf0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62  p->nLimit = pSub
ec00: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65  ->nLimit;.    }e
ec10: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  lse if( p->nLimi
ec20: 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70  t+p->nOffset > p
ec30: 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62  Sub->nLimit+pSub
ec40: 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->nOffset ){.   
ec50: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70     p->nLimit = p
ec60: 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53  Sub->nLimit + pS
ec70: 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d  ub->nOffset - p-
ec80: 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  >nOffset;.    }.
ec90: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74    }.  p->nOffset
eca0: 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65   += pSub->nOffse
ecb0: 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c  t;..  /* Finiall
ecc0: 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
ecd0: 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
ece0: 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
ecf0: 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
ed00: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 53 65 6c    */.  sqliteSel
ed10: 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b  ectDelete(pSub);
ed20: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
ed30: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
ed40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ed50: 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  nt passed in as 
ed60: 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
ed70: 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
ed80: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
ed90: 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49   max() query.  I
eda0: 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73  f it is and this
edb0: 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a   query can be.**
edc0: 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
edd0: 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74   a single seek t
ede0: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
edf0: 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64  or end of an ind
ee00: 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65  ex,.** then gene
ee10: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f  rate the code fo
ee20: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e  r this SELECT an
ee30: 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20  d return 1.  If 
ee40: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a  this is not a .*
ee50: 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  * simple min() o
ee60: 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74  r max() query, t
ee70: 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a  hen return 0;.**
ee80: 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e  .** A simply min
ee90: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
eea0: 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  y looks like thi
eeb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
eec0: 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74  CT min(a) FROM t
eed0: 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45  able;.**    SELE
eee0: 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74  CT max(a) FROM t
eef0: 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able;.**.** The 
ef00: 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f  query may have o
ef10: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
ef20: 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61  le in its FROM a
ef30: 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a  rgument.  There.
ef40: 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f  ** can be no GRO
ef50: 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20  UP BY or HAVING 
ef60: 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  or WHERE clauses
ef70: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  .  The result se
ef80: 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65  t must.** be the
ef90: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
efa0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  of a single colu
efb0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  mn of the table.
efc0: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20    The column.** 
efd0: 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  in the min() or 
efe0: 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  max() function m
eff0: 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a  ust be indexed..
f000: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65  **.** The parame
f010: 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75  ters to this rou
f020: 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d  tine are the sam
f030: 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 53  e as for sqliteS
f040: 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
f050: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
f060: 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
f070: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
f080: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
f090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
f0a0: 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
f0b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
f0c0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
f0d0: 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
f0e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
f0f0: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
f100: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
f110: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
f120: 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
f130: 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
f140: 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72  int cont;.  Expr
f150: 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20 20 73 74  List eList;.  st
f160: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
f170: 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20  em eListItem;.. 
f180: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
f190: 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69   if this query i
f1a0: 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
f1b0: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
f1c0: 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65    Return.  ** ze
f1d0: 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74  ro if it is  not
f1e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
f1f0: 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70  pGroupBy || p->p
f200: 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68  Having || p->pWh
f210: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ere ) return 0;.
f220: 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e    if( p->pSrc->n
f230: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
f240: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  0;.  if( p->pELi
f250: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
f260: 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
f270: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
f280: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
f290: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
f2a0: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
f2b0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
f2c0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  pr->pList==0 || 
f2d0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
f2e0: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
f2f0: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
f300: 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
f310: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
f320: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70  iteStrNICmp(pExp
f330: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
f340: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
f350: 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
f360: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
f370: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78  liteStrNICmp(pEx
f380: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
f390: 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
f3a0: 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
f3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
f3c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
f3d0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  xpr = pExpr->pLi
f3e0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
f3f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
f400: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
f410: 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20  urn 0;.  iCol = 
f420: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
f430: 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
f440: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
f450: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  /* If we get to 
f460: 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  here, it means t
f470: 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74  he query is of t
f480: 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e  he correct form.
f490: 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
f4a0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
f4b0: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61   an index and ma
f4c0: 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  ke pIdx point to
f4d0: 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70   the.  ** approp
f4e0: 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66  riate index.  If
f4f0: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
f500: 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54  x() is on an INT
f510: 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a  EGER PRIMARY.  *
f520: 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f  * key column, no
f530: 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73   index is necess
f540: 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20  ary so set pIdx 
f550: 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a  to NULL.  If no.
f560: 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65    ** usable inde
f570: 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75  x is found, retu
f580: 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
f590: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70   iCol<0 ){.    p
f5a0: 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
f5b0: 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  {.    for(pIdx=p
f5c0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f5d0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f5e0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
f5f0: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
f600: 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
f610: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
f620: 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61  [0]==iCol ) brea
f630: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f640: 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
f650: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
f660: 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
f670: 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
f680: 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
f690: 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
f6a0: 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
f6b0: 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
f6c0: 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
f6d0: 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
f6e0: 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63  cell..  ** The c
f6f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65  olumn names have
f700: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
f710: 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63  nerated in the c
f720: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
f730: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
f740: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
f750: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
f760: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f770: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
f780: 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
f790: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
f7a0: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20  Parse, p->pSrc, 
f7b0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  p->pEList);.  }.
f7c0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
f7d0: 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
f7e0: 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
f7f0: 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
f800: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
f810: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65  f( eDest==SRT_Te
f820: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73  mpTable ){.    s
f830: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f840: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
f850: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Parm, 0);.  }.. 
f860: 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63   /* Generating c
f870: 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ode to find the 
f880: 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20  min or the max. 
f890: 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77   Basically all w
f8a0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
f8b0: 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69  o is find the fi
f8c0: 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20  rst or the last 
f8d0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f  entry in the cho
f8e0: 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20  sen index.  If. 
f8f0: 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   ** the min() or
f900: 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65   max() is on the
f910: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
f920: 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20   KEY, then find 
f930: 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f  the first.  ** o
f940: 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  r last entry in 
f950: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
f960: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 43 6f 64    */.  sqliteCod
f970: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
f980: 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29  arse, pTab->iDb)
f990: 3b 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 70 53  ;.  base = p->pS
f9a0: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
f9b0: 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
f9c0: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
f9d0: 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  , p);.  sqliteVd
f9e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f9f0: 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62  teger, pTab->iDb
fa00: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  , 0);.  sqliteVd
fa10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
fa20: 65 6e 52 65 61 64 2c 20 62 61 73 65 2c 20 70 54  enRead, base, pT
fa30: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c  ab->tnum);.  sql
fa40: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
fa50: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
fa60: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
fa70: 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56    cont = sqliteV
fa80: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
fa90: 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29  .  if( pIdx==0 )
faa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
fab0: 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
fac0: 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c   base, 0);.  }el
fad0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  se{.    sqliteVd
fae0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
faf0: 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62  teger, pIdx->iDb
fb00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fb10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fb20: 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2b 31  OpenRead, base+1
fb30: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
fb40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
fb50: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
fb60: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
fb70: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
fb80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
fb90: 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  kOp, base+1, 0);
fba0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
fbb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 65  ddOp(v, OP_IdxRe
fbc0: 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  cno, base+1, 0);
fbd0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
fbe0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
fbf0: 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20  , base+1, 0);.  
fc00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fc10: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20  p(v, OP_MoveTo, 
fc20: 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  base, 0);.  }.  
fc30: 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b  eList.nExpr = 1;
fc40: 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74  .  memset(&eList
fc50: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
fc60: 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65  eListItem));.  e
fc70: 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49  List.a = &eListI
fc80: 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30  tem;.  eList.a[0
fc90: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
fca0: 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
fcb0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65  op(pParse, p, &e
fcc0: 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
fcd0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
fce0: 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b 0a 20 20   cont, cont);.  
fcf0: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
fd00: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
fd10: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
fd20: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
fd30: 62 61 73 65 2c 20 30 29 3b 0a 20 20 72 65 74 75  base, 0);.  retu
fd40: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 1;.}../*.** G
fd50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
fd60: 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43   the given SELEC
fd70: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
fd80: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
fd90: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
fda0: 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
fdb0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
fdc0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73  ** value of eDes
fdd0: 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a  t and iParm..**.
fde0: 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61 6c  **     eDest Val
fdf0: 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a  ue       Result.
fe00: 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
fe10: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe40: 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61  --.**     SRT_Ca
fe50: 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65  llback    Invoke
fe60: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f   the callback fo
fe70: 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68  r each row of th
fe80: 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
fe90: 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
fea0: 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20      Store first 
feb0: 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79  result in memory
fec0: 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a   cell iParm.**.*
fed0: 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
fee0: 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
fef0: 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 61  lts as keys of a
ff00: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
ff10: 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  or iParm.**.**  
ff20: 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
ff30: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
ff40: 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
ff50: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
ff60: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
ff70: 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
ff80: 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
ff90: 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
ffa0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
ffb0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
ffc0: 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
ffd0: 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
ffe0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
fff0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
10000 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
10010 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
10020 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
10030 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
10040 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
10050 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
10060 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
10070 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
10080 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
10090 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
100a0 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
100b0 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
100c0 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
100d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
100e0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
100f0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
10100 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
10110 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
10120 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
10130 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
10140 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
10150 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
10160 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
10170 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
10180 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
10190 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
101a0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
101b0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
101c0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
101d0 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
101e0 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
101f0 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
10200 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
10210 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
10220 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
10230 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
10240 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
10250 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
10260 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
10270 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
10280 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
10290 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
102a0 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
102b0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
102c0 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
102d0 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
102e0 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
102f0 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
10300 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
10310 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
10320 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
10330 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
10340 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
10350 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
10360 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
10370 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
10380 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
10390 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
103a0 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
103b0 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
103c0 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
103f0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
10400 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
10450 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10460 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
10470 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10480 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
10490 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
104a0 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
104b0 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
104c0 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
104d0 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
104e0 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
104f0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
10500 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10510 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
10520 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
10530 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
10540 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
10550 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
10560 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
10570 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
10580 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
10590 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
105a0 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
105b0 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
105c0 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
105d0 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
105e0 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
105f0 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
10600 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
10610 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
10620 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
10630 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
10640 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10650 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
10660 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10670 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10680 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
10690 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
106a0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74   coded. */.  int
106b0 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
106c0 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
106d0 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
106e0 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
106f0 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
10700 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20   /* A parameter 
10710 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73  used by the eDes
10720 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  t disposal metho
10730 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  d */.  Select *p
10740 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a  Parent,       /*
10750 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
10760 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
10770 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  s a sub-query */
10780 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62  .  int parentTab
10790 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ,         /* Ind
107a0 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70  ex in pParent->p
107b0 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72  Src of this quer
107c0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72  y */.  int *pPar
107d0 65 6e 74 41 67 67 20 20 20 20 20 20 20 20 2f 2a  entAgg        /*
107e0 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
107f0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
10800 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
10810 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
10820 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
10830 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
10840 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20  sAgg = 0;       
10850 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
10860 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
10870 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
10880 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10890 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
108a0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
108b0 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
108c0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
108d0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
108e0 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
108f0 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
10900 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
10910 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
10920 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
10930 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10940 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
10950 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
10960 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
10970 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
10980 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
10990 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
109a0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
109b0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
109c0 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
109d0 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
109e0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
109f0 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
10a00 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
10a10 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
10a20 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
10a30 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
10a40 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
10a50 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
10a60 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
10a70 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
10a80 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
10a90 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
10aa0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
10ab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
10ac0 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
10ad0 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
10ae0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
10af0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
10b00 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
10b10 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
10b20 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
10b30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
10b40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
10b50 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
10b60 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
10b70 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
10b80 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
10b90 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
10ba0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
10bb0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
10bc0 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  p, eDest, iParm)
10bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
10be0 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
10bf0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
10c00 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
10c10 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
10c20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
10c30 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
10c40 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
10c50 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72  >pOrderBy;.  pGr
10c60 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
10c70 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
10c80 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
10c90 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
10ca0 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
10cb0 20 41 6c 6c 6f 63 61 74 65 20 56 44 42 45 20 63   Allocate VDBE c
10cc0 75 72 73 6f 72 73 20 66 6f 72 20 65 61 63 68 20  ursors for each 
10cd0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
10ce0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
10cf0 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 73 73  sqliteSrcListAss
10d00 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
10d10 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
10d20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74   /* .  ** Do not
10d30 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   even attempt to
10d40 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f   generate any co
10d50 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c  de if we have al
10d60 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20  ready seen.  ** 
10d70 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68  errors before th
10d80 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
10d90 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
10da0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67  arse->nErr>0 ) g
10db0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
10dc0 0a 20 20 2f 2a 20 45 78 70 61 6e 64 20 61 6e 79  .  /* Expand any
10dd0 20 22 2a 22 20 74 65 72 6d 73 20 69 6e 20 74 68   "*" terms in th
10de0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 28  e result set.  (
10df0 46 6f 72 20 65 78 61 6d 70 6c 65 20 74 68 65 20  For example the 
10e00 22 2a 22 20 69 6e 0a 20 20 2a 2a 20 22 53 45 4c  "*" in.  ** "SEL
10e10 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 29 20  ECT * FROM t1") 
10e20 20 54 68 65 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   The fillInColum
10e30 6e 6c 69 73 74 28 29 20 72 6f 75 74 69 6e 65 20  nlist() routine 
10e40 61 6c 73 6f 20 64 6f 65 73 20 73 6f 6d 65 0a 20  also does some. 
10e50 20 2a 2a 20 6f 74 68 65 72 20 68 6f 75 73 65 6b   ** other housek
10e60 65 65 70 69 6e 67 20 2d 20 73 65 65 20 74 68 65  eeping - see the
10e70 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
10e80 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 2a  for details..  *
10e90 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  /.  if( fillInCo
10ea0 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
10eb0 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   p) ){.    goto 
10ec0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
10ed0 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
10ee0 68 65 72 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d  here;.  pEList =
10ef0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
10f00 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f  ( pEList==0 ) go
10f10 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
10f20 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
10f30 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
10f40 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
10f50 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
10f60 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
10f70 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
10f80 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  ( (eDest==SRT_Me
10f90 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
10fa0 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e  Set) && pEList->
10fb0 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73  nExpr>1 ){.    s
10fc0 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
10fd0 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69  arse, "only a si
10fe0 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f  ngle result allo
10ff0 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20  wed for ".      
11000 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20   "a SELECT that 
11010 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
11020 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
11030 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  .  }..  /* ORDER
11050 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
11060 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
11070 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69  ions..  */.  swi
11080 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
11090 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
110a0 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
110b0 78 63 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20  xcept:.    case 
110c0 53 52 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20  SRT_Discard:.   
110d0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
110e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
110f0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
11100 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
11110 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
11120 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
11130 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68  allocated all th
11140 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
11150 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68  e.  ** need to h
11160 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73 20  andle subquerys 
11170 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61  and temporary ta
11180 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  bles.  .  **.  *
11190 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  * Resolve the co
111a0 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64  lumn names and d
111b0 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68  o a semantics ch
111c0 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65  eck on all the e
111d0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
111e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
111f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
11200 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
11210 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
11220 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11230 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  , 0, pEList->a[i
11240 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
11250 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11260 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
11270 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
11280 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
11290 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20  >a[i].pExpr, 1, 
112a0 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20  &isAgg) ){.     
112b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
112c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
112d0 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ( pWhere ){.    
112e0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
112f0 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
11300 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11310 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20  t, pWhere) ){.  
11320 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11330 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
11340 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
11350 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  ck(pParse, pWher
11360 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
11370 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11380 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  d;.    }.  }.  i
11390 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
113a0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
113b0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
113c0 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
113d0 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
113e0 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
113f0 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
11400 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
11410 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11420 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11430 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
11440 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
11450 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29  List, pHaving) )
11460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11470 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11480 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11490 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
114a0 48 61 76 69 6e 67 2c 20 31 2c 20 26 69 73 41 67  Having, 1, &isAg
114b0 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
114c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
114d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72   }.  }.  if( pOr
114e0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  derBy ){.    for
114f0 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
11500 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11510 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
11520 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
11530 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
11540 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
11550 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
11560 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26  ger(pE, &iCol) &
11570 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  & iCol>0 && iCol
11580 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
11590 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
115a0 65 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  eExprDelete(pE);
115b0 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f  .        pE = pO
115c0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
115d0 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  pr = sqliteExprD
115e0 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
115f0 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
11600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
11610 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
11620 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11630 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
11640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
11650 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11670 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
11680 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67  pParse, pE, isAg
11690 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  g, 0) ){.       
116a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
116b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
116c0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
116d0 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a  Constant(pE) ){.
116e0 20 20 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 49 6e 74 65 67 65 72 28  teExprIsInteger(
11700 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b  pE, &iCol)==0 ){
11710 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11720 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
11730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
11740 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 6d  ORDER BY terms m
11750 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69  ust not be non-i
11760 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73  nteger constants
11770 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ");.          go
11780 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11790 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
117a0 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
117b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
117c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
117d0 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
117e0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
117f0 20 22 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d   "ORDER BY colum
11800 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
11810 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
11820 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
11830 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
11840 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45  nd %d", iCol, pE
11850 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
11860 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11870 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
11880 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11890 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75  .  }.  if( pGrou
118a0 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  pBy ){.    for(i
118b0 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
118c0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
118d0 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
118e0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47     Expr *pE = pG
118f0 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
11900 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
11910 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65  liteExprIsIntege
11920 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20  r(pE, &iCol) && 
11930 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
11940 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
11950 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
11960 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20  xprDelete(pE);. 
11970 20 20 20 20 20 20 20 70 45 20 3d 20 70 47 72 6f         pE = pGro
11980 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
11990 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
119a0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
119b0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
119c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
119d0 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
119e0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
119f0 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20  st, pEList, pE) 
11a00 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11a10 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11a20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
11a30 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
11a40 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c  arse, pE, isAgg,
11a50 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67   0) ){.        g
11a60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11a80 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f  ( sqliteExprIsCo
11a90 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
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 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
11ac0 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  , &iCol)==0 ){. 
11ad0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
11ae0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
11af0 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f              "GRO
11b00 55 50 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74  UP BY terms must
11b10 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65   not be non-inte
11b20 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b  ger constants");
11b30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11b40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11b50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
11b60 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45  ol<=0 || iCol>pE
11b70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
11b80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
11b90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52               "GR
11bb0 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75  OUP BY column nu
11bc0 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72  mber %d out of r
11bd0 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
11be0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
11bf0 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
11c00 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  d", iCol, pEList
11c10 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
11c20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11c30 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
11c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11c50 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
11c60 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
11c70 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
11c80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
11c90 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
11ca0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
11cb0 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
11cc0 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
11cd0 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
11ce0 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  em in a callback
11cf0 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
11d00 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
11d10 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
11d20 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65  ing to some othe
11d30 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  r destination.. 
11d40 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
11d50 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
11d60 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
11d70 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
11d80 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11d90 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  t);.  }..  /* Ch
11da0 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
11db0 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
11dc0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
11dd0 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
11de0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
11df0 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
11e00 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
11e10 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
11e20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
11e30 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
11e40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11e50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
11e60 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
11e70 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
11e80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11e90 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
11ea0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
11eb0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
11ec0 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
11ed0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
11ee0 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43  int needRestoreC
11ef0 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69 66 28  ontext;..    if(
11f00 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
11f10 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e  pSelect==0 ) con
11f20 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
11f30 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
11f40 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
11f50 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
11f60 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
11f70 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  hContext;.      
11f80 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
11f90 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73 74 2d  text = pTabList-
11fa0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
11fb0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
11fc0 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ntext = 1;.    }
11fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64  else{.      need
11fe0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
11ff0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
12000 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
12010 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  e, pTabList->a[i
12020 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  ].pSelect, SRT_T
12030 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20 20 20  empTable, .     
12040 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
12050 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
12060 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67  or, p, i, &isAgg
12070 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52  );.    if( needR
12080 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b  estoreContext ){
12090 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
120a0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
120b0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
120c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
120d0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
120e0 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
120f0 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65  Where;.    if( e
12100 44 65 73 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest!=SRT_Union 
12110 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78  && eDest!=SRT_Ex
12120 63 65 70 74 20 26 26 20 65 44 65 73 74 21 3d 53  cept && eDest!=S
12130 52 54 5f 44 69 73 63 61 72 64 20 29 7b 0a 20 20  RT_Discard ){.  
12140 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
12150 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
12160 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  }.    pGroupBy =
12170 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
12180 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
12190 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69  Having;.    isDi
121a0 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
121b0 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f  stinct;.  }..  /
121c0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
121d0 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
121e0 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
121f0 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
12200 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
12210 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
12220 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
12230 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
12240 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
12250 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61   .  */.  if( pPa
12260 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41  rent && pParentA
12270 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74  gg &&.      flat
12280 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
12290 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72  se, pParent, par
122a0 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74  entTab, *pParent
122b0 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20  Agg, isAgg) ){. 
122c0 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a     if( isAgg ) *
122d0 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a  pParentAgg = 1;.
122e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
122f0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
12300 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
12310 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
12320 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
12330 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
12340 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69  y column types i
12350 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
12360 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  ng a callback.  
12370 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
12380 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
12390 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
123a0 20 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f   to a destinatio
123b0 6e 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61  n other.  ** tha
123c0 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20  n a callback..  
123d0 2a 2a 0a 20 20 2a 2a 20 57 65 20 68 61 76 65 20  **.  ** We have 
123e0 74 6f 20 64 6f 20 74 68 69 73 20 73 65 70 61 72  to do this separ
123f0 61 74 65 6c 79 20 66 72 6f 6d 20 74 68 65 20 63  ately from the c
12400 72 65 61 74 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d  reation of colum
12410 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 62 6f  n names.  ** abo
12420 76 65 20 62 65 63 61 75 73 65 20 69 66 20 74 68  ve because if th
12430 65 20 70 54 61 62 4c 69 73 74 20 63 6f 6e 74 61  e pTabList conta
12440 69 6e 73 20 76 69 65 77 73 20 74 68 65 6e 20 74  ins views then t
12450 68 65 79 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  hey will not.  *
12460 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  * have been reso
12470 6c 76 65 64 20 61 6e 64 20 77 65 20 77 69 6c 6c  lved and we will
12480 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 65 20 63 6f   not know the co
12490 6c 75 6d 6e 20 74 79 70 65 73 20 75 6e 74 69 6c  lumn types until
124a0 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
124b0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
124c0 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
124d0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
124e0 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
124f0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
12500 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12510 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
12520 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
12530 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
12540 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
12550 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
12560 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
12570 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12580 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
12590 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
125a0 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e  }..  /* Do an an
125b0 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65 67  alysis of aggreg
125c0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  ate expressions.
125d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67  .  */.  sqliteAg
125e0 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
125f0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
12600 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42  isAgg || pGroupB
12610 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
12620 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30   pParse->nAgg==0
12630 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20 3d 20   );.    isAgg = 
12640 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
12650 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
12660 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
12670 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
12680 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
12690 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
126a0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
126b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
126c0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
126d0 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75   }.    if( pGrou
126e0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  pBy ){.      for
126f0 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
12700 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12710 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
12720 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
12730 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
12740 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
12750 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
12760 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
12770 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
12780 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12790 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71  f( pHaving && sq
127a0 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
127b0 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
127c0 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
127d0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
127e0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
127f0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
12800 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12810 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
12820 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
12830 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  f( sqliteExprAna
12840 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
12850 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
12860 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
12870 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
12880 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
12890 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
128a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73   }.  }..  /* Res
128b0 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  et the aggregato
128c0 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  r.  */.  if( isA
128d0 67 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  gg ){.    sqlite
128e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
128f0 41 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61  AggReset, 0, pPa
12900 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20  rse->nAgg);.    
12910 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
12920 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
12930 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46       FuncDef *pF
12940 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28  unc;.      if( (
12950 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  pFunc = pParse->
12960 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d  aAgg[i].pFunc)!=
12970 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e  0 && pFunc->xFin
12980 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
12990 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
129a0 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69  dOp(v, OP_AggIni
129b0 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
129c0 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
129d0 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
129e0 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49  r*)pFunc, P3_POI
129f0 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NTER);.      }. 
12a00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
12a10 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
12a20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12a30 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
12a40 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
12a50 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12a60 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
12a70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
12a80 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
12a90 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
12aa0 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
12ab0 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
12ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
12ad0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
12ae0 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
12af0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12b00 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
12b10 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
12b20 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d  .  /* Open a tem
12b30 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
12b40 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
12b50 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
12b60 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20   if( isDistinct 
12b70 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  ){.    distinct 
12b80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
12b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
12ba0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
12bb0 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20  Temp, distinct, 
12bc0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
12bd0 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
12be0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
12bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
12c00 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20  n.  */.  pWInfo 
12c10 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42 65 67  = sqliteWhereBeg
12c20 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
12c30 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  ist, pWhere, 0, 
12c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 47 72               pGr
12c60 6f 75 70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72  oupBy ? 0 : &pOr
12c70 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 57  derBy);.  if( pW
12c80 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
12c90 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
12ca0 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
12cb0 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20  d inner loop if 
12cc0 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69  we are not deali
12cd0 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67  ng with.  ** agg
12ce0 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  regates.  */.  i
12cf0 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  f( !isAgg ){.   
12d00 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
12d10 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
12d20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
12d30 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
12d40 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
12d60 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
12d70 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
12d80 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20 20  Break) ){.      
12d90 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12db0 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c  * If we are deal
12dc0 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61  ing with aggrega
12dd0 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  tes, then do the
12de0 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61   special aggrega
12df0 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  te.  ** processi
12e00 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73  ng.  .  */.  els
12e10 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  e{.    if( pGrou
12e20 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
12e30 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72   lbl1;.      for
12e40 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
12e50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
12e70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
12e80 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
12e90 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
12ea0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12eb0 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
12ec0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
12ed0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
12ee0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
12ef0 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71  e_format>=4 ) sq
12f00 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 76  liteAddKeyType(v
12f10 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
12f20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
12f30 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
12f40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
12f50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
12f60 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29  gFocus, 0, lbl1)
12f70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
12f80 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
12f90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
12fa0 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  f( pParse->aAgg[
12fb0 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
12fc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
12fd0 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
12fe0 73 65 2c 20 70 50 61 72 73 65 2d 3e 61 41 67 67  se, pParse->aAgg
12ff0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
13000 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
13010 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74  dOp(v, OP_AggSet
13020 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  , 0, i);.      }
13030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
13040 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13050 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20   lbl1);.    }.  
13060 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
13070 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b  rse->nAgg; i++){
13080 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
13090 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
130a0 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
130b0 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
130c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
130d0 20 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 41   pE = pParse->aA
130e0 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  gg[i].pExpr;.   
130f0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
13100 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
13110 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ON );.      if( 
13120 70 45 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pE->pList ){.   
13130 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
13140 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
13150 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
13160 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
13170 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
13180 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
13190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
131a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
131b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
131c0 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
131d0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
131e0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 75  ddOp(v, OP_AggFu
131f0 6e 63 2c 20 30 2c 20 70 45 2d 3e 70 4c 69 73 74  nc, 0, pE->pList
13200 20 3f 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45   ? pE->pList->nE
13210 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
13220 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13230 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 21 3d 30  aAgg[i].pFunc!=0
13240 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13250 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  ( pParse->aAgg[i
13260 5d 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d  ].pFunc->xStep!=
13270 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
13280 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
13290 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 50 61 72   -1, (char*)pPar
132a0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
132b0 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  c, P3_POINTER);.
132c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
132d0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
132e0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f   scan loop..  */
132f0 0a 20 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e  .  sqliteWhereEn
13300 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
13310 20 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65   If we are proce
13320 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73  ssing aggregates
13330 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74  , we need to set
13340 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f   up a second loo
13350 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20  p.  ** over all 
13360 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
13370 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63   values and proc
13380 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ess them..  */. 
13390 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
133a0 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73    int endagg = s
133b0 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
133c0 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73  el(v);.    int s
133d0 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61  tartagg;.    sta
133e0 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64  rtagg = sqliteVd
133f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
13400 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67  gNext, 0, endagg
13410 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75  );.    pParse->u
13420 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69  seAgg = 1;.    i
13430 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
13440 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
13450 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
13460 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c  aving, startagg,
13470 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
13480 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
13490 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
134a0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
134b0 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
134c0 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
134d0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
134e0 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61  , startagg, enda
134f0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
13500 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
13510 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
13520 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
13530 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29  to, 0, startagg)
13540 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
13550 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13560 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  endagg);.    sql
13570 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
13580 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
13590 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
135a0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
135b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
135c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
135d0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
135e0 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
135f0 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
13600 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
13610 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
13620 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
13630 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
13640 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
13650 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
13660 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
13670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
13680 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65  his was a subque
13690 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20  ry, we have now 
136a0 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75  converted the su
136b0 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20  bquery into a.  
136c0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
136d0 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74  le.  So delete t
136e0 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72 75  he subquery stru
136f0 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70  cture from the p
13700 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72  arent.  ** to pr
13710 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71 75  event this subqu
13720 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65  ery from being e
13730 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61  valuated again a
13740 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a  nd to force the.
13750 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20    ** the use of 
13760 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
13770 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
13780 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
13790 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
137a0 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
137b0 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
137c0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
137d0 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
137e0 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
137f0 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
13800 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50 61  lete(p);.    pPa
13810 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
13820 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74  rentTab].pSelect
13830 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13840 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
13850 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
13860 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
13870 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
13880 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
13890 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
138a0 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
138b0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
138c0 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
138d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
138e0 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
138f0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
13900 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
13910 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
13920 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67  _end:.  sqliteAg
13930 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
13940 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
13950 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.