/ Hex Artifact Content
Login

Artifact 7cbd9cca5294399657da9e2d6c441add4610fb18:


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 34  select.c,v 1.154
0200: 20 32 30 30 34 2f 30 32 2f 31 34 20 31 36 3a 33   2004/02/14 16:3
0210: 31 3a 30 34 20 64 72 68 20 45 78 70 20 24 0a 2a  1:04 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c  elect *sqliteSel
02a0: 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69  ectNew(.  ExprLi
02b0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
02c0: 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  /* which columns
02d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
02e0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53  he result */.  S
02f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
0300: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
0310: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
0320: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
0330: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0340: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  e,         /* th
0350: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
0360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
0370: 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65  roupBy,   /* the
0380: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0390: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
03a0: 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  ing,        /* t
03b0: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
03c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
03d0: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74  pOrderBy,   /* t
03e0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
03f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  se */.  int isDi
0400: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a  stinct,       /*
0410: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
0420: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
0430: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
0440: 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20  t nLimit,       
0450: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
0460: 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  ue.  -1 means no
0470: 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t used */.  int 
0480: 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  nOffset         
0490: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
04a0: 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20 6f  e.  0 means no o
04b0: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
04c0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
04d0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
04e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
04f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0520: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0530: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
0540: 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Src);.    sqlite
0550: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
0560: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  e);.    sqliteEx
0570: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72  prListDelete(pGr
0580: 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
0590: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61  teExprDelete(pHa
05a0: 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
05b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
05c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c  pOrderBy);.  }el
05d0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  se{.    if( pELi
05e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
05f0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
0600: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
0610: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4c  sqliteExpr(TK_AL
0620: 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20  L,0,0,0), 0);.  
0630: 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45    }.    pNew->pE
0640: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
0650: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
0660: 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pSrc;.    pNew->
0670: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0680: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
0690: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
06a0: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
06b0: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
06c0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
06d0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
06e0: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
06f0: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20   = isDistinct;. 
0700: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b     pNew->op = TK
0710: 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65  _SELECT;.    pNe
0720: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  w->nLimit = nLim
0730: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  it;.    pNew->nO
0740: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
0750: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  .    pNew->iLimi
0760: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  t = -1;.    pNew
0770: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
0780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0790: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  w;.}../*.** Give
07a0: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
07b0: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
07c0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
07d0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
07e0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
07f0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0800: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0810: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0820: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0830: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0840: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0850: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0860: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  R.**     JT_OUTE
0870: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0880: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0890: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
08a0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
08b0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
08c0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
08d0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
08e0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
08f0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0900: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0910: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0920: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0930: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0940: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0950: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0960: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0970: 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 50  sqliteJoinType(P
0980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0990: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
09a0: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
09b0: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
09c0: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
09d0: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
09e0: 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  p;.  static stru
09f0: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0a00: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0a10: 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20     int nChar;.  
0a20: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d 20    int code;.  } 
0a30: 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20  keywords[] = {. 
0a40: 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20     { "natural", 
0a50: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c  7, JT_NATURAL },
0a60: 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20  .    { "left",  
0a70: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0a80: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0a90: 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f  right",   5, JT_
0aa0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0ab0: 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20  ,.    { "full", 
0ac0: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0ad0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0ae0: 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22  },.    { "outer"
0af0: 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  ,   5, JT_OUTER 
0b00: 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22  },.    { "inner"
0b10: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0b20: 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22  },.    { "cross"
0b30: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0b40: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0b50: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0b60: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0b70: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0b80: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0b90: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0ba0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0bb0: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0bc0: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0bd0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0be0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0bf0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0c00: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0c10: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0c20: 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e     && sqliteStrN
0c30: 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f  ICmp(p->z, keywo
0c40: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
0c50: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
0c60: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0c70: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
0c80: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
0c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0ca0: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
0cb0: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0cc0: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
0cd0: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
0ce0: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
0cf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0d00: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
0d10: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
0d20: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
0d30: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
0d40: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
0d50: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
0d60: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
0d70: 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64 75   static Token du
0d80: 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  mmy = { 0, 0 };.
0d90: 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20 3d      char *zSp1 =
0da0: 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22 20   " ", *zSp2 = " 
0db0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0dc0: 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79 3b   ){ pB = &dummy;
0dd0: 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20 20   zSp1 = 0; }.   
0de0: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70 43   if( pC==0 ){ pC
0df0: 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32 20   = &dummy; zSp2 
0e00: 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  = 0; }.    sqlit
0e10: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
0e20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
0e30: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0e40: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0e50: 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70 41   ", 0,.       pA
0e60: 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70 31  ->z, pA->n, zSp1
0e70: 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e  , 1, pB->z, pB->
0e80: 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d 3e  n, zSp2, 1, pC->
0e90: 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20  z, pC->n, 0);.  
0ea0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0eb0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0ec0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
0ed0: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
0ee0: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
0ef0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
0f00: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0f10: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0f20: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0f30: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0f40: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
0f50: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
0f60: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
0f70: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
0f80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
0f90: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
0fa0: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
0fb0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
0fc0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
0fd0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
0fe0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
0ff0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
1000: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
1010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1030: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1040: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1050: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1060: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1070: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1080: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1090: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
10a0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
10b0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
10c0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
10d0: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
10e0: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
10f0: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1100: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1110: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1130: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1150: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  l,        /* Nam
1160: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1170: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1180: 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a   *pTab1,      /*
1190: 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a   First table */.
11a0: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
11b0: 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65  Tab2,      /* Se
11c0: 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  cond table */.  
11d0: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
11e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
11f0: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
1200: 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  m to this expres
1210: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  sion */.){.  Tok
1220: 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72  en dummy;.  Expr
1230: 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a   *pE1a, *pE1b, *
1240: 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE1c;.  Expr *pE
1250: 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63  2a, *pE2b, *pE2c
1260: 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20  ;.  Expr *pE;.. 
1270: 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b   dummy.z = zCol;
1280: 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72  .  dummy.n = str
1290: 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d  len(zCol);.  dum
12a0: 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45  my.dyn = 0;.  pE
12b0: 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  1a = sqliteExpr(
12c0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
12d0: 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73  mmy);.  pE2a = s
12e0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c  qliteExpr(TK_ID,
12f0: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1300: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1310: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
1320: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
1330: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
1340: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
1350: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1360: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1370: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b2->zName;.  dum
1380: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
1390: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20 3d  mmy.z);.  pE2b =
13a0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
13b0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
13c0: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
13d0: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  eExpr(TK_DOT, pE
13e0: 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20  1b, pE1a, 0);.  
13f0: 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78 70  pE2c = sqliteExp
1400: 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  r(TK_DOT, pE2b, 
1410: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
1420: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 45   sqliteExpr(TK_E
1430: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
1440: 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  );.  ExprSetProp
1450: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1460: 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20 2a 70 70  Join);.  if( *pp
1470: 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70 45  Expr ){.    *ppE
1480: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
1490: 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70 72  (TK_AND, *ppExpr
14a0: 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , pE, 0);.  }els
14b0: 65 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  e{.    *ppExpr =
14c0: 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   pE;.  }.}../*.*
14d0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
14e0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
14f0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1500: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1510: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
1520: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1530: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
1540: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
1550: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
1560: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
1570: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
1580: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
1590: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
15a0: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
15b0: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
15c0: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
15d0: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
15e0: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
15f0: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
1600: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
1610: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
1620: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
1630: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
1640: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
1650: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
1660: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
1670: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
1680: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
1690: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
16a0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
16b0: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
16c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c  Expr *p){.  whil
16d0: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
16e0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
16f0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1700: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
1710: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20  pLeft);.    p = 
1720: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1730: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1740: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1750: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1760: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1770: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1780: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1790: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
17a0: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
17b0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
17c0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
17d0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
17e0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
17f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1800: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1810: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
1820: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
1830: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
1840: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1850: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72  eProcessJoin(Par
1860: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1870: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
1880: 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69  t *pSrc;.  int i
1890: 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  , j;.  pSrc = p-
18a0: 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
18b0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
18c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
18d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18e0: 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e  *pTerm = &pSrc->
18f0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
1900: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1910: 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61  Other = &pSrc->a
1920: 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [i+1];..    if( 
1930: 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c  pTerm->pTab==0 |
1940: 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d  | pOther->pTab==
1950: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1960: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1970: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1980: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
1990: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
19a0: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
19b0: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
19c0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
19d0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
19e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65    */.    if( pTe
19f0: 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rm->jointype & J
1a00: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
1a10: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
1a20: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1a30: 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70  >pOn || pTerm->p
1a40: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
1a50: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
1a60: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
1a70: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
1a80: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
1a90: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
1aa0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
1ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61  Tab = pTerm->pTa
1ae0: 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  b;.      for(j=0
1af0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1b00: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1b10: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f  ( columnIndex(pO
1b20: 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62  ther->pTab, pTab
1b30: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
1b40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1b50: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54   addWhereTerm(pT
1b60: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1b70: 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d  e, pTab, pOther-
1b80: 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72  >pTab, &p->pWher
1b90: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1ba0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1bb0: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
1bc0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
1bd0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
1be0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
1bf0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f     if( pTerm->pO
1c00: 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69  n && pTerm->pUsi
1c10: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1c20: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
1c30: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1c40: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1c50: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1c60: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1c70: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
1c80: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1c90: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
1ca0: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
1cb0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
1cc0: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
1cd0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64  ed by.    ** and
1ce0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1cf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1d00: 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  erm->pOn ){.    
1d10: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 54    setJoinExpr(pT
1d20: 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  erm->pOn);.     
1d30: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
1d40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1d50: 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e  pWhere = pTerm->
1d60: 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pOn;.      }else
1d70: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1d80: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
1d90: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65  (TK_AND, p->pWhe
1da0: 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c 20  re, pTerm->pOn, 
1db0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1dc0: 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20 30    pTerm->pOn = 0
1dd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1de0: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
1df0: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
1e00: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
1e10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
1e20: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
1e30: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
1e40: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
1e50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1e60: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
1e70: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
1e80: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
1e90: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
1ea0: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
1eb0: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
1ec0: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
1ed0: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
1ee0: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
1ef0: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
1f00: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
1f10: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
1f20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
1f30: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
1f40: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
1f50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1f60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1f70: 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67 20  ( pTerm->pUsing 
1f80: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
1f90: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  *pList;.      in
1fa0: 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1fb0: 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  t( i<pSrc->nSrc-
1fc0: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
1fd0: 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67   = pTerm->pUsing
1fe0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1ff0: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
2000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2010: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 65   columnIndex(pTe
2020: 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d  rm->pTab, pList-
2030: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 7c  >a[j].zName)<0 |
2040: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  |.            co
2050: 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65 72  lumnIndex(pOther
2060: 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61  ->pTab, pList->a
2070: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  [j].zName)<0 ){.
2080: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2090: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20a0: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
20b0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
20c0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
20d0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
20e0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
20f0: 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ", pList->a[j].z
2100: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2110: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
2130: 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74 2d  WhereTerm(pList-
2140: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 65  >a[j].zName, pTe
2150: 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65 72  rm->pTab, pOther
2160: 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ->pTab, &p->pWhe
2170: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2180: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2190: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
21a0: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
21b0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
21c0: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
21d0: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
21e0: 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74  oid sqliteSelect
21f0: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
2200: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
2210: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2220: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2230: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
2240: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
2250: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c  (p->pSrc);.  sql
2260: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
2270: 3e 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  >pWhere);.  sqli
2280: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
2290: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
22a0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
22b0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
22c0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
22d0: 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42  elete(p->pOrderB
22e0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  y);.  sqliteSele
22f0: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
2300: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  or);.  sqliteFre
2310: 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20  e(p->zSelect);. 
2320: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
2330: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2340: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e  the aggregate in
2350: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2360: 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75  he parse structu
2370: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
2380: 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  id sqliteAggrega
2390: 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73  teInfoReset(Pars
23a0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
23b0: 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d  liteFree(pParse-
23c0: 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65  >aAgg);.  pParse
23d0: 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
23e0: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
23f0: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
2400: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2410: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
2420: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
2430: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
2440: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
2450: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
2460: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
2470: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
2480: 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70  oSorter(Parse *p
2490: 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20  Parse, Vdbe *v, 
24a0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
24b0: 42 79 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f  By){.  char *zSo
24c0: 72 74 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69  rtOrder;.  int i
24d0: 3b 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d  ;.  zSortOrder =
24e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
24f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
2500: 20 31 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72   1 );.  if( zSor
2510: 74 4f 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75  tOrder==0 ) retu
2520: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
2530: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
2540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2550: 6f 72 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79  order = pOrderBy
2560: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2570: 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a  ;.    int type;.
2580: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
2590: 66 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49  f( (order & SQLI
25a0: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d  TE_SO_TYPEMASK)=
25b0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
25c0: 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  ){.      type = 
25d0: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
25e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f      }else if( (o
25f0: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
2600: 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49  _TYPEMASK)==SQLI
2610: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
2620: 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45     type = SQLITE
2630: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c  _SO_NUM;.    }el
2640: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  se if( pParse->d
2650: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
2660: 34 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20  4 ){.      type 
2670: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
2680: 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2690: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pExpr);.    }els
26a0: 65 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  e{.      type = 
26b0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
26c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72     }.    if( (or
26d0: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
26e0: 44 49 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  DIRMASK)==SQLITE
26f0: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  _SO_ASC ){.     
2700: 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54   c = type==SQLIT
2710: 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20  E_SO_TEXT ? 'A' 
2720: 3a 20 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65  : '+';.    }else
2730: 7b 0a 20 20 20 20 20 20 63 20 3d 20 74 79 70 65  {.      c = type
2740: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  ==SQLITE_SO_TEXT
2750: 20 3f 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20   ? 'D' : '-';.  
2760: 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64    }.    zSortOrd
2770: 65 72 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73  er[i] = c;.    s
2780: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
2790: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
27a0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[i].pExpr);.  }
27b0: 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f  .  zSortOrder[pO
27c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d  rderBy->nExpr] =
27d0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
27e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
27f0: 4d 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42  MakeKey, pOrderB
2800: 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
2810: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
2820: 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f  P3(v, -1, zSortO
2830: 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f  rder, strlen(zSo
2840: 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c  rtOrder));.  sql
2850: 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64  iteFree(zSortOrd
2860: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  er);.  sqliteVdb
2870: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2880: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
2890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
28a0: 6e 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67  ne adds a P3 arg
28b0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73  ument to the las
28c0: 74 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68  t VDBE opcode th
28d0: 61 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74  at was.** insert
28e0: 65 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d  ed. The P3 argum
28f0: 65 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73  ent added is a s
2900: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
2910: 6f 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61  or the .** OP_Ma
2920: 6b 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65  keKey or OP_Make
2930: 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20  IdxKey opcodes. 
2940: 20 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73   The string cons
2950: 69 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61  ists of.** chara
2960: 63 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27  cters 't' or 'n'
2970: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
2980: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2990: 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c   various.** fiel
29a0: 64 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f  ds of the key to
29b0: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68   be generated sh
29c0: 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20  ould be treated 
29d0: 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72  as numeric.** or
29e0: 20 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74   as text.  See t
29f0: 68 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e  he OP_MakeKey an
2a00: 64 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  d OP_MakeIdxKey 
2a10: 6f 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65  opcode.** docume
2a20: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  ntation for addi
2a30: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2a40: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20  on about the P3 
2a50: 73 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61  string..** See a
2a60: 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64  lso the sqliteAd
2a70: 64 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f  dIdxKeyType() ro
2a80: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
2a90: 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28  qliteAddKeyType(
2aa0: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2ab0: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e  t *pEList){.  in
2ac0: 74 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69  t nColumn = pELi
2ad0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61  st->nExpr;.  cha
2ae0: 72 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  r *zType = sqlit
2af0: 65 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e  eMalloc( nColumn
2b00: 2b 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  +1 );.  int i;. 
2b10: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
2b20: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2b30: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
2b40: 2b 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d  +){.    zType[i]
2b50: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70   = sqliteExprTyp
2b60: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
2b70: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
2b80: 5f 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27  _NUM ? 'n' : 't'
2b90: 3b 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d  ;.  }.  zType[i]
2ba0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64   = 0;.  sqliteVd
2bb0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
2bc0: 2c 20 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e  , zType, nColumn
2bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2be0: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
2bf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2c00: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2c10: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2c20: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2c30: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
2c50: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
2c60: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
2c70: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
2c80: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
2c90: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
2ca0: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
2cb0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
2cc0: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
2cd0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
2ce0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
2cf0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
2d00: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
2d10: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
2d20: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2d30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2d40: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2d50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2d60: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2d70: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2d80: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2da0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
2db0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2dc0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2dd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2de0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
2df0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
2e00: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
2e10: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
2e20: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
2e30: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
2e40: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
2e50: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
2e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e70: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
2e80: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
2e90: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2ea0: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
2eb0: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
2ec0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
2ed0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
2ee0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
2ef0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
2f00: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
2f10: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
2f20: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
2f30: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2f40: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
2f50: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
2f60: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
2f70: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
2f80: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
2f90: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
2fa0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2fc0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
2fd0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
2fe0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3000: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
3010: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
3020: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
3030: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3040: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
3050: 69 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  i;..  if( v==0 )
3060: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
3070: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
3080: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
3090: 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   was a LIMIT cla
30a0: 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  use on the SELEC
30b0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
30c0: 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20  n do the check. 
30d0: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68   ** to see if th
30e0: 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65  is row should be
30f0: 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
3100: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
3110: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4f  ){.    if( p->iO
3120: 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20  ffset>=0 ){.    
3130: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
3140: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
3150: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
3160: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3170: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
3180: 4f 66 66 73 65 74 2c 20 61 64 64 72 2b 32 29 3b  Offset, addr+2);
3190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
31a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
31b0: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
31c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31d0: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
31e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
31f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
3200: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
3210: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
3220: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
3230: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
3240: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
3250: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
3260: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3270: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
3280: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3290: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
32a0: 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d  rcTab, i);.    }
32b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
32c0: 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  olumn = pEList->
32d0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
32e0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
32f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
3300: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
3310: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
3320: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3330: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3340: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3350: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
3360: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3370: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
3380: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
3390: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
33a0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
33b0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
33c0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
33d0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  lt..  */.  if( d
33e0: 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45  istinct>=0 && pE
33f0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
3400: 6e 45 78 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e  nExpr>0 ){.#if N
3410: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
3420: 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 56 64  NCT.    sqliteVd
3430: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
3440: 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e  Null, -pEList->n
3450: 45 78 70 72 2c 20 73 71 6c 69 74 65 56 64 62 65  Expr, sqliteVdbe
3460: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
3470: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
3480: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3490: 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c   OP_MakeKey, pEL
34a0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a  ist->nExpr, 1);.
34b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
34c0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
34d0: 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65  =4 ) sqliteAddKe
34e0: 79 54 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29  yType(v, pEList)
34f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
3500: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3510: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3520: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
3530: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
3540: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3550: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69  (v, OP_Pop, pELi
3560: 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b  st->nExpr+1, 0);
3570: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3580: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3590: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
35a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
35b0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
35c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
35d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
35e0: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69  OP_PutStrKey, di
35f0: 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a  stinct, 0);.  }.
3600: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
3610: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
3620: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
3630: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
3640: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
3650: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3660: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3670: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3680: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
3690: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
36a0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
36b0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
36c0: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
36d0: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
36e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
36f0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3720: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
3730: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3740: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
3750: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
3760: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
3770: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
3780: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
3790: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
37a0: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
37b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
37c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
37d0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
37e0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
37f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3800: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3810: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3820: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3830: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3840: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3850: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
3860: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3870: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3880: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
3890: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
38a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
38b0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
38c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
38d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
38e0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
38f0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
3900: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
3910: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
3920: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
3930: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
3940: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
3950: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
3960: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
3970: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3980: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
3990: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
39a0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  pt: {.      int 
39b0: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
39c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
39d0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
39e0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
39f0: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3a00: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3a10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3a20: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
3a30: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
3a40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3a50: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
3a60: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3a80: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
3a90: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
3aa0: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
3ab0: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
3ac0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
3ad0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
3ae0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
3af0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
3b00: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
3b10: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
3b20: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
3b30: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
3b40: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3b50: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
3b60: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 56 64  addr1 = sqliteVd
3b70: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3b80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
3b90: 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  2;.      assert(
3ba0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
3bb0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3bc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
3bd0: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29  ll, -1, addr1+3)
3be0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3bf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3c00: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
3c10: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 56 64  addr2 = sqliteVd
3c20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3c30: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  to, 0, 0);.     
3c40: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3c50: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3c60: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3c70: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3ca0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
3cb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
3cc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3cd0: 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
3ce0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
3cf0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
3d00: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
3d10: 61 64 64 72 32 2c 20 73 71 6c 69 74 65 56 64 62  addr2, sqliteVdb
3d20: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
3d30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3d40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3d50: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
3d60: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
3d70: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
3d80: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
3d90: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
3da0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
3db0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
3dc0: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
3dd0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
3de0: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
3df0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
3e00: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
3e10: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3e30: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3e40: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3e50: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3e60: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3e70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3e80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3e90: 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
3ea0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
3eb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3ec0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3ed0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ef0: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3f00: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3f10: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3f20: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f30: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3f40: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3f50: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3f60: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3f70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f80: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b  Op(v, OP_SortMak
3f90: 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  eRec, nColumn, 0
3fa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3fb0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3fc0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3fd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3fe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
3ff0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
4000: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4010: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4020: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4030: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4040: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
4060: 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  ke a subroutine 
4070: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  to handle the re
4080: 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72  sults.  The subr
4090: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20  outine itself.  
40a0: 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69    ** is responsi
40b0: 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20  ble for popping 
40c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20  the results off 
40d0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
40e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
40f0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4100: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4110: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4120: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4130: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4140: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4150: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4160: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
4170: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
4180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
41a0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
41b0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
41c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
41d0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  }..    /* Discar
41e0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
41f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4200: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4210: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
4220: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
4230: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
4240: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
4250: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
4260: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
4270: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
4280: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
4290: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
42a0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
42b0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
42c0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
42d0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
42e0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
42f0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
4300: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
4310: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4320: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4330: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4360: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4370: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4380: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4390: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
43a0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
43b0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
43c0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
43d0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
43e0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
43f0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
4400: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
4410: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
4420: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
4430: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
4440: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4450: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4460: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4480: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4490: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
44a0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
44b0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
44c0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
44d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
44e0: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
44f0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4510: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
4520: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
4530: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
4540: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
4550: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
4560: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
4570: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
4580: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
4590: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
45a0: 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c  .  int end = sql
45b0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
45c0: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
45d0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
45e0: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
45f0: 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  n;.  sqliteVdbeA
4600: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
4610: 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d   0, 0);.  addr =
4620: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4630: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
4640: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69 66 28 20   0, end);.  if( 
4650: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b  p->iOffset>=0 ){
4660: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4670: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4680: 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  cr, p->iOffset, 
4690: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c  addr+4);.    sql
46a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
46b0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
46c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
46d0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
46e0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69  , addr);.  }.  i
46f0: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
4700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
4710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4720: 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Incr, p->iLimit,
4730: 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 77 69   end);.  }.  swi
4740: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
4750: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4760: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ack: {.      sql
4770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4780: 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c  OP_SortCallback,
4790: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
47a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
47b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
47c0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
47d0: 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20  T_TempTable: {. 
47e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
47f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
4800: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
4810: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4820: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4830: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4840: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4850: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
4860: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4880: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
4890: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
48a0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
48b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
48c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
48d0: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64 62  l, -1, sqliteVdb
48e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
48f0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
4900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4910: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
4920: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4930: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4940: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
4950: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4960: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4970: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4980: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
4990: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
49a0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
49b0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
49c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
49d0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
49e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
49f0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4a00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4a10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
4a20: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
4a30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4a40: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4a50: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 20 20   0, end);.      
4a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a70: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4a80: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
4a90: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
4aa0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
4ab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
4ac0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4ad0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
4ae0: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
4af0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4b00: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
4b10: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
4b20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4b30: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4b40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b50: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
4b60: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
4b70: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
4b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4b90: 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41   }.  sqliteVdbeA
4ba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4bb0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
4bc0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
4bd0: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73  bel(v, end);.  s
4be0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4bf0: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
4c00: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
4c10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4c20: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
4c30: 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74 79   VDBE the dataty
4c40: 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  pes of.** column
4c50: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4c60: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  set..**.** This 
4c70: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e  routine only gen
4c80: 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20 74  erates code if t
4c90: 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77 5f  he "PRAGMA show_
4ca0: 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a  datatypes=on".**
4cb0: 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75 74   has been execut
4cc0: 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79 70  ed.  The datatyp
4cd0: 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  es are reported 
4ce0: 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  out in the azCol
4cf0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f  .** parameter to
4d00: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4d10: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 72  nction.  The fir
4d20: 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74  st N azCol[] ent
4d30: 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  ries.** are the 
4d40: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
4d50: 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 65  umns, and the se
4d60: 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20 61  cond N entries a
4d70: 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  re the.** dataty
4d80: 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  pes for the colu
4d90: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  mns..**.** The "
4da0: 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61 20  datatype" for a 
4db0: 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20 61  result that is a
4dc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70   column of a typ
4dd0: 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  e is the.** data
4de0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
4df0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4e00: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
4e10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
4e20: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61  e datatype for a
4e30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4e40: 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20 4e  either TEXT or N
4e50: 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20  UMERIC.  The.** 
4e60: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20 52  datatype for a R
4e70: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
4e80: 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  TEGER..*/.static
4e90: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
4ea0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
4eb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4ec0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4ed0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
4ee0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
4ef0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
4f00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4f10: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
4f20: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
4f30: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
4f40: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
4f50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4f60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
4f70: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
4f80: 62 61 63 6b 20 26 26 20 28 70 50 61 72 73 65 2d  back && (pParse-
4f90: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
4fa0: 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 29  ITE_ReportTypes)
4fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
4fc0: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
4fd0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
4fe0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
4ff0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
5000: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
5010: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
5020: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
5030: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
5040: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
5050: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
5060: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
5070: 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ab;.      int iC
5080: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
5090: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
50a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
50b0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
50c0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
50d0: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
50e0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
50f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
5100: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
5110: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
5120: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5130: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
5140: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
5150: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
5160: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
5170: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
5180: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
5190: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
51a0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
51b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
51c0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
51d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
51e0: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zType;.      }. 
51f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5200: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 54 79  if( sqliteExprTy
5210: 70 65 28 70 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  pe(p)==SQLITE_SO
5220: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
5230: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
5240: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5250: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 4e        zType = "N
5260: 55 4d 45 52 49 43 22 3b 0a 20 20 20 20 20 20 7d  UMERIC";.      }
5270: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5280: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5290: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b  _ColumnName, i +
52a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
52b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
52c0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
52d0: 2c 20 7a 54 79 70 65 2c 20 30 29 3b 0a 20 20 7d  , zType, 0);.  }
52e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
52f0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
5300: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
5310: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
5320: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
5330: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
5340: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
5350: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
5360: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
5370: 61 6f 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  aolues in the ca
5380: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
5390: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
53a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
53b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
53c0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
53d0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
53e0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
53f0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
5400: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5410: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
5420: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
5430: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
5440: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5450: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5460: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66    int i, j;.  if
5470: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
5480: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
5490: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
54a0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
54b0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
54c0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 6f 72  esSet = 1;.  for
54d0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
54e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
54f0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 63 68   Expr *p;.    ch
5500: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
5510: 20 20 20 69 6e 74 20 73 68 6f 77 46 75 6c 6c 4e     int showFullN
5520: 61 6d 65 73 3b 0a 20 20 20 20 70 20 3d 20 70 45  ames;.    p = pE
5530: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5540: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
5550: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
5560: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
5570: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
5580: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
5590: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
55a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
55b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
55c0: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
55d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
55e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
55f0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
5600: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
5610: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
5620: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 3d   showFullNames =
5630: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
5640: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
5650: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
5660: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
5670: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
5680: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
5690: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
56a0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
56b0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
56c0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
56d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
56e0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
56f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
5700: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
5710: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
5720: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
5730: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
5740: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
5750: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
5760: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
5770: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
5780: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
5790: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
57a0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
57b0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
57c0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
57d0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
57e0: 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20  ROWID_";.       
57f0: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
5800: 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  R";.      }else{
5810: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
5820: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5830: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
5840: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
5850: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
5860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5870: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
5880: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21  ->span.z[0] && !
5890: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b  showFullNames ){
58a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
58b0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
58c0: 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e  dOp(v,OP_ColumnN
58d0: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
58e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
58f0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d  angeP3(v, -1, p-
5900: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
5910: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  .n);.        sql
5920: 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53  iteVdbeCompressS
5930: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
5940: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
5950: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
5960: 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73  || showFullNames
5970: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
5980: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
5990: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
59a0: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
59b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
59c0: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
59d0: 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d   if( showFullNam
59e0: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
59f0: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
5a00: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
5a10: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  teSetString(&zNa
5a20: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
5a30: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
5a40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5a50: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
5a60: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
5a70: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
5a80: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
5a90: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
5aa0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5ab0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
5ac0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ad0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5ae0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
5af0: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
5b00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
5b10: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43  angeP3(v, -1, zC
5b20: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ol, 0);.      }.
5b30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
5b40: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
5b50: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
5b60: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
5b70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50  teVdbeAddOp(v,OP
5b80: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
5b90: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5ba0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
5bb0: 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  -1, p->span.z, p
5bc0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
5bd0: 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72   sqliteVdbeCompr
5be0: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
5bf0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5c00: 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33      char zName[3
5c10: 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0];.      assert
5c20: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
5c30: 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  MN || pTabList==
5c40: 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  0 );.      sprin
5c50: 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  tf(zName, "colum
5c60: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
5c70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5c80: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
5c90: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
5ca0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5cb0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65  eP3(v, -1, zName
5cc0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
5cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5ce0: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
5cf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
5d00: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
5d10: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
5d20: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5d30: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
5d40: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
5d50: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
5d60: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
5d70: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
5d80: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
5d90: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5da0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
5db0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
5dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5dd0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
5de0: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
5df0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
5e00: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
5e10: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
5e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
5e30: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
5e40: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
5e50: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
5e60: 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   int fillInColum
5e70: 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65  nList(Parse*, Se
5e80: 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  lect*);../*.** G
5e90: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
5ea0: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
5eb0: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
5ec0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
5ed0: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
5ee0: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
5ef0: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
5f00: 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66  qliteResultSetOf
5f10: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
5f20: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
5f30: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
5f40: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
5f50: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
5f60: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
5f70: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
5f80: 2a 61 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 66 69  *aCol;..  if( fi
5f90: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
5fa0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
5fb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5fc0: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
5fd0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5fe0: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
5ff0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
6000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6010: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
6020: 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74  zTabName ? sqlit
6030: 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65  eStrDup(zTabName
6040: 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  ) : 0;.  pEList 
6050: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
6060: 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t;.  pTab->nCol 
6070: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
6080: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
6090: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61  >nCol>0 );.  pTa
60a0: 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d  b->aCol = aCol =
60b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
60c0: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
60d0: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20  [0])*pTab->nCol 
60e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
60f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
6100: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a  {.    Expr *p, *
6110: 70 52 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  pR;.    if( pELi
6120: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
6130: 7b 0a 20 20 20 20 20 20 61 43 6f 6c 5b 69 5d 2e  {.      aCol[i].
6140: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
6150: 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
6160: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ].zName);.    }e
6170: 6c 73 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73  lse if( (p=pELis
6180: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
6190: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
61a0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
61b0: 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20  R=p->pRight)!=0 
61c0: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  && pR->token.z &
61d0: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pR->token.z[0]
61e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   ){.      int cn
61f0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  t;.      sqliteS
6200: 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b  etNString(&aCol[
6210: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f  i].zName, pR->to
6220: 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e  ken.z, pR->token
6230: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  .n, 0);.      fo
6240: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
6250: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
6260: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
6270: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 61  aCol[j].zName, a
6280: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
6290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
62a0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 63  t n;.          c
62b0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
62c0: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
62d0: 7a 42 75 66 2c 22 5f 25 64 22 2c 2b 2b 63 6e 74  zBuf,"_%d",++cnt
62e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  );.          n =
62f0: 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20   strlen(zBuf);. 
6300: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
6310: 65 74 4e 53 74 72 69 6e 67 28 26 61 43 6f 6c 5b  etNString(&aCol[
6320: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52 2d 3e 74 6f  i].zName, pR->to
6330: 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74 6f 6b 65 6e  ken.z, pR->token
6340: 2e 6e 2c 20 7a 42 75 66 2c 20 6e 2c 30 29 3b 0a  .n, zBuf, n,0);.
6350: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31            j = -1
6360: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6370: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
6380: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
6390: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
63a0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
63b0: 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f  tring(&pTab->aCo
63c0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73  l[i].zName, p->s
63d0: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
63e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
63f0: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
6400: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
6410: 6e 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d  ntf(zBuf, "colum
6420: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
6430: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e    pTab->aCol[i].
6440: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
6450: 72 44 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20  rDup(zBuf);.    
6460: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
6470: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
6480: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
6490: 2a 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20  * For the given 
64a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
64b0: 2c 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67  , do three thing
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
64d0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
64e0: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
64f0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
6500: 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
6510: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74         defines t
6520: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
6530: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
6540: 73 63 61 6e 6e 65 64 2e 20 20 46 6f 72 20 76 69  scanned.  For vi
6550: 65 77 73 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ews,.**         
6560: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
6570: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
6580: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
6590: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
65a0: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
65b0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
65c0: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
65d0: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
65e0: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
65f0: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
6600: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
6610: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
6620: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
6630: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
6640: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
6650: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
6660: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
6670: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
6680: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
6690: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
66a0: 28 32 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (2)  Add terms t
66b0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
66c0: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
66d0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
66e0: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
66f0: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
6700: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
6710: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
6720: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63 61  *.**    (3)  Sca
6730: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
6740: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
6750: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
6760: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
6770: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
6780: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
6790: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
67a0: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
67b0: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
67c0: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
67d0: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
67e0: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
67f0: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
6800: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
6810: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
6820: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
6830: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
6840: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
6850: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
6860: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
6870: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
6880: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
6890: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
68a0: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
68b0: 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72  List(Parse *pPar
68c0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
68d0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72    int i, j, k, r
68e0: 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  c;.  SrcList *pT
68f0: 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
6900: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
6910: 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66  ble *pTab;..  if
6920: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72  ( p==0 || p->pSr
6930: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
6940: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
6950: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
6960: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
6970: 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
6980: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
6990: 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ble list..  */. 
69a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
69b0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
69c0: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  {.    if( pTabLi
69d0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b  st->a[i].pTab ){
69e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 72  .      /* This r
69f0: 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62  outine has run b
6a00: 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64 20  efore!  No need 
6a10: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20  to continue */. 
6a20: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6a30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
6a40: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
6a50: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e==0 ){.      /*
6a60: 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
6a70: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
6a80: 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
6a90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
6aa0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6ab0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect!=0 );.      
6ac0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
6ad0: 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a  i].zAlias==0 ){.
6ae0: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 46 61          char zFa
6af0: 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20  keName[60];.    
6b00: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61 6b      sprintf(zFak
6b10: 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  eName, "sqlite_s
6b20: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20  ubquery_%p_",.  
6b30: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
6b40: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6b50: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
6b60: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
6b70: 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  (&pTabList->a[i]
6b80: 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61  .zAlias, zFakeNa
6b90: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  me, 0);.      }.
6ba0: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6bb0: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
6bc0: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
6bd0: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
6be0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
6bf0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
6c00: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
6c30: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
6c40: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
6c50: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
6c60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6c70: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
6c80: 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67  isTransient flag
6c90: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
6ca0: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
6cb0: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
6cc0: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
6cd0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
6ce0: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
6cf0: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
6d00: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
6d10: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
6d20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
6d30: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
6d40: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
6d50: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
6d60: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
6d70: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
6d80: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20  ->isTransient = 
6d90: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
6da0: 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
6db0: 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
6dc0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
6dd0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
6de0: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
6df0: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
6e00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 4c 6f          sqliteLo
6e10: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
6e20: 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ,pTabList->a[i].
6e30: 7a 4e 61 6d 65 2c 70 54 61 62 4c 69 73 74 2d 3e  zName,pTabList->
6e40: 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[i].zDatabase);
6e50: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
6e60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
6e70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
6e80: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
6e90: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6ea0: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
6eb0: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
6ec0: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
6ed0: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
6ee0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 56       if( sqliteV
6ef0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
6f00: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
6f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
6f20: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
6f30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
6f40: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6f50: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
6f60: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
6f70: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
6f80: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
6f90: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
6fa0: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
6fb0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
6fc0: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
6fd0: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
6fe0: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
6ff0: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
7000: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
7010: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
7020: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7030: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
7040: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d  t->a[i].pSelect=
7050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7060: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
7070: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
7080: 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70  electDup(pTab->p
7090: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
70a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
70b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
70c0: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
70d0: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
70e0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
70f0: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
7100: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
7110: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
7120: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
7130: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
7140: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
7150: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
7160: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
7170: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
7180: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
7190: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
71a0: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
71b0: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
71c0: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
71d0: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
71e0: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
71f0: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
7200: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
7210: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
7220: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
7230: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
7240: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
7250: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7260: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
7270: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
7280: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
7290: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
72a0: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
72b0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
72c0: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
72d0: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
72e0: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
72f0: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
7300: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
7310: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
7320: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
7330: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
7340: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
7350: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
7360: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
7370: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
7380: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
7390: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
73a0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
73b0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
73c0: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
73d0: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
73e0: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
73f0: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
7400: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
7410: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
7420: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
7430: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
7440: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
7450: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
7460: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
7470: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
7480: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
7490: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
74a0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
74b0: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
74c0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
74d0: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
74e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
74f0: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
7500: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
7510: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
7520: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
7530: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
7540: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
7550: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
7560: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
7570: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
7580: 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
7590: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
75a0: 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
75b0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
75c0: 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
75d0: 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
75e0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
75f0: 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
7600: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
7610: 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
7620: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
7630: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
7640: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
7650: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
7660: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
7670: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
7680: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
7690: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
76a0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
76b0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
76c0: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
76d0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
76e0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
76f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
7700: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7710: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
7720: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
7730: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
7740: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
7750: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
7760: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
7770: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
7780: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
7790: 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  */.        Token
77a0: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *pName;        
77b0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
77c0: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
77d0: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
77e0: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
77f0: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
7800: 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d      pName = &pE-
7810: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
7820: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7830: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
7840: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
7850: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7860: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
7870: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7880: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
7890: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
78a0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
78b0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
78c0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
78d0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
78e0: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
78f0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
7900: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
7910: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
7920: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
7940: 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54 61  f( pName && (zTa
7950: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
7960: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
7990: 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d  Name->z, zTabNam
79a0: 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20  e, pName->n)!=0 
79b0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
79c0: 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61      zTabName[pNa
79d0: 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20  me->n]!=0) ){.  
79e0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
79f0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
7a00: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
7a10: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
7a20: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
7a30: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
7a50: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
7a60: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
7a70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
7a80: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
7a90: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
7aa0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
7ab0: 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   (pTabList->a[i-
7ac0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
7ad0: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  columnIndex(pTab
7b00: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61  List->a[i-1].pTa
7b10: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b30: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
7b40: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
7b50: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
7b60: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
7b70: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
7b80: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
7b90: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
7ba0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
7bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7bc0: 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 49 64   i>0 && sqliteId
7bd0: 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c 69  ListIndex(pTabLi
7be0: 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e  st->a[i-1].pUsin
7bf0: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c10: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
7c20: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
7c30: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
7c40: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
7c50: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
7c60: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
7c70: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
7c80: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
7c90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7cb0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
7cc0: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
7cd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
7ce0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
7cf0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
7d00: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
7d10: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b  token.z = zName;
7d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7d30: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  ght->token.n = s
7d40: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
7d50: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
7d60: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7d80: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 70 54 61   zTabName && pTa
7d90: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
7da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7db0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
7dc0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
7dd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7de0: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45   pExpr = sqliteE
7df0: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
7e00: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
7e20: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
7e30: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
7e40: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20   pLeft->token.z 
7e50: 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20  = zTabName;.    
7e60: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d            pLeft-
7e70: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
7e80: 6e 28 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  n(zTabName);.   
7e90: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7ea0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
7ec0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 28  qliteSetString((
7ed0: 63 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73  char**)&pExpr->s
7ee0: 70 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c  pan.z, zTabName,
7ef0: 20 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b   ".", zName, 0);
7f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7f10: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73  Expr->span.n = s
7f20: 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61  trlen(pExpr->spa
7f30: 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n.z);.          
7f40: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
7f50: 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  dyn = 1;.       
7f60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
7f70: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20  ken.z = 0;.     
7f80: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7f90: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20  token.n = 0;.   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7fb0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
7fd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7fe0: 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
7ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8000: 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45  pExpr->span = pE
8010: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  xpr->token;.    
8020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8030: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
8040: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
8050: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
8060: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8080: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
8090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
80a0: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   pName ){.      
80b0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
80c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
80d0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22   such table: %T"
80e0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
80f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
8110: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
8120: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
8130: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
8140: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
8150: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
8160: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8170: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
8180: 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20  lete(pEList);.  
8190: 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
81a0: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
81b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
81c0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72  is routine recur
81d0: 73 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74  sively unlinks t
81e0: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
81f0: 5b 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73  [].pTab pointers
8200: 0a 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20  .** in a select 
8210: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a  structure.  It j
8220: 75 73 74 20 73 65 74 73 20 74 68 65 20 70 6f 69  ust sets the poi
8230: 6e 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20  nters to NULL.  
8240: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
8250: 69 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 20  is recursive in 
8260: 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
8270: 66 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  f the Select.pSr
8280: 63 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a  c.a[].pSelect.**
8290: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
82a0: 4e 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69  NULL, this routi
82b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
82c0: 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74  ursively on that
82d0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
82e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
82f0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65  called on the Se
8300: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74  lect structure t
8310: 68 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a  hat defines a.**
8320: 20 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74   VIEW in order t
8330: 6f 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69  o undo any bindi
8340: 6e 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20  ngs to tables.  
8350: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
8360: 79 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f  y.** because tho
8370: 73 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20  se tables might 
8380: 62 65 20 44 52 4f 50 65 64 20 62 79 20 61 20 73  be DROPed by a s
8390: 75 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f  ubsequent SQL co
83a0: 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65  mmand..** If the
83b0: 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f   bindings are no
83c0: 74 20 72 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20  t removed, then 
83d0: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2d  the Select.pSrc-
83e0: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a  >a[].pTab field.
83f0: 2a 2a 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  ** will be left 
8400: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 64 65  pointing to a de
8410: 61 6c 6c 6f 63 61 74 65 64 20 54 61 62 6c 65 20  allocated Table 
8420: 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 20  structure after 
8430: 74 68 65 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20  the.** DROP and 
8440: 61 20 63 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20  a coredump will 
8450: 6f 63 63 75 72 20 74 68 65 20 6e 65 78 74 20 74  occur the next t
8460: 69 6d 65 20 74 68 65 20 56 49 45 57 20 69 73 20  ime the VIEW is 
8470: 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
8480: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
8490: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
84a0: 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
84b0: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
84c0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
84d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
84e0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
84f0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
8500: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61  +){.    if( (pTa
8510: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  b = pSrc->a[i].p
8520: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
8530: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
8540: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
8550: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
8560: 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20  ble(0, pTab);.  
8570: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 72 63      }.      pSrc
8580: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b  ->a[i].pTab = 0;
8590: 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d  .      if( pSrc-
85a0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b  >a[i].pSelect ){
85b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
85c0: 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 72 63  electUnbind(pSrc
85d0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
85e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
85f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
8600: 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61   routine associa
8610: 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61  tes entries in a
8620: 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  n ORDER BY expre
8630: 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a  ssion list with.
8640: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20  ** columns in a 
8650: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63  result.  For eac
8660: 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  h ORDER BY expre
8670: 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64  ssion, the opcod
8680: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d  e of.** the top-
8690: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68  level node is ch
86a0: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
86b0: 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75  MN and the iColu
86c0: 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  mn value of.** t
86d0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
86e0: 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  e is filled in w
86f0: 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ith column numbe
8700: 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65  r and the iTable
8710: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
8720: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
8730: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69  is filled with i
8740: 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e  Table parameter.
8750: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
8760: 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54  are prior SELECT
8770: 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61   clauses, they a
8780: 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72  re processed fir
8790: 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20  st.  A match.** 
87a0: 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45  in an earlier SE
87b0: 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65  LECT takes prece
87c0: 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74  dence over a lat
87d0: 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a  er SELECT..**.**
87e0: 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20   Any entry that 
87f0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69  does not match i
8800: 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20  s flagged as an 
8810: 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62  error.  The numb
8820: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20  er.** of errors 
8830: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
8840: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8850: 64 6f 65 73 20 4e 4f 54 20 63 6f 72 72 65 63 74  does NOT correct
8860: 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  ly initialize th
8870: 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65 20  e Expr.dataType 
8880: 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65   field.** of the
8890: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
88a0: 73 69 6f 6e 73 2e 20 20 54 68 65 20 6d 75 6c 74  sions.  The mult
88b0: 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72  iSelectSortOrder
88c0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  () routine.** mu
88d0: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  st be called to 
88e0: 64 6f 20 74 68 61 74 20 61 66 74 65 72 20 74 68  do that after th
88f0: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  e individual sel
8900: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ect statements.*
8910: 2a 20 68 61 76 65 20 61 6c 6c 20 62 65 65 6e 20  * have all been 
8920: 61 6e 61 6c 79 7a 65 64 2e 20 20 54 68 69 73 20  analyzed.  This 
8930: 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 61 62 6c  routine is unabl
8940: 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 45 78 70  e to compute Exp
8950: 72 2e 64 61 74 61 54 79 70 65 0a 2a 2a 20 62 65  r.dataType.** be
8960: 63 61 75 73 65 20 69 74 20 6d 75 73 74 20 62 65  cause it must be
8970: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74   called before t
8980: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  he individual se
8990: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 0a  lect statements.
89a0: 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 6e 61  ** have been ana
89b0: 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  lyzed..*/.static
89c0: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
89d0: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
89e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
89f0: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
8a00: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
8a10: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
8a20: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
8a30: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
8a40: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
8a50: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
8a60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
8a70: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
8a80: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
8a90: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
8aa0: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
8ab0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
8ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
8ad0: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
8ae0: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
8af0: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
8b00: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
8b10: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
8b20: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
8b30: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
8b40: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
8b50: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
8b60: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
8b70: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
8b80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
8b90: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
8ba0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
8bb0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
8bc0: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
8bd0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
8be0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c   }.  }.  if( fil
8bf0: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
8c00: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
8c10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
8c20: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
8c30: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
8c40: 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62   if( matchOrderb
8c50: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
8c60: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  , pSelect->pPrio
8c70: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61  r, pOrderBy, iTa
8c80: 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
8c90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8ca0: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
8cb0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
8cc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
8cd0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8ce0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
8cf0: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
8d00: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  i].pExpr;.    in
8d10: 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  t iCol = -1;.   
8d20: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
8d30: 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  [i].done ) conti
8d40: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
8d50: 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72  iteExprIsInteger
8d60: 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20  (pE, &iCol) ){. 
8d70: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30       if( iCol<=0
8d80: 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
8d90: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
8da0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
8db0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
8dc0: 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73     "ORDER BY pos
8dd0: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
8de0: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
8df0: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
8e00: 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
8e10: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
8e20: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
8e30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8e40: 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70     if( !mustComp
8e50: 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lete ) continue;
8e60: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
8e70: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
8e80: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
8e90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
8ea0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
8eb0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
8ec0: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
8ed0: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
8ee0: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
8ef0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
8f00: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
8f10: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
8f20: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
8f30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
8f40: 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20  >token.z );.    
8f50: 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c      zLabel = sql
8f60: 69 74 65 53 74 72 4e 44 75 70 28 70 45 2d 3e 74  iteStrNDup(pE->t
8f70: 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65  oken.z, pE->toke
8f80: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n.n);.        sq
8f90: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 61 62  liteDequote(zLab
8fa0: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  el);.        if(
8fb0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
8fc0: 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30  Name, zLabel)==0
8fd0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69   ){ .          i
8fe0: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  Col = j;.       
8ff0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
9000: 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20  eFree(zLabel);. 
9010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9020: 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74   iCol<0 && sqlit
9030: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c  eExprCompare(pE,
9040: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45   pEList->a[j].pE
9050: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
9060: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
9070: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9080: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
9090: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
90a0: 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  UMN;.      pE->i
90b0: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
90c0: 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20       pE->iTable 
90d0: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  = iTable;.      
90e0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
90f0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  one = 1;.    }. 
9100: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
9110: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
9120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
9130: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
9140: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
9150: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
9160: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
9170: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
9180: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
9190: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
91a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
91b0: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
91c0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
91d0: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
91e0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
91f0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
9200: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
9210: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
9220: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
9230: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
9240: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
9250: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
9260: 65 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  eGetVdbe(Parse *
9270: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
9280: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
9290: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
92a0: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
92b0: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
92c0: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
92d0: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
92e0: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn v;.}../*.**
92f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
9300: 74 73 20 74 68 65 20 45 78 70 72 2e 64 61 74 61  ts the Expr.data
9310: 54 79 70 65 20 66 69 65 6c 64 20 6f 6e 20 61 6c  Type field on al
9320: 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 2a 2a  l elements of.**
9330: 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 65 78   the pOrderBy ex
9340: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
9350: 54 68 65 20 70 4f 72 64 65 72 42 79 20 6c 69 73  The pOrderBy lis
9360: 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  t will have been
9370: 0a 2a 2a 20 73 65 74 20 75 70 20 62 79 20 6d 61  .** set up by ma
9380: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
9390: 6d 6e 28 29 2e 20 20 48 65 6e 63 65 20 65 61 63  mn().  Hence eac
93a0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  h expression has
93b0: 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20  .** a TK_COLUMN 
93c0: 61 73 20 69 74 73 20 72 6f 6f 74 20 6e 6f 64 65  as its root node
93d0: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c  .  The Expr.iCol
93e0: 75 6d 6e 20 72 65 66 65 72 73 20 74 6f 20 61 20  umn refers to a 
93f0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  .** column in th
9400: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 20  e result set.   
9410: 54 68 65 20 64 61 74 61 74 79 70 65 20 69 73 20  The datatype is 
9420: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f  set to SQLITE_SO
9430: 5f 54 45 58 54 0a 2a 2a 20 69 66 20 74 68 65 20  _TEXT.** if the 
9440: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
9450: 6c 75 6d 6e 20 69 6e 20 70 20 61 6e 64 20 65 76  lumn in p and ev
9460: 65 72 79 20 53 45 4c 45 43 54 20 74 6f 20 74 68  ery SELECT to th
9470: 65 20 6c 65 66 74 20 6f 66 0a 2a 2a 20 70 20 68  e left of.** p h
9480: 61 73 20 61 20 64 61 74 61 74 79 70 65 20 6f 66  as a datatype of
9490: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 2e   SQLITE_SO_TEXT.
94a0: 20 20 49 66 20 74 68 65 20 63 6f 6f 72 65 73 73    If the cooress
94b0: 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 0a 2a  ponding column.*
94c0: 2a 20 69 6e 20 70 20 6f 72 20 61 6e 79 20 6f 66  * in p or any of
94d0: 20 74 68 65 20 6c 65 66 74 20 53 45 4c 45 43 54   the left SELECT
94e0: 73 20 69 73 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  s is SQLITE_SO_N
94f0: 55 4d 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  UM, then the dat
9500: 61 74 79 70 65 0a 2a 2a 20 6f 66 20 74 68 65 20  atype.** of the 
9510: 6f 72 64 65 72 2d 62 79 20 65 78 70 72 65 73 73  order-by express
9520: 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 53 51  ion is set to SQ
9530: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a 0a  LITE_SO_NUM..**.
9540: 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  ** Examples:.**.
9550: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
9560: 42 4c 45 20 6f 6e 65 28 61 20 49 4e 54 45 47 45  BLE one(a INTEGE
9570: 52 2c 20 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20  R, b TEXT);.**  
9580: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9590: 74 77 6f 28 63 20 56 41 52 43 48 41 52 28 35 29  two(c VARCHAR(5)
95a0: 2c 20 64 20 46 4c 4f 41 54 29 3b 0a 2a 2a 0a 2a  , d FLOAT);.**.*
95b0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 62 2c 20  *     SELECT b, 
95c0: 62 20 46 52 4f 4d 20 6f 6e 65 20 55 4e 49 4f 4e  b FROM one UNION
95d0: 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46 52 4f   SELECT d, c FRO
95e0: 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59 20 31  M two ORDER BY 1
95f0: 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  , 2;.**.** The p
9600: 72 69 6d 61 72 79 20 73 6f 72 74 20 6b 65 79 20  rimary sort key 
9610: 77 69 6c 6c 20 75 73 65 20 53 51 4c 49 54 45 5f  will use SQLITE_
9620: 53 4f 5f 4e 55 4d 20 62 65 63 61 75 73 65 20 74  SO_NUM because t
9630: 68 65 20 22 64 22 20 69 6e 0a 2a 2a 20 74 68 65  he "d" in.** the
9640: 20 73 65 63 6f 6e 64 20 53 45 4c 45 43 54 20 69   second SELECT i
9650: 73 20 6e 75 6d 65 72 69 63 2e 20 20 54 68 65 20  s numeric.  The 
9660: 31 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  1st column of th
9670: 65 20 66 69 72 73 74 20 53 45 4c 45 43 54 0a 2a  e first SELECT.*
9680: 2a 20 69 73 20 74 65 78 74 20 62 75 74 20 74 68  * is text but th
9690: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  at does not matt
96a0: 65 72 20 62 65 63 61 75 73 65 20 61 20 6e 75 6d  er because a num
96b0: 65 72 69 63 20 61 6c 77 61 79 73 20 6f 76 65 72  eric always over
96c0: 72 69 64 65 73 0a 2a 2a 20 61 20 74 65 78 74 2e  rides.** a text.
96d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
96e0: 64 61 72 79 20 6b 65 79 20 77 69 6c 6c 20 75 73  dary key will us
96f0: 65 20 74 68 65 20 53 51 4c 49 54 45 5f 53 4f 5f  e the SQLITE_SO_
9700: 54 45 58 54 20 73 6f 72 74 20 6f 72 64 65 72 20  TEXT sort order 
9710: 62 65 63 61 75 73 65 0a 2a 2a 20 62 6f 74 68 20  because.** both 
9720: 74 68 65 20 28 73 65 63 6f 6e 64 29 20 22 62 22  the (second) "b"
9730: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 53 45   in the first SE
9740: 4c 45 43 54 20 61 6e 64 20 74 68 65 20 22 63 22  LECT and the "c"
9750: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
9760: 2a 20 53 45 4c 45 43 54 20 68 61 76 65 20 61 20  * SELECT have a 
9770: 64 61 74 61 74 79 70 65 20 6f 66 20 74 65 78 74  datatype of text
9780: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
9790: 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72  d multiSelectSor
97a0: 74 4f 72 64 65 72 28 53 65 6c 65 63 74 20 2a 70  tOrder(Select *p
97b0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64  , ExprList *pOrd
97c0: 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erBy){.  int i;.
97d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
97e0: 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  st;.  if( pOrder
97f0: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  By==0 ) return;.
9800: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
9810: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
9820: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9830: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  +){.      pOrder
9840: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  By->a[i].pExpr->
9850: 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54  dataType = SQLIT
9860: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d  E_SO_TEXT;.    }
9870: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9880: 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f  .  multiSelectSo
9890: 72 74 4f 72 64 65 72 28 70 2d 3e 70 50 72 69 6f  rtOrder(p->pPrio
98a0: 72 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r, pOrderBy);.  
98b0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
98c0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
98d0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
98e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
98f0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
9900: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
9910: 20 69 66 28 20 70 45 2d 3e 64 61 74 61 54 79 70   if( pE->dataTyp
9920: 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  e==SQLITE_SO_NUM
9930: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9940: 20 61 73 73 65 72 74 28 20 70 45 2d 3e 69 43 6f   assert( pE->iCo
9950: 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 69  lumn>=0 );.    i
9960: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
9970: 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  >pE->iColumn ){.
9980: 20 20 20 20 20 20 70 45 2d 3e 64 61 74 61 54 79        pE->dataTy
9990: 70 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 54  pe = sqliteExprT
99a0: 79 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ype(pEList->a[pE
99b0: 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
99c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
99d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
99e0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
99f0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
9a00: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
9a10: 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c 69 6d 69 74  on the.** nLimit
9a20: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 66 69 65   and nOffset fie
9a30: 6c 64 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64  lds.  nLimit and
9a40: 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   nOffset hold th
9a50: 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 74 68  e integers.** th
9a60: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
9a70: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
9a80: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
9a90: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
9aa0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
9ab0: 20 4f 72 20 74 68 61 74 20 68 6f 6c 64 20 2d 31   Or that hold -1
9ac0: 20 61 6e 64 20 30 20 69 66 20 74 68 6f 73 65 20   and 0 if those 
9ad0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
9ae0: 74 74 65 64 2e 0a 2a 2a 20 69 4c 69 6d 69 74 20  tted..** iLimit 
9af0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
9b00: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
9b10: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
9b20: 65 72 73 20 66 6f 72 0a 2a 2a 20 63 6f 75 6e 74  ers for.** count
9b30: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
9b40: 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  ute the limit an
9b50: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
9b60: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6c 69 6d  ere is no.** lim
9b70: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
9b80: 2c 20 74 68 65 6e 20 69 4c 69 6d 69 74 20 61 6e  , then iLimit an
9b90: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
9ba0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
9bb0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
9bc0: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66  es the values if
9bd0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
9be0: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
9bf0: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
9c00: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e   is defined by n
9c10: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
9c20: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
9c30: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
9c40: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
9c50: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
9c60: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
9c70: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
9c80: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
9c90: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
9ca0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
9cb0: 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e   Only if nLimit>
9cc0: 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20  =0 or nOffset>0 
9cd0: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
9ce0: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
9cf0: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
9d00: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
9d10: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
9d20: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
9d30: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
9d40: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
9d50: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
9d60: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
9d70: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
9d80: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
9d90: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
9da0: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
9db0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
9dc0: 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  t *p){.  /* .  *
9dd0: 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69  * If the compari
9de0: 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74  son is p->nLimit
9df0: 3e 30 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30  >0 then "LIMIT 0
9e00: 22 20 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c  " shows.  ** all
9e10: 20 72 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68   rows.  It is th
9e20: 65 20 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d  e same as no lim
9e30: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61  it. If the compa
9e40: 72 69 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70  rision is.  ** p
9e50: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 74 68 65 6e  ->nLimit>=0 then
9e60: 20 22 4c 49 4d 49 54 20 30 22 20 73 68 6f 77 20   "LIMIT 0" show 
9e70: 6e 6f 20 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a  no rows at all..
9e80: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
9e90: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
9ea0: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
9eb0: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
9ec0: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
9ed0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
9ee0: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
9ef0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
9f00: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
9f10: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
9f20: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
9f30: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
9f40: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  /.  if( p->nLimi
9f50: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t>=0 ){.    int 
9f60: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
9f70: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
9f80: 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
9f90: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
9fa0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
9fb0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  n;.    sqliteVdb
9fc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
9fd0: 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74  eger, -p->nLimit
9fe0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
9ff0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a000: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
a010: 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69  1);.    p->iLimi
a020: 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20  t = iMem;.  }.  
a030: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
a040: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d   ){.    int iMem
a050: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a060: 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  +;.    Vdbe *v =
a070: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
a080: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
a090: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
a0a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a0b0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
a0c0: 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30  , -p->nOffset, 0
a0d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
a0e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
a0f0: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b  Store, iMem, 1);
a100: 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  .    p->iOffset 
a110: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iMem;.  }.}../
a120: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a130: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
a140: 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74  rocess a query t
a150: 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68  hat is really th
a160: 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e  e union.** or in
a170: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77  tersection of tw
a180: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
a190: 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  te queries..**.*
a1a0: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
a1b0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
a1c0: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
a1d0: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
a1e0: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
a1f0: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
a200: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
a210: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
a220: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
a230: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
a240: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
a250: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
a260: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
a270: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
a280: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
a290: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
a2a0: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
a2b0: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
a2c0: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
a2d0: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
a2e0: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
a2f0: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
a300: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
a310: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
a320: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
a330: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
a340: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
a350: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
a360: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
a370: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
a380: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
a390: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
a3a0: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
a3b0: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
a3c0: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
a3d0: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
a3e0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
a3f0: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
a400: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
a410: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
a420: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
a430: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
a440: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
a450: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
a460: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
a470: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
a480: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
a490: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
a4a0: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
a4b0: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
a4c0: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
a4d0: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
a4e0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
a4f0: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
a500: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
a510: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
a520: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
a530: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
a540: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
a550: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
a560: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
a570: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
a580: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
a590: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
a5a0: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
a5b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
a5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63           /* Succ
a5d0: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
a5e0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
a5f0: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
a600: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
a610: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
a620: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
a630: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
a640: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
a650: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
a660: 56 44 42 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  VDBE */..  /* Ma
a670: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
a680: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
a690: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
a6a0: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
a6b0: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
a6c0: 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  st SELECT in the
a6d0: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
a6e0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
a6f0: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
a700: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
a710: 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
a720: 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  1;.  pPrior = p-
a730: 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70  >pPrior;.  if( p
a740: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
a750: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
a760: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
a770: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
a780: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
a790: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
a7a0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
a7b0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
a7c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
a7d0: 69 66 28 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d  if( pPrior->nLim
a7e0: 69 74 3e 3d 30 20 7c 7c 20 70 50 72 69 6f 72 2d  it>=0 || pPrior-
a7f0: 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20  >nOffset>0 ){.  
a800: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
a810: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
a820: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
a830: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
a840: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
a850: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
a860: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
a870: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
a880: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
a890: 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69  valid query engi
a8a0: 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65  ne.  If not, cre
a8b0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
a8c0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
a8d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a8e0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
a8f0: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72  turn 1;..  /* Cr
a900: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
a910: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
a920: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
a930: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  y.  */.  if( eDe
a940: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
a950: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
a960: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
a970: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
a980: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
a990: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
a9a0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
a9b0: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
a9c0: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
a9d0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
a9e0: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
a9f0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
aa00: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
aa10: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
aa20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 69   ){.        pPri
aa30: 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->nLimit = p->
aa40: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  nLimit;.        
aa50: 70 50 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 20  pPrior->nOffset 
aa60: 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  = p->nOffset;.  
aa70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aa80: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
aa90: 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69  pPrior, eDest, i
aaa0: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Parm, 0, 0, 0);.
aab0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
aac0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
aad0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
aae0: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
aaf0: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
ab00: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
ab10: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
ab20: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
ab30: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
ab40: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   -1;.        p->
ab50: 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
ab60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ab70: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ab80: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
ab90: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
aba0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
abb0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
abc0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
abd0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
abe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
abf0: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
ac00: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
ac10: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
ac20: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
ac30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ac40: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
ac50: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
ac60: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
ac70: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
ac80: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
ac90: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
aca0: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
acb0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
acc0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
acd0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
ace0: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
acf0: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
ad00: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
ad10: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
ad20: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
ad30: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
ad40: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
ad50: 74 2c 20 6e 4f 66 66 73 65 74 3b 20 2f 2a 20 53  t, nOffset; /* S
ad60: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
ad70: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
ad80: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
ad90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ada0: 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44  rBy;  /* The ORD
adb0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
adc0: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
add0: 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f  T */..      prio
ade0: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
adf0: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
ae00: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
ae10: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
ae20: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
ae30: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 6e 4c  erBy==0 && p->nL
ae40: 69 6d 69 74 3c 30 20 26 26 20 70 2d 3e 6e 4f 66  imit<0 && p->nOf
ae50: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
ae60: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
ae70: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
ae80: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
ae90: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
aea0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
aeb0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
aec0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
aed0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
aee0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
aef0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
af00: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
af10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
af20: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
af30: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
af40: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
af50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
af60: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
af70: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
af80: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
af90: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
afa0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
afb0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
afc0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
afd0: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
afe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
aff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b000: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
b010: 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ALL ){.         
b020: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b030: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
b040: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
b050: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
b060: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
b070: 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54  eyAsData, unionT
b080: 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ab, 1);.        
b090: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b0a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b0b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
b0c0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
b0d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b0e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
b0f0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
b100: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
b110: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
b120: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
b130: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
b140: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
b150: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nTab, 0, 0, 0);.
b160: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
b170: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
b180: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
b190: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
b1a0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
b1b0: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
b1c0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
b1d0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
b1e0: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
b1f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b200: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
b210: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
b220: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
b230: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
b240: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
b250: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
b260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b270: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
b280: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
b290: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
b2a0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
b2b0: 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69 74   0;.      nLimit
b2c0: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
b2d0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
b2e0: 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73 65  -1;.      nOffse
b2f0: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
b300: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
b310: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
b320: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
b330: 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69  arse, p, op, uni
b340: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b  onTab, 0, 0, 0);
b350: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
b360: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
b370: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
b380: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
b390: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69  ->nLimit = nLimi
b3a0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66  t;.      p->nOff
b3b0: 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a 20  set = nOffset;. 
b3c0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
b3d0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
b3e0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
b3f0: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
b400: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
b410: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
b420: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
b430: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
b440: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
b450: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
b460: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
b470: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
b480: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
b490: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
b4a0: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
b4b0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
b4c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
b4d0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
b4e0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
b4f0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
b500: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
b510: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
b520: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
b530: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
b540: 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c   p->pSrc, p->pEL
b550: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
b560: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
b570: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
b580: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
b590: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56   iCont = sqliteV
b5a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b5b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b5c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
b5d0: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
b5e0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b5f0: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
b600: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
b610: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  p);.        iSta
b620: 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  rt = sqliteVdbeC
b630: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
b640: 20 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c 65         multiSele
b650: 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20 70  ctSortOrder(p, p
b660: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
b670: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
b680: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
b690: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
b6a0: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
b6b0: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
b6e0: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
b6f0: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
b720: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  eak);.        if
b730: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b  ( rc ) return 1;
b740: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b750: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b760: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
b770: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b780: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  Op(v, OP_Next, u
b790: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
b7a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b7b0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b7c0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
b7d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b7e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
b7f0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
b800: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
b810: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
b820: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
b830: 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70  tTail(p, v, p->p
b840: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
b850: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
b860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b880: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
b890: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
b8a0: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
b8b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
b8c0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
b8d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
b8e0: 69 74 2c 20 6e 4f 66 66 73 65 74 3b 0a 0a 20 20  it, nOffset;..  
b8f0: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
b900: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
b910: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
b920: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
b930: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
b940: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
b950: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
b960: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
b970: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
b980: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
b990: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
b9a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b9b0: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
b9c0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
b9d0: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
b9e0: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
b9f0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ->pOrderBy && ma
ba00: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
ba10: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70  mn(pParse,p,p->p
ba20: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
ba30: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ba40: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
ba50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ba60: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
ba70: 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20  p, tab1, 1);.   
ba80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ba90: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
baa0: 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20  ta, tab1, 1);.. 
bab0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
bac0: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
bad0: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
bae0: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
baf0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bb00: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
bb10: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
bb20: 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  r, SRT_Union, ta
bb30: 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b1, 0, 0, 0);.  
bb40: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
bb50: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
bb60: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
bb70: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
bb80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
bb90: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
bba0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
bbb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
bbc0: 65 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20  emp, tab2, 1);. 
bbd0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
bbe0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
bbf0: 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a  Data, tab2, 1);.
bc00: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
bc10: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c 69 6d 69  = 0;.      nLimi
bc20: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
bc30: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
bc40: 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f 66 66 73   -1;.      nOffs
bc50: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
bc60: 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
bc70: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
bc80: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
bc90: 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e  Parse, p, SRT_Un
bca0: 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c  ion, tab2, 0, 0,
bcb0: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
bcc0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
bcd0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
bce0: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   nLimit;.      p
bcf0: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66  ->nOffset = nOff
bd00: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
bd10: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
bd20: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
bd30: 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
bd40: 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
bd50: 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
bd60: 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
bd70: 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
bd80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
bd90: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
bda0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
bdb0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
bdc0: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
bdd0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
bde0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
bdf0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
be00: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
be10: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
be20: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
be30: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
be40: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
be50: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
be60: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  t = sqliteVdbeMa
be70: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
be80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
be90: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
bea0: 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20  tab1, iBreak);. 
beb0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
bec0: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
bed0: 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53 74  e, p);.      iSt
bee0: 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  art = sqliteVdbe
bef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c  AddOp(v, OP_Full
bf00: 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  Key, tab1, 0);. 
bf10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
bf20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
bf30: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
bf40: 29 3b 0a 20 20 20 20 20 20 6d 75 6c 74 69 53 65  );.      multiSe
bf50: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c  lectSortOrder(p,
bf60: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
bf70: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
bf80: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
bf90: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
bfa0: 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
bfb0: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
bfe0: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
bff0: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29    iCont, iBreak)
c020: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c030: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
c040: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
c050: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
c060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
c070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
c080: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
c090: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c0a0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c0b0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
c0c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c0d0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
c0e0: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
c0f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c100: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
c110: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
c120: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
c130: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
c140: 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70  SortTail(p, v, p
c150: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
c160: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
c170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c180: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c190: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c1a0: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
c1b0: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
c1c0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
c1d0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
c1e0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
c1f0: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
c200: 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
c210: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
c220: 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
c230: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
c240: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
c250: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
c260: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
c270: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75  ->op));.    retu
c280: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
c290: 49 73 73 75 65 20 61 20 6e 75 6c 6c 20 63 61 6c  Issue a null cal
c2a0: 6c 62 61 63 6b 20 69 66 20 74 68 61 74 20 69 73  lback if that is
c2b0: 20 77 68 61 74 20 74 68 65 20 75 73 65 72 20 77   what the user w
c2c0: 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ants..  */.  if(
c2d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
c2e0: 62 61 63 6b 20 2f 2a 20 26 26 0a 20 20 20 20 28  back /* &&.    (
c2f0: 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62  pParse->useCallb
c300: 61 63 6b 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ack==0 || (pPars
c310: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
c320: 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
c330: 63 6b 29 21 3d 30 29 20 2a 2f 0a 20 20 29 7b 0a  ck)!=0) */.  ){.
c340: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c350: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61  dOp(v, OP_NullCa
c360: 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 45 4c 69 73  llback, p->pELis
c370: 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  t->nExpr, 0);.  
c380: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
c390: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
c3a0: 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
c3b0: 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
c3c0: 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
c3d0: 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
c3e0: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
c3f0: 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
c400: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
c410: 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
c420: 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
c430: 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
c440: 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
c450: 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
c460: 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
c470: 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
c480: 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
c490: 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
c4a0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
c4b0: 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
c4c0: 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
c4d0: 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
c4e0: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
c4f0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
c500: 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
c510: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
c520: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
c530: 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
c540: 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
c550: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
c560: 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
c570: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
c580: 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
c590: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
c5a0: 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
c5b0: 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
c5c0: 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
c5d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
c5e0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
c5f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c600: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
c610: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
c620: 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ist*);  /* Forwa
c630: 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
c640: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
c650: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
c660: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
c670: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
c680: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
c690: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
c6a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
c6b0: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
c6c0: 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
c6d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
c6e0: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
c6f0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
c700: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
c710: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
c720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c730: 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
c740: 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
c750: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
c760: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
c770: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
c780: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
c790: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
c7a0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
c7b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
c7c0: 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
c7d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c7e0: 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
c7f0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
c800: 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 70 45 78  w->op;.      pEx
c810: 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70  pr->dataType = p
c820: 4e 65 77 2d 3e 64 61 74 61 54 79 70 65 3b 0a 20  New->dataType;. 
c830: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
c840: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
c850: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
c860: 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ft = sqliteExprD
c870: 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b  up(pNew->pLeft);
c880: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c890: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
c8a0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
c8b0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
c8c0: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
c8d0: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
c8e0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
c8f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
c900: 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
c910: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e  teExprListDup(pN
c920: 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ew->pList);.    
c930: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
c940: 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a  = pNew->iTable;.
c950: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
c960: 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f  lumn = pNew->iCo
c970: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70  lumn;.      pExp
c980: 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e  r->iAgg = pNew->
c990: 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69  iAgg;.      sqli
c9a0: 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  teTokenCopy(&pEx
c9b0: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
c9c0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
c9d0: 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28  sqliteTokenCopy(
c9e0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
c9f0: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
ca00: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
ca10: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
ca20: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
ca30: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
ca40: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69  tExpr(pExpr->pRi
ca50: 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
ca60: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
ca70: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
ca80: 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
ca90: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
caa0: 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45  tic void .substE
cab0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
cac0: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
cad0: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
cae0: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  EList){.  int i;
caf0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
cb00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
cb10: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
cb20: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
cb30: 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
cb40: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
cb50: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
cb60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
cb70: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
cb80: 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
cb90: 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
cba0: 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
cbb0: 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
cbc0: 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
cbd0: 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
cbe0: 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
cbf0: 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
cc00: 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
cc10: 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
cc20: 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
cc30: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
cc40: 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
cc50: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
cc60: 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
cc70: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
cc80: 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
cc90: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
cca0: 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
ccb0: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
ccc0: 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
ccd0: 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
cce0: 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
ccf0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
cd00: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
cd10: 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
cd20: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
cd30: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
cd40: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
cd50: 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
cd60: 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
cd70: 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
cd80: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
cd90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
cda0: 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
cdb0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
cdc0: 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
cdd0: 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
cde0: 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
cdf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ce00: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
ce10: 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
ce20: 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
ce30: 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
ce40: 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
ce50: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
ce60: 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
ce70: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
ce80: 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
ce90: 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
cea0: 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
ceb0: 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
cec0: 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
ced0: 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
cee0: 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
cef0: 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
cf00: 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
cf10: 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
cf20: 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
cf30: 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
cf40: 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
cf50: 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
cf60: 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
cf70: 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
cf80: 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
cf90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
cfa0: 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
cfb0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
cfc0: 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
cfd0: 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
cfe0: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
cff0: 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
d000: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
d010: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
d020: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d030: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
d040: 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
d050: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
d060: 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
d070: 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
d080: 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20  er join, or.**  
d090: 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65        the subque
d0a0: 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ry is not itself
d0b0: 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65   a join.  (Ticke
d0c0: 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20  t #306).**.**   
d0d0: 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
d0e0: 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
d0f0: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
d100: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
d110: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
d120: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
d130: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
d140: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d150: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
d160: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
d170: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
d180: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
d190: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
d1a0: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
d1b0: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
d1c0: 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
d1d0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
d1e0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
d1f0: 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
d200: 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
d210: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
d220: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
d230: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d240: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
d250: 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
d260: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
d270: 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
d280: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d290: 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
d2a0: 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
d2b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
d2c0: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
d2d0: 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
d2e0: 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
d2f0: 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
d300: 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
d310: 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
d320: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
d330: 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
d340: 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
d350: 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
d360: 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
d370: 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
d380: 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
d390: 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
d3a0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74   OUTER JOIN or t
d3b0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
d3c0: 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
d3d0: 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64  RE clause.  (add
d3e0: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
d3f0: 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  0).**.** In this
d400: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
d410: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
d420: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d430: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
d440: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
d450: 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
d460: 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
d470: 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
d480: 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
d490: 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
d4a0: 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
d4b0: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
d4c0: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
d4d0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
d4e0: 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
d4f0: 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
d500: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d510: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
d520: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
d530: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
d540: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
d550: 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
d560: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
d570: 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
d580: 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
d590: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
d5a0: 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
d5b0: 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
d5c0: 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
d5d0: 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
d5e0: 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
d5f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d600: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
d610: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
d620: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
d630: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
d640: 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
d650: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
d660: 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
d670: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
d680: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
d690: 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
d6a0: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
d6b0: 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
d6c0: 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
d6d0: 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
d6e0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
d6f0: 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
d700: 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
d710: 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
d720: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
d730: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
d740: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
d750: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
d760: 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
d770: 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c  query" */.  SrcL
d780: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
d790: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
d7a0: 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
d7b0: 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
d7c0: 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
d7d0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
d7e0: 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
d7f0: 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
d800: 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
d810: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d820: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d830: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
d840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
d850: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
d860: 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
d870: 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
d880: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45   */.  int i;.  E
d890: 78 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20  xpr *pWhere;..  
d8a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
d8b0: 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
d8c0: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
d8d0: 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
d8e0: 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  */.  if( p==0 ) 
d8f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
d900: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
d910: 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
d920: 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
d930: 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
d940: 70 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69  pSub = pSrc->a[i
d950: 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  From].pSelect;. 
d960: 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
d970: 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
d980: 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
d990: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d9a0: 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
d9b0: 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
d9c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
d9d0: 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
d9e0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
d9f0: 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20  SubSrc );.  if( 
da00: 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
da10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
da20: 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74  f( (pSub->isDist
da30: 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c  inct || pSub->nL
da40: 69 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53  imit>=0) &&  (pS
da50: 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
da60: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74  Agg) ){.     ret
da70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
da80: 20 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20   (p->isDistinct 
da90: 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  || p->nLimit>=0)
daa0: 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
dab0: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
dac0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
dad0: 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
dae0: 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  y ) return 0;.. 
daf0: 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
db00: 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
db10: 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
db20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
db30: 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
db40: 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
db50: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
db60: 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
db70: 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
db80: 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
db90: 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
dba0: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
dbb0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
dbc0: 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
dbd0: 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
dbe0: 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
dbf0: 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
dc00: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
dc10: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
dc20: 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
dc30: 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
dc40: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
dc50: 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
dc60: 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
dc70: 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e  nSrc>1 && iFrom>
dc80: 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
dc90: 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
dca0: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
dcb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
dcc0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
dcd0: 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
dce0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
dcf0: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
dd00: 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
dd10: 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
dd20: 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
dd30: 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
dd40: 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
dd50: 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
dd60: 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
dd70: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
dd80: 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
dd90: 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
dda0: 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
ddb0: 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
ddc0: 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
ddd0: 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
dde0: 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
ddf0: 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
de00: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
de10: 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
de20: 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
de30: 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
de40: 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
de50: 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
de60: 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
de70: 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
de80: 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
de90: 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
dea0: 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
deb0: 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  ( iFrom>0 && (pS
dec0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
ded0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
dee0: 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26  ER)!=0 .      &&
def0: 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30   pSub->pWhere!=0
df00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
df10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
df20: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
df30: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61  nt, it means fla
df40: 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
df50: 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  tted for the.  *
df60: 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  * iFrom-th entry
df70: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
df80: 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72  use in the outer
df90: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20   query..  */..  
dfa0: 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74  /* Move all of t
dfb0: 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
dfc0: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
dfd0: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
dfe0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
dff0: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
e000: 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
e010: 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
e020: 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
e030: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
e040: 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
e050: 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
e060: 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
e070: 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
e080: 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
e090: 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
e0a0: 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
e0b0: 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
e0c0: 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
e0d0: 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
e0e0: 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
e0f0: 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
e100: 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
e110: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
e120: 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
e130: 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
e140: 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
e150: 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
e160: 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20   */.  iParent = 
e170: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69  pSrc->a[iFrom].i
e180: 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
e190: 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
e1a0: 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
e1b0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
e1c0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
e1d0: 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 69 66  ointype;..    if
e1e0: 28 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ( pSrc->a[iFrom]
e1f0: 2e 70 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61  .pTab && pSrc->a
e200: 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73  [iFrom].pTab->is
e210: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
e220: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
e230: 61 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b  able(0, pSrc->a[
e240: 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20  iFrom].pTab);.  
e250: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
e260: 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  ee(pSrc->a[iFrom
e270: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
e280: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 72    sqliteFree(pSr
e290: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d  c->a[iFrom].zNam
e2a0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
e2b0: 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  ee(pSrc->a[iFrom
e2c0: 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ].zAlias);.    i
e2d0: 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
e2e0: 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
e2f0: 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20  = nSubSrc - 1;. 
e300: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
e310: 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
e320: 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71         pSrc = sq
e330: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
e340: 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
e350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
e360: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
e370: 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
e380: 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
e390: 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
e3a0: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
e3b0: 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
e3c0: 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
e3d0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
e3e0: 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
e3f0: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
e400: 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
e410: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
e420: 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
e430: 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
e440: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
e450: 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
e460: 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d  a[iFrom+nSubSrc-
e470: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  1].jointype = jo
e480: 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f  intype;.  }..  /
e490: 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
e4a0: 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
e4b0: 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
e4c0: 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
e4d0: 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
e4e0: 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
e4f0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
e500: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d  .  ** .  ** Exam
e510: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
e520: 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
e530: 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
e540: 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
e550: 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
e560: 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20  E a>b;.  **   \ 
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
e590: 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
e5a0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
e5b0: 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f   /.  **    \____
e5c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e5d0: 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
e5e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e5f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
e600: 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  **.  ** We look 
e610: 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
e620: 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
e630: 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
e640: 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
e650: 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
e660: 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
e670: 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
e680: 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
e690: 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f  ute "y+10"..  */
e6a0: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
e6b0: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
e6c0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
e6d0: 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  t);.  pList = p-
e6e0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
e6f0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
e700: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
e710: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
e720: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
e730: 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
e740: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
e750: 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
e760: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
e770: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
e780: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
e790: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
e7a0: 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
e7b0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
e7c0: 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
e7d0: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
e7e0: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
e7f0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
e800: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
e810: 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
e820: 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
e830: 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  }.  if( pSub->pO
e840: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73  rderBy ){.    as
e850: 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
e860: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
e870: 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
e880: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53  pOrderBy;.    pS
e890: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
e8a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
e8b0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
e8c0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
e8d0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
e8e0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
e8f0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
e900: 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
e910: 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
e920: 65 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  eExprDup(pSub->p
e930: 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
e940: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
e950: 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
e960: 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
e970: 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
e980: 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
e990: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
e9a0: 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
e9b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
e9c0: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
e9d0: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
e9e0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
e9f0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 48 61     if( pSub->pHa
ea00: 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 45 78  ving ){.      Ex
ea10: 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 73 71  pr *pHaving = sq
ea20: 6c 69 74 65 45 78 70 72 44 75 70 28 70 53 75 62  liteExprDup(pSub
ea30: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
ea40: 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
ea50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
ea60: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45  Having = sqliteE
ea70: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70  xpr(TK_AND, p->p
ea80: 48 61 76 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c  Having, pHaving,
ea90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
eaa0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
eab0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
eac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ead0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
eae0: 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
eaf0: 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
eb00: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
eb10: 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b  pSub->pGroupBy);
eb20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
eb30: 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  pWhere==0 ){.   
eb40: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
eb50: 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ere;.  }else{.  
eb60: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
eb70: 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
eb80: 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
eb90: 20 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b     if( pWhere ){
eba0: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
ebb0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
ebc0: 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c  _AND, p->pWhere,
ebd0: 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
ebe0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
ebf0: 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
ec00: 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
ec10: 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
ec20: 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74   or the.  ** out
ec30: 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
ec40: 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d  inct. .  */.  p-
ec50: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
ec60: 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
ec70: 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
ec80: 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20  ..  /* Transfer 
ec90: 74 68 65 20 6c 69 6d 69 74 20 65 78 70 72 65 73  the limit expres
eca0: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 75  sion from the su
ecb0: 62 71 75 65 72 79 20 74 6f 20 74 68 65 20 6f 75  bquery to the ou
ecc0: 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 2e 0a  ter.  ** query..
ecd0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
ece0: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >nLimit>=0 ){.  
ecf0: 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c    if( p->nLimit<
ed00: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  0 ){.      p->nL
ed10: 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69  imit = pSub->nLi
ed20: 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  mit;.    }else i
ed30: 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e  f( p->nLimit+p->
ed40: 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d 3e  nOffset > pSub->
ed50: 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f 66  nLimit+pSub->nOf
ed60: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
ed70: 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >nLimit = pSub->
ed80: 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e 6e  nLimit + pSub->n
ed90: 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66 66  Offset - p->nOff
eda0: 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  set;.    }.  }. 
edb0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20 70   p->nOffset += p
edc0: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20  Sub->nOffset;.. 
edd0: 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
ede0: 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
edf0: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
ee00: 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
ee10: 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
ee20: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
ee30: 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65  lete(pSub);.  re
ee40: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
ee50: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
ee60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
ee70: 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
ee80: 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
ee90: 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
eea0: 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
eeb0: 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
eec0: 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
eed0: 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
eee0: 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
eef0: 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
ef00: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
ef10: 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
ef20: 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
ef30: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
ef40: 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74  s SELECT and ret
ef50: 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
ef60: 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
ef70: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
ef80: 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
ef90: 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
efa0: 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
efb0: 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
efc0: 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
efd0: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
efe0: 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
eff0: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
f000: 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
f010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
f020: 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
f030: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
f040: 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
f050: 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
f060: 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
f070: 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
f080: 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
f090: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
f0a0: 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
f0b0: 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
f0c0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
f0d0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
f0e0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
f0f0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
f100: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
f110: 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
f120: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
f130: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
f140: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
f150: 66 6f 72 20 73 71 6c 69 74 65 53 65 6c 65 63 74  for sqliteSelect
f160: 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
f170: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
f180: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
f190: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
f1a0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
f1b0: 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
f1c0: 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
f1d0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
f1e0: 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
f1f0: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
f200: 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
f210: 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
f220: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
f230: 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
f240: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
f250: 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63   seekOp;.  int c
f260: 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ont;.  ExprList 
f270: 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  eList;.  struct 
f280: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c  ExprList_item eL
f290: 69 73 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43  istItem;..  /* C
f2a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
f2b0: 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73  his query is a s
f2c0: 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
f2d0: 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74  ax() query.  Ret
f2e0: 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66  urn.  ** zero if
f2f0: 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a   it is  not..  *
f300: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  /.  if( p->pGrou
f310: 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e  pBy || p->pHavin
f320: 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29  g || p->pWhere )
f330: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f340: 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
f350: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
f360: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
f370: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
f380: 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d   0;.  pExpr = p-
f390: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
f3a0: 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
f3b0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
f3c0: 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
f3d0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
f3e0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72  List==0 || pExpr
f3f0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
f400: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
f410: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
f420: 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30  .n!=3 ) return 0
f430: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ;.  if( sqliteSt
f440: 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
f450: 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d  ken.z,"min",3)==
f460: 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
f470: 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d  = OP_Rewind;.  }
f480: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 53  else if( sqliteS
f490: 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74  trNICmp(pExpr->t
f4a0: 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d  oken.z,"max",3)=
f4b0: 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70  =0 ){.    seekOp
f4c0: 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65   = OP_Last;.  }e
f4d0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
f4e0: 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d  0;.  }.  pExpr =
f4f0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
f500: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
f510: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
f520: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
f530: 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
f540: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
f550: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
f560: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
f570: 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c   we get to here,
f580: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75   it means the qu
f590: 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f  ery is of the co
f5a0: 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a  rrect form..  **
f5b0: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
f5c0: 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69  ure we have an i
f5d0: 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49  ndex and make pI
f5e0: 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  dx point to the.
f5f0: 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
f600: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
f610: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
f620: 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20  s on an INTEGER 
f630: 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79  PRIMARY.  ** key
f640: 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65   column, no inde
f650: 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  x is necessary s
f660: 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55  o set pIdx to NU
f670: 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20  LL.  If no.  ** 
f680: 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20  usable index is 
f690: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e  found, return 0.
f6a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  .  */.  if( iCol
f6b0: 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d  <0 ){.    pIdx =
f6c0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
f6d0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f6e0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f6f0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f700: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f710: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20  Idx->nColumn>=1 
f720: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
f730: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
f740: 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  iCol ) break;.  
f750: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
f760: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f770: 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69    }..  /* Identi
f780: 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  fy column types 
f790: 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
f7a0: 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
f7b0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
f7c0: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
f7d0: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
f7e0: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
f7f0: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
f800: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  .  ** The column
f810: 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65   names have alre
f820: 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
f830: 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ed in the callin
f840: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  g function..  */
f850: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
f860: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f870: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
f880: 6e 20 30 3b 0a 20 20 69 66 28 20 65 44 65 73 74  n 0;.  if( eDest
f890: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
f8a0: 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
f8b0: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
f8c0: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
f8d0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
f8e0: 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
f8f0: 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
f900: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f910: 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
f920: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
f930: 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
f940: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
f950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f960: 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c  OpenTemp, iParm,
f970: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   0);.  }..  /* G
f980: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
f990: 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
f9a0: 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
f9b0: 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
f9c0: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
f9d0: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
f9e0: 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
f9f0: 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
fa00: 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
fa10: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
fa20: 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
fa30: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
fa40: 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
fa50: 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
fa60: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
fa70: 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
fa80: 20 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69    sqliteCodeVeri
fa90: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
faa0: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62   pTab->iDb);.  b
fab0: 61 73 65 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  ase = p->pSrc->a
fac0: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 63  [0].iCursor;.  c
fad0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
fae0: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ters(pParse, p);
faf0: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
fb00: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
fb10: 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b  , pTab->iDb, 0);
fb20: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
fb30: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
fb40: 64 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74  d, base, pTab->t
fb50: 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  num);.  sqliteVd
fb60: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
fb70: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
fb80: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 63 6f 6e  3_STATIC);.  con
fb90: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  t = sqliteVdbeMa
fba0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66  keLabel(v);.  if
fbb0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
fbc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
fbd0: 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
fbe0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
fbf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
fc00: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
fc10: 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b  , pIdx->iDb, 0);
fc20: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
fc30: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
fc40: 65 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64  ead, base+1, pId
fc50: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71  x->tnum);.    sq
fc60: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
fc70: 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
fc80: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
fc90: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
fca0: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
fcb0: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
fcc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fcd0: 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20  v, OP_IdxRecno, 
fce0: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
fcf0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
fd00: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
fd10: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
fd20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fd30: 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c  OP_MoveTo, base,
fd40: 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
fd50: 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
fd60: 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
fd70: 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
fd80: 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
fd90: 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
fda0: 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
fdb0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65  pr = pExpr;.  se
fdc0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
fdd0: 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c  arse, p, &eList,
fde0: 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44   0, 0, 0, -1, eD
fdf0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74  est, iParm, cont
fe00: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
fe10: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
fe20: 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71  l(v, cont);.  sq
fe30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fe40: 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
fe50: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b   0);.  return 1;
fe60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
fe70: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
fe80: 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
fe90: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
fea0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
feb0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
fec0: 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
fed0: 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
fee0: 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
fef0: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
ff00: 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
ff10: 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
ff20: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
ff30: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ff40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
ff60: 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
ff70: 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
ff80: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
ff90: 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
ffa0: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
ffb0: 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
ffc0: 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
ffd0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
ffe0: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
fff0: 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
10000 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
10010 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c  s keys of a tabl
10020 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 50  e with cursor iP
10030 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
10040 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
10050 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
10060 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
10070 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
10080 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
10090 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
100a0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
100b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
100c0 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
100d0 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
100e0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
100f0 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
10100 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
10110 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20  The table above 
10120 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20  is incomplete.  
10130 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74  Additional eDist
10140 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61   value have be a
10150 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68  dded.** since th
10160 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77  is comment was w
10170 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65  ritten.  See the
10180 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
10190 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a  () function for.
101a0 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69  ** a complete li
101b0 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c  sting of the all
101c0 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65  owed values of e
101d0 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d  Dest and their m
101e0 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  eanings..**.** T
101f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10200 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
10210 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
10220 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
10230 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
10240 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
10250 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
10260 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
10270 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
10280 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10290 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
102a0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
102b0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
102c0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
102d0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
102e0 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20   do that..**.** 
102f0 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72  The pParent, par
10300 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61  entTab, and *pPa
10310 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61  rentAgg fields a
10320 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20  re filled in if 
10330 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69  this.** SELECT i
10340 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54  s a subquery.  T
10350 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
10360 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  try to combine t
10370 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  his SELECT.** wi
10380 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f  th its parent to
10390 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66   form a single f
103a0 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73  lat query.  In s
103b0 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68  o doing, it migh
103c0 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20  t.** change the 
103d0 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f  parent query fro
103e0 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  m a non-aggregat
103f0 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74  e to an aggregat
10400 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20  e query..** For 
10410 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65  that reason, the
10420 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67   pParentAgg flag
10430 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20   is passed as a 
10440 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a  pointer, so it.*
10450 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
10460 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
10470 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  1:   The meaning
10480 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20   of the pParent 
10490 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
104a0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
104b0 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43  M t1 JOIN (SELEC
104c0 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T x, count(*) FR
104d0 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a  OM t2) JOIN t3;.
104e0 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  **    \         
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
10500 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
10510 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f  ______/        /
10520 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20  .**     \       
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10560 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
10570 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
10580 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
10590 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
105a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
105b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
105c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
105d0 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68   first.   For th
105e0 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72  at call,.** pPar
105f0 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ent will be NULL
10600 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72  .  During the pr
10610 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
10620 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69  outer query, thi
10630 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  s .** routine is
10640 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
10650 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ely to handle th
10660 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72  e subquery.  For
10670 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a   the recursive.*
10680 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20  * call, pParent 
10690 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68  will point to th
106a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
106b0 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71  Because the subq
106c0 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73  uery is.** the s
106d0 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e  econd element in
106e0 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
106f0 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62  n, the parentTab
10700 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
10710 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64  ** be 1 (the 2nd
10720 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e   value of a 0-in
10730 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f  dexed array.).*/
10740 0a 69 6e 74 20 73 71 6c 69 74 65 53 65 6c 65 63  .int sqliteSelec
10750 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
10760 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
10770 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
10780 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
107a0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
107b0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
107c0 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
107d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
107e0 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
107f0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
10800 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
10810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10820 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
10830 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
10840 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
10850 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
10860 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
10870 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
10880 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
10890 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
108a0 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
108b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
108c0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
108d0 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
108e0 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
108f0 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g        /* True
10900 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
10910 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
10920 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ions */.){.  int
10930 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   i;.  WhereInfo 
10940 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20  *pWInfo;.  Vdbe 
10950 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20  *v;.  int isAgg 
10960 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
10970 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
10980 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
10990 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
109a0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
109b0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
109c0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
109d0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
109e0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
109f0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
10a00 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
10a10 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
10a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10a30 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
10a40 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
10a50 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
10a60 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
10a70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
10a80 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
10a90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
10aa0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
10ab0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
10ac0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
10ad0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
10ae0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
10af0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
10b00 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
10b10 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
10b20 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
10b30 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
10b40 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
10b50 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
10b60 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
10b70 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
10b80 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
10b90 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
10ba0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
10bb0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
10bc0 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
10bd0 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  nction */..  if(
10be0 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
10bf0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
10c00 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20  >nErr || p==0 ) 
10c10 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
10c20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
10c30 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
10c40 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
10c50 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
10c60 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
10c70 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
10c80 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
10c90 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
10ca0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
10cb0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
10cc0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
10cd0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
10ce0 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
10cf0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
10d00 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
10d10 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
10d20 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
10d30 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
10d40 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
10d50 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f   p->pWhere;.  pO
10d60 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
10d70 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79  erBy;.  pGroupBy
10d80 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
10d90 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
10da0 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
10db0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
10dc0 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  inct;..  /* Allo
10dd0 63 61 74 65 20 56 44 42 45 20 63 75 72 73 6f 72  cate VDBE cursor
10de0 73 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  s for each table
10df0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
10e00 75 73 65 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  use.  */.  sqlit
10e10 65 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  eSrcListAssignCu
10e20 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
10e30 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a  abList);..  /* .
10e40 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e    ** Do not even
10e50 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65   attempt to gene
10e60 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66  rate any code if
10e70 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
10e80 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72   seen.  ** error
10e90 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  s before this ro
10ea0 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20  utine starts..  
10eb0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
10ec0 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73  >nErr>0 ) goto s
10ed0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
10ee0 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22 20   Expand any "*" 
10ef0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73  terms in the res
10f00 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20 65  ult set.  (For e
10f10 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20 69  xample the "*" i
10f20 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a  n.  ** "SELECT *
10f30 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65 20   FROM t1")  The 
10f40 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74  fillInColumnlist
10f50 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  () routine also 
10f60 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f  does some.  ** o
10f70 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69 6e  ther housekeepin
10f80 67 20 2d 20 73 65 65 20 74 68 65 20 68 65 61 64  g - see the head
10f90 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64  er comment for d
10fa0 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69  etails..  */.  i
10fb0 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
10fc0 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  ist(pParse, p) )
10fd0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
10fe0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68  t_end;.  }.  pWh
10ff0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
11000 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
11010 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
11020 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ist==0 ) goto se
11030 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
11040 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
11050 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
11060 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
11070 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
11080 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
11090 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44  ..  */.  if( (eD
110a0 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
110b0 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
110c0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
110d0 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
110e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
110f0 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
11100 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
11110 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
11120 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
11130 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
11140 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ion");.    goto 
11150 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
11160 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69  .  /* ORDER BY i
11170 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f  s ignored for so
11180 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e  me destinations.
11190 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
111a0 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
111b0 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20  e SRT_Union:.   
111c0 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
111d0 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
111e0 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70 4f  iscard:.      pO
111f0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
11200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
11210 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61  ault:.      brea
11220 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  k;.  }..  /* At 
11230 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 73  this point, we s
11240 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63  hould have alloc
11250 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75 72  ated all the cur
11260 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20 2a  sors that we.  *
11270 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65  * need to handle
11280 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20 74   subquerys and t
11290 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
112a0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73    .  **.  ** Res
112b0 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  olve the column 
112c0 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20 73  names and do a s
112d0 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20 6f  emantics check o
112e0 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  n all the expres
112f0 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  sions..  */.  fo
11300 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
11310 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11320 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11330 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11340 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
11350 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11360 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
11370 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11380 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
11390 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
113a0 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
113b0 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67  .pExpr, 1, &isAg
113c0 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
113d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
113e0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68   }.  }.  if( pWh
113f0 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ere ){.    if( s
11400 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
11410 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
11420 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57  List, pEList, pW
11430 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67  here) ){.      g
11440 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
11460 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
11470 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c  arse, pWhere, 0,
11480 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   0) ){.      got
11490 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
114a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48    }.  }.  if( pH
114b0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28  aving ){.    if(
114c0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
114d0 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
114e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
114f0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
11500 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
11510 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
11520 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11530 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
11540 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
11550 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11560 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11570 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
11580 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11590 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
115a0 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
115b0 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  k(pParse, pHavin
115c0 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b  g, 1, &isAgg) ){
115d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
115e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
115f0 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  }.  if( pOrderBy
11600 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
11610 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
11620 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11630 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
11640 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
11650 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
11660 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11670 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  eExprIsInteger(p
11680 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f  E, &iCol) && iCo
11690 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
116a0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
116b0 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
116c0 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20  Delete(pE);.    
116d0 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42      pE = pOrderB
116e0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  y->a[i].pExpr = 
116f0 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45  sqliteExprDup(pE
11700 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
11710 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
11720 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11730 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
11740 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
11750 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a   pEList, pE) ){.
11760 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11770 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
11780 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11790 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
117a0 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  e, pE, isAgg, 0)
117b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
117c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
117d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
117e0 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
117f0 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
11800 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11810 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
11820 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iCol)==0 ){.    
11830 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
11840 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
11850 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
11860 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
11870 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
11880 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20  r constants");. 
11890 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
118a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
118b0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
118c0 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
118d0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
118e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
118f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
11900 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44              "ORD
11910 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d  ER BY column num
11920 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61  ber %d out of ra
11930 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
11940 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
11950 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
11960 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d  ", iCol, pEList-
11970 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
11980 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11990 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
119a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
119b0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
119c0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
119d0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
119e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
119f0 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78  t iCol;.      Ex
11a00 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42  pr *pE = pGroupB
11a10 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
11a20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11a30 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
11a40 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e   &iCol) && iCol>
11a50 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73  0 && iCol<=pELis
11a60 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
11a70 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
11a80 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
11a90 20 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d    pE = pGroupBy-
11aa0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
11ab0 6c 69 74 65 45 78 70 72 44 75 70 28 70 45 4c 69  liteExprDup(pELi
11ac0 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
11ad0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
11ae0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
11af0 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
11b00 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
11b10 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  EList, pE) ){.  
11b20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11b30 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
11b40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11b50 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
11b60 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
11b70 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
11b80 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11b90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
11ba0 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
11bb0 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  t(pE) ){.       
11bc0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
11bd0 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
11be0 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
11bf0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
11c00 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
11c10 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59         "GROUP BY
11c20 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
11c30 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
11c40 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20  onstants");.    
11c50 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11c60 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
11c70 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30  else if( iCol<=0
11c80 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
11c90 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
11ca0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
11cb0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
11cc0 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42          "GROUP B
11cd0 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
11ce0 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
11cf0 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
11d00 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77             "betw
11d10 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69  een 1 and %d", i
11d20 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
11d30 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  pr);.          g
11d40 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
11d70 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
11d80 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
11d90 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
11da0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11db0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
11dc0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
11dd0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
11de0 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
11df0 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e  be using them in
11e00 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68   a callback.  Th
11e10 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
11e20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
11e30 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
11e40 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73  o some other des
11e50 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  tination..  */. 
11e60 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
11e70 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
11e80 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
11e90 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
11ea0 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
11eb0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
11ec0 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  or the special c
11ed0 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f  ase of a min() o
11ee0 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
11ef0 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20   by itself.  ** 
11f00 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
11f10 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69  t..  */.  if( si
11f20 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
11f30 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
11f40 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20  , iParm) ){.    
11f50 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  rc = 0;.    goto
11f60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
11f70 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11f80 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
11f90 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
11fa0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
11fb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
11fc0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
11fd0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
11fe0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
11ff0 6e 74 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e  ntext;.    int n
12000 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
12010 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62  t;..    if( pTab
12020 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
12030 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ct==0 ) continue
12040 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ;.    if( pTabLi
12050 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d  st->a[i].zName!=
12060 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
12070 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
12080 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
12090 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
120a0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
120b0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
120c0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65  .zName;.      ne
120d0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
120e0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
120f0 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
12100 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  reContext = 0;. 
12110 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53     }.    sqliteS
12120 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
12130 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
12140 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61  lect, SRT_TempTa
12150 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ble, .          
12160 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
12170 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70  >a[i].iCursor, p
12180 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a 20 20  , i, &isAgg);.  
12190 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72    if( needRestor
121a0 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20  eContext ){.    
121b0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
121c0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
121d0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
121e0 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
121f0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57   p->pSrc;.    pW
12200 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
12210 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21  ;.    if( eDest!
12220 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44  =SRT_Union && eD
12230 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20  est!=SRT_Except 
12240 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69  && eDest!=SRT_Di
12250 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70  scard ){.      p
12260 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
12270 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
12280 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
12290 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
122a0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
122b0 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
122c0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
122d0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  t;.  }..  /* Che
122e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
122f0 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
12300 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61  that can be "fla
12310 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73  ttened" into its
12320 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66   parent..  ** If
12330 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
12340 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20   possiblity, do 
12350 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  so and return im
12360 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a  mediately.  .  *
12370 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
12380 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
12390 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
123a0 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
123b0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
123c0 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
123d0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
123e0 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
123f0 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72  ntAgg = 1;.    r
12400 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
12410 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
12420 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70  ter..  */.  comp
12430 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
12440 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20  s(pParse, p);.. 
12450 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
12460 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20  umn types if we 
12470 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 61 20  will be using a 
12480 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
12490 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
124a0 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
124b0 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
124c0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
124d0 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 63  er.  ** than a c
124e0 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  allback..  **.  
124f0 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  ** We have to do
12500 20 74 68 69 73 20 73 65 70 61 72 61 74 65 6c 79   this separately
12510 20 66 72 6f 6d 20 74 68 65 20 63 72 65 61 74 69   from the creati
12520 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  on of column nam
12530 65 73 0a 20 20 2a 2a 20 61 62 6f 76 65 20 62 65  es.  ** above be
12540 63 61 75 73 65 20 69 66 20 74 68 65 20 70 54 61  cause if the pTa
12550 62 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 76  bList contains v
12560 69 65 77 73 20 74 68 65 6e 20 74 68 65 79 20 77  iews then they w
12570 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 68 61 76  ill not.  ** hav
12580 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 20  e been resolved 
12590 61 6e 64 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  and we will not 
125a0 6b 6e 6f 77 20 74 68 65 20 63 6f 6c 75 6d 6e 20  know the column 
125b0 74 79 70 65 73 20 75 6e 74 69 6c 0a 20 20 2a 2a  types until.  **
125c0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
125d0 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
125e0 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
125f0 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
12600 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
12610 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
12620 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
12630 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
12640 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
12650 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
12660 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
12670 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
12680 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
12690 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
126a0 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
126b0 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 0);.  }..  
126c0 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
126d0 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
126e0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
126f0 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
12700 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
12710 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  se);.  if( isAgg
12720 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a   || pGroupBy ){.
12730 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
12740 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20  se->nAgg==0 );. 
12750 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
12760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
12770 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12780 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
12790 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
127a0 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
127b0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
127c0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
127d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
127e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
127f0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
12800 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
12810 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
12820 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12830 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
12840 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
12850 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
12860 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
12870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
12880 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
128a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
128b0 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
128c0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
128d0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
128e0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
128f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
12910 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
12920 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
12930 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
12940 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
12950 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
12960 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
12970 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
12980 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
12990 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
129a0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
129b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
129c0 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
129d0 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
129e0 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
129f0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
12a00 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
12a10 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
12a20 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
12a30 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
12a40 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
12a50 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
12a60 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
12a70 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
12a80 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
12a90 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
12aa0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
12ab0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12ac0 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c  , OP_AggInit, 0,
12ad0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   i);.        sql
12ae0 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
12af0 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 46  v, -1, (char*)pF
12b00 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  unc, P3_POINTER)
12b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12b20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
12b30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
12b40 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12b50 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
12b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
12b70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
12b80 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20  gFocus, 0, 0);. 
12b90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
12ba0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
12bb0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
12bc0 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
12bd0 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
12be0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12bf0 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
12c00 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
12c10 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12c20 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
12c30 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
12c40 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
12c50 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
12c60 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
12c70 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
12c80 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
12c90 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
12ca0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
12cb0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12cc0 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
12cd0 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20   distinct, 1);. 
12ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
12cf0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
12d00 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
12d10 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a  atabase scan.  *
12d20 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
12d30 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
12d40 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
12d50 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20  pWhere, 0, .    
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
12d80 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79   ? 0 : &pOrderBy
12d90 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  );.  if( pWInfo=
12da0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
12db0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  _end;..  /* Use 
12dc0 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
12dd0 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72  er loop if we ar
12de0 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69  e not dealing wi
12df0 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74  th.  ** aggregat
12e00 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  es.  */.  if( !i
12e10 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
12e20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12e30 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
12e40 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
12e50 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
12e60 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
12e70 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
12e80 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
12e90 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
12ea0 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
12eb0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12ec0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
12ed0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
12ee0 69 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20  ith aggregates, 
12ef0 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63  then do the spec
12f00 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20  ial aggregate.  
12f10 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  ** processing.  
12f20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
12f30 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
12f40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31  {.      int lbl1
12f50 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
12f60 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
12f70 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
12f80 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
12f90 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
12fa0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
12fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12fc0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12fd0 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72   OP_MakeKey, pGr
12fe0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29  oupBy->nExpr, 0)
12ff0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
13000 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
13010 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41  mat>=4 ) sqliteA
13020 64 64 4b 65 79 54 79 70 65 28 76 2c 20 70 47 72  ddKeyType(v, pGr
13030 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 6c 62  oupBy);.      lb
13040 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  l1 = sqliteVdbeM
13050 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
13060 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13070 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75  Op(v, OP_AggFocu
13080 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  s, 0, lbl1);.   
13090 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
130a0 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
130b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
130c0 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
130d0 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
130e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
130f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13100 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
13110 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
13120 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
13130 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20  , OP_AggSet, 0, 
13140 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
13150 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
13160 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31  lveLabel(v, lbl1
13170 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
13180 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
13190 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
131a0 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
131b0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
131c0 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67  f( !pParse->aAgg
131d0 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
131e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d  inue;.      pE =
131f0 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
13200 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
13210 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b  sert( pE->op==TK
13220 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
13230 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
13240 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
13250 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70  for(j=0; j<pE->p
13260 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
13270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13280 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
13290 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61  se, pE->pList->a
132a0 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
132b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
132c0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
132d0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
132e0 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
132f0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13300 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30  v, OP_AggFunc, 0
13310 2c 20 70 45 2d 3e 70 4c 69 73 74 20 3f 20 70 45  , pE->pList ? pE
13320 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
13330 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
13340 74 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  t( pParse->aAgg[
13350 69 5d 2e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20  i].pFunc!=0 );. 
13360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13370 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
13380 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a  nc->xStep!=0 );.
13390 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
133a0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
133b0 28 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e 61  (char*)pParse->a
133c0 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2c 20 50 33  Agg[i].pFunc, P3
133d0 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
133e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  .  }..  /* End t
133f0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
13400 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71   loop..  */.  sq
13410 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70 57 49  liteWhereEnd(pWI
13420 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nfo);..  /* If w
13430 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67  e are processing
13440 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65 20   aggregates, we 
13450 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20 61  need to set up a
13460 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a   second loop.  *
13470 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  * over all of th
13480 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75  e aggregate valu
13490 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  es and process t
134a0 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hem..  */.  if( 
134b0 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74  isAgg ){.    int
134c0 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65   endagg = sqlite
134d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
134e0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 61  ;.    int starta
134f0 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67  gg;.    startagg
13500 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
13510 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74  Op(v, OP_AggNext
13520 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20  , 0, endagg);.  
13530 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
13540 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 48   = 1;.    if( pH
13550 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
13560 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
13570 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
13580 2c 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b 0a  , startagg, 1);.
13590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65      }.    if( se
135a0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
135b0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
135c0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
135d0 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
135e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
135f0 20 20 20 20 20 20 69 50 61 72 6d 2c 20 73 74 61        iParm, sta
13600 72 74 61 67 67 2c 20 65 6e 64 61 67 67 29 20 29  rtagg, endagg) )
13610 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
13620 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
13630 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13640 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
13650 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20  , startagg);.   
13660 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
13670 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67  veLabel(v, endag
13680 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  g);.    sqliteVd
13690 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
136a0 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  op, 0, 0);.    p
136b0 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
136c0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
136d0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
136e0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
136f0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
13700 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
13710 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
13720 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
13730 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
13740 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
13750 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
13760 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70  SortTail(p, v, p
13770 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
13780 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
13790 0a 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61 20  ...  /* Issue a 
137a0 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66  null callback if
137b0 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74 68   that is what th
137c0 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20 20  e user wants..  
137d0 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
137e0 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 2f 2a 20  SRT_Callback /* 
137f0 26 26 0a 20 20 20 20 28 70 50 61 72 73 65 2d 3e  &&.    (pParse->
13800 75 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c  useCallback==0 |
13810 7c 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  | (pParse->db->f
13820 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75  lags & SQLITE_Nu
13830 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30 29 20  llCallback)!=0) 
13840 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  */.  ){.    sqli
13850 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13860 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20  P_NullCallback, 
13870 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
13880 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
13890 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75  this was a subqu
138a0 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77  ery, we have now
138b0 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73   converted the s
138c0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20  ubquery into a. 
138d0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
138e0 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20  ble.  So delete 
138f0 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72  the subquery str
13900 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
13910 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70  parent.  ** to p
13920 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71  revent this subq
13930 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
13940 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
13950 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
13960 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
13970 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
13980 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
13990 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
139a0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
139b0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
139c0 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
139d0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
139e0 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
139f0 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
13a00 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
13a10 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50  elete(p);.    pP
13a20 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
13a30 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63  arentTab].pSelec
13a40 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
13a50 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
13a60 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
13a70 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
13a80 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
13a90 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
13aa0 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
13ab0 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
13ac0 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
13ad0 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
13ae0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
13af0 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
13b00 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
13b10 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
13b20 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
13b30 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41  t_end:.  sqliteA
13b40 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
13b50 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
13b60 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.