/ Hex Artifact Content
Login

Artifact 330166e328d7c8c737547b9d9a5bbe00431f9aed:


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 35  select.c,v 1.155
0200: 20 32 30 30 34 2f 30 32 2f 31 34 20 32 33 3a 35   2004/02/14 23:5
0210: 39 3a 35 38 20 64 72 68 20 45 78 70 20 24 0a 2a  9:58 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c  elect *sqliteSel
02a0: 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69  ectNew(.  ExprLi
02b0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
02c0: 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  /* which columns
02d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
02e0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53  he result */.  S
02f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
0300: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
0310: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
0320: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
0330: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0340: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  e,         /* th
0350: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
0360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
0370: 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65  roupBy,   /* the
0380: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0390: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
03a0: 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  ing,        /* t
03b0: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
03c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
03d0: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74  pOrderBy,   /* t
03e0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
03f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  se */.  int isDi
0400: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a  stinct,       /*
0410: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
0420: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
0430: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
0440: 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20  t nLimit,       
0450: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
0460: 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  ue.  -1 means no
0470: 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t used */.  int 
0480: 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  nOffset         
0490: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
04a0: 65 2e 20 20 30 20 6d 65 61 6e 73 20 6e 6f 20 6f  e.  0 means no o
04b0: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
04c0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
04d0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
04e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
04f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0520: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0530: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
0540: 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Src);.    sqlite
0550: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
0560: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  e);.    sqliteEx
0570: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72  prListDelete(pGr
0580: 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
0590: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61  teExprDelete(pHa
05a0: 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
05b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
05c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c  pOrderBy);.  }el
05d0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  se{.    if( pELi
05e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
05f0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
0600: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
0610: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4c  sqliteExpr(TK_AL
0620: 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20  L,0,0,0), 0);.  
0630: 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45    }.    pNew->pE
0640: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
0650: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
0660: 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pSrc;.    pNew->
0670: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0680: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
0690: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
06a0: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
06b0: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
06c0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
06d0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
06e0: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
06f0: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20   = isDistinct;. 
0700: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b     pNew->op = TK
0710: 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65  _SELECT;.    pNe
0720: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  w->nLimit = nLim
0730: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  it;.    pNew->nO
0740: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
0750: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  .    pNew->iLimi
0760: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  t = -1;.    pNew
0770: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
0780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0790: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  w;.}../*.** Give
07a0: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
07b0: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
07c0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
07d0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
07e0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
07f0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0800: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0810: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0820: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0830: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0840: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0850: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0860: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  R.**     JT_OUTE
0870: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0880: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0890: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
08a0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
08b0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
08c0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
08d0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
08e0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
08f0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0900: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0910: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0920: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0930: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0940: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0950: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0960: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0970: 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 50  sqliteJoinType(P
0980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0990: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
09a0: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
09b0: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
09c0: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
09d0: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
09e0: 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  p;.  static stru
09f0: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0a00: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0a10: 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20     int nChar;.  
0a20: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d 20    int code;.  } 
0a30: 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20  keywords[] = {. 
0a40: 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20     { "natural", 
0a50: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c  7, JT_NATURAL },
0a60: 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20  .    { "left",  
0a70: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0a80: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0a90: 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f  right",   5, JT_
0aa0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0ab0: 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20  ,.    { "full", 
0ac0: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0ad0: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0ae0: 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22  },.    { "outer"
0af0: 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  ,   5, JT_OUTER 
0b00: 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22  },.    { "inner"
0b10: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0b20: 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22  },.    { "cross"
0b30: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0b40: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0b50: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0b60: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0b70: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0b80: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0b90: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0ba0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0bb0: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0bc0: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0bd0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0be0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0bf0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0c00: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0c10: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0c20: 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e     && sqliteStrN
0c30: 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f  ICmp(p->z, keywo
0c40: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
0c50: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
0c60: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0c70: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
0c80: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
0c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0ca0: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
0cb0: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0cc0: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
0cd0: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
0ce0: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
0cf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0d00: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
0d10: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
0d20: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
0d30: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
0d40: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
0d50: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
0d60: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
0d70: 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64 75   static Token du
0d80: 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  mmy = { 0, 0 };.
0d90: 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20 3d      char *zSp1 =
0da0: 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22 20   " ", *zSp2 = " 
0db0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0dc0: 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79 3b   ){ pB = &dummy;
0dd0: 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20 20   zSp1 = 0; }.   
0de0: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70 43   if( pC==0 ){ pC
0df0: 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32 20   = &dummy; zSp2 
0e00: 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  = 0; }.    sqlit
0e10: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
0e20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
0e30: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0e40: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0e50: 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70 41   ", 0,.       pA
0e60: 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70 31  ->z, pA->n, zSp1
0e70: 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e  , 1, pB->z, pB->
0e80: 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d 3e  n, zSp2, 1, pC->
0e90: 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20  z, pC->n, 0);.  
0ea0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0eb0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0ec0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
0ed0: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
0ee0: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
0ef0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
0f00: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0f10: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0f20: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0f30: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0f40: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
0f50: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
0f60: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
0f70: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
0f80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
0f90: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
0fa0: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
0fb0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
0fc0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
0fd0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
0fe0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
0ff0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
1000: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
1010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1030: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1040: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1050: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1060: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1070: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1080: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1090: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
10a0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
10b0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
10c0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
10d0: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
10e0: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
10f0: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1100: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1110: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1130: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1150: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  l,        /* Nam
1160: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1170: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1180: 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a   *pTab1,      /*
1190: 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a   First table */.
11a0: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
11b0: 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65  Tab2,      /* Se
11c0: 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  cond table */.  
11d0: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
11e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
11f0: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
1200: 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  m to this expres
1210: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  sion */.){.  Tok
1220: 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72  en dummy;.  Expr
1230: 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a   *pE1a, *pE1b, *
1240: 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE1c;.  Expr *pE
1250: 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63  2a, *pE2b, *pE2c
1260: 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20  ;.  Expr *pE;.. 
1270: 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b   dummy.z = zCol;
1280: 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72  .  dummy.n = str
1290: 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d  len(zCol);.  dum
12a0: 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45  my.dyn = 0;.  pE
12b0: 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  1a = sqliteExpr(
12c0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
12d0: 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73  mmy);.  pE2a = s
12e0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c  qliteExpr(TK_ID,
12f0: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
1300: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
1310: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
1320: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
1330: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
1340: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
1350: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1360: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1370: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b2->zName;.  dum
1380: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
1390: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20 3d  mmy.z);.  pE2b =
13a0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
13b0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
13c0: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
13d0: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  eExpr(TK_DOT, pE
13e0: 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20  1b, pE1a, 0);.  
13f0: 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78 70  pE2c = sqliteExp
1400: 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  r(TK_DOT, pE2b, 
1410: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
1420: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 45   sqliteExpr(TK_E
1430: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
1440: 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  );.  ExprSetProp
1450: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1460: 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20 2a 70 70  Join);.  if( *pp
1470: 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70 45  Expr ){.    *ppE
1480: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
1490: 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70 72  (TK_AND, *ppExpr
14a0: 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , pE, 0);.  }els
14b0: 65 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  e{.    *ppExpr =
14c0: 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   pE;.  }.}../*.*
14d0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
14e0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
14f0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1500: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1510: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
1520: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1530: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
1540: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
1550: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
1560: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
1570: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
1580: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
1590: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
15a0: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
15b0: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
15c0: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
15d0: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
15e0: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
15f0: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
1600: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
1610: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
1620: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
1630: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
1640: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
1650: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
1660: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
1670: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
1680: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
1690: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
16a0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
16b0: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
16c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c  Expr *p){.  whil
16d0: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
16e0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
16f0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1700: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
1710: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20  pLeft);.    p = 
1720: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1730: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1740: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1750: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1760: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1770: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1780: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1790: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
17a0: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
17b0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
17c0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
17d0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
17e0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
17f0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1800: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1810: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
1820: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
1830: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
1840: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1850: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72  eProcessJoin(Par
1860: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1870: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
1880: 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69  t *pSrc;.  int i
1890: 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  , j;.  pSrc = p-
18a0: 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
18b0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
18c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
18d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18e0: 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e  *pTerm = &pSrc->
18f0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
1900: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1910: 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61  Other = &pSrc->a
1920: 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [i+1];..    if( 
1930: 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c  pTerm->pTab==0 |
1940: 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d  | pOther->pTab==
1950: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1960: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1970: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1980: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
1990: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
19a0: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
19b0: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
19c0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
19d0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
19e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65    */.    if( pTe
19f0: 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rm->jointype & J
1a00: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
1a10: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
1a20: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1a30: 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70  >pOn || pTerm->p
1a40: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
1a50: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
1a60: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
1a70: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
1a80: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
1a90: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
1aa0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
1ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61  Tab = pTerm->pTa
1ae0: 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  b;.      for(j=0
1af0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1b00: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1b10: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f  ( columnIndex(pO
1b20: 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62  ther->pTab, pTab
1b30: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
1b40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1b50: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54   addWhereTerm(pT
1b60: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1b70: 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d  e, pTab, pOther-
1b80: 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72  >pTab, &p->pWher
1b90: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1ba0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1bb0: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
1bc0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
1bd0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
1be0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
1bf0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f     if( pTerm->pO
1c00: 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69  n && pTerm->pUsi
1c10: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1c20: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
1c30: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1c40: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1c50: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1c60: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1c70: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
1c80: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1c90: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
1ca0: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
1cb0: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
1cc0: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
1cd0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64  ed by.    ** and
1ce0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1cf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1d00: 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  erm->pOn ){.    
1d10: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 54    setJoinExpr(pT
1d20: 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  erm->pOn);.     
1d30: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
1d40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1d50: 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e  pWhere = pTerm->
1d60: 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pOn;.      }else
1d70: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1d80: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
1d90: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65  (TK_AND, p->pWhe
1da0: 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c 20  re, pTerm->pOn, 
1db0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1dc0: 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20 30    pTerm->pOn = 0
1dd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1de0: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
1df0: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
1e00: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
1e10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
1e20: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
1e30: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
1e40: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
1e50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1e60: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
1e70: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
1e80: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
1e90: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
1ea0: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
1eb0: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
1ec0: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
1ed0: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
1ee0: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
1ef0: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
1f00: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
1f10: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
1f20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
1f30: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
1f40: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
1f50: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1f60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1f70: 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67 20  ( pTerm->pUsing 
1f80: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
1f90: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  *pList;.      in
1fa0: 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1fb0: 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  t( i<pSrc->nSrc-
1fc0: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
1fd0: 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67   = pTerm->pUsing
1fe0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1ff0: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
2000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2010: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 65   columnIndex(pTe
2020: 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d  rm->pTab, pList-
2030: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 7c  >a[j].zName)<0 |
2040: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  |.            co
2050: 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65 72  lumnIndex(pOther
2060: 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61  ->pTab, pList->a
2070: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  [j].zName)<0 ){.
2080: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2090: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20a0: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
20b0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
20c0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
20d0: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
20e0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
20f0: 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ", pList->a[j].z
2100: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2110: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
2130: 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74 2d  WhereTerm(pList-
2140: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 65  >a[j].zName, pTe
2150: 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65 72  rm->pTab, pOther
2160: 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ->pTab, &p->pWhe
2170: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2180: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2190: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
21a0: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
21b0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
21c0: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
21d0: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
21e0: 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74  oid sqliteSelect
21f0: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
2200: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
2210: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2220: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2230: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
2240: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
2250: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c  (p->pSrc);.  sql
2260: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
2270: 3e 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  >pWhere);.  sqli
2280: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
2290: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
22a0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
22b0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
22c0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
22d0: 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42  elete(p->pOrderB
22e0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  y);.  sqliteSele
22f0: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
2300: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  or);.  sqliteFre
2310: 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20  e(p->zSelect);. 
2320: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
2330: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2340: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e  the aggregate in
2350: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2360: 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75  he parse structu
2370: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
2380: 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  id sqliteAggrega
2390: 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73  teInfoReset(Pars
23a0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
23b0: 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d  liteFree(pParse-
23c0: 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65  >aAgg);.  pParse
23d0: 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
23e0: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
23f0: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
2400: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
2410: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
2420: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
2430: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
2440: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
2450: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
2460: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
2470: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
2480: 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70  oSorter(Parse *p
2490: 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20  Parse, Vdbe *v, 
24a0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
24b0: 42 79 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f  By){.  char *zSo
24c0: 72 74 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69  rtOrder;.  int i
24d0: 3b 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d  ;.  zSortOrder =
24e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
24f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
2500: 20 31 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72   1 );.  if( zSor
2510: 74 4f 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75  tOrder==0 ) retu
2520: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
2530: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
2540: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2550: 6f 72 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79  order = pOrderBy
2560: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2570: 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a  ;.    int type;.
2580: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
2590: 66 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49  f( (order & SQLI
25a0: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d  TE_SO_TYPEMASK)=
25b0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
25c0: 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  ){.      type = 
25d0: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
25e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f      }else if( (o
25f0: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
2600: 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49  _TYPEMASK)==SQLI
2610: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
2620: 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45     type = SQLITE
2630: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c  _SO_NUM;.    }el
2640: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  se if( pParse->d
2650: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
2660: 34 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20  4 ){.      type 
2670: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
2680: 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2690: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pExpr);.    }els
26a0: 65 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  e{.      type = 
26b0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
26c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72     }.    if( (or
26d0: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
26e0: 44 49 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  DIRMASK)==SQLITE
26f0: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  _SO_ASC ){.     
2700: 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54   c = type==SQLIT
2710: 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20  E_SO_TEXT ? 'A' 
2720: 3a 20 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65  : '+';.    }else
2730: 7b 0a 20 20 20 20 20 20 63 20 3d 20 74 79 70 65  {.      c = type
2740: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  ==SQLITE_SO_TEXT
2750: 20 3f 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20   ? 'D' : '-';.  
2760: 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64    }.    zSortOrd
2770: 65 72 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73  er[i] = c;.    s
2780: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
2790: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
27a0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[i].pExpr);.  }
27b0: 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f  .  zSortOrder[pO
27c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d  rderBy->nExpr] =
27d0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
27e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
27f0: 4d 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42  MakeKey, pOrderB
2800: 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
2810: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
2820: 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f  P3(v, -1, zSortO
2830: 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f  rder, strlen(zSo
2840: 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c  rtOrder));.  sql
2850: 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64  iteFree(zSortOrd
2860: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  er);.  sqliteVdb
2870: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2880: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
2890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
28a0: 6e 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67  ne adds a P3 arg
28b0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73  ument to the las
28c0: 74 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68  t VDBE opcode th
28d0: 61 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74  at was.** insert
28e0: 65 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d  ed. The P3 argum
28f0: 65 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73  ent added is a s
2900: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
2910: 6f 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61  or the .** OP_Ma
2920: 6b 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65  keKey or OP_Make
2930: 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20  IdxKey opcodes. 
2940: 20 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73   The string cons
2950: 69 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61  ists of.** chara
2960: 63 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27  cters 't' or 'n'
2970: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
2980: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2990: 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c   various.** fiel
29a0: 64 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f  ds of the key to
29b0: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68   be generated sh
29c0: 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20  ould be treated 
29d0: 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72  as numeric.** or
29e0: 20 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74   as text.  See t
29f0: 68 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e  he OP_MakeKey an
2a00: 64 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  d OP_MakeIdxKey 
2a10: 6f 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65  opcode.** docume
2a20: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  ntation for addi
2a30: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2a40: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20  on about the P3 
2a50: 73 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61  string..** See a
2a60: 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64  lso the sqliteAd
2a70: 64 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f  dIdxKeyType() ro
2a80: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
2a90: 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28  qliteAddKeyType(
2aa0: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2ab0: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e  t *pEList){.  in
2ac0: 74 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69  t nColumn = pELi
2ad0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61  st->nExpr;.  cha
2ae0: 72 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  r *zType = sqlit
2af0: 65 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e  eMalloc( nColumn
2b00: 2b 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  +1 );.  int i;. 
2b10: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
2b20: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2b30: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
2b40: 2b 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d  +){.    zType[i]
2b50: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70   = sqliteExprTyp
2b60: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
2b70: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
2b80: 5f 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27  _NUM ? 'n' : 't'
2b90: 3b 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d  ;.  }.  zType[i]
2ba0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64   = 0;.  sqliteVd
2bb0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
2bc0: 2c 20 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e  , zType, nColumn
2bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2be0: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
2bf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2c00: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2c10: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2c20: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2c30: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
2c50: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
2c60: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
2c70: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
2c80: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
2c90: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
2ca0: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
2cb0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
2cc0: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
2cd0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
2ce0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
2cf0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
2d00: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
2d10: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
2d20: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2d30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2d40: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2d50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2d60: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2d70: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2d80: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2da0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
2db0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2dc0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2dd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2de0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
2df0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
2e00: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
2e10: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
2e20: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
2e30: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
2e40: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
2e50: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
2e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e70: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
2e80: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
2e90: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2ea0: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
2eb0: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
2ec0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
2ed0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
2ee0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
2ef0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
2f00: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
2f10: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
2f20: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
2f30: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2f40: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
2f50: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
2f60: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
2f70: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
2f80: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
2f90: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
2fa0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2fc0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
2fd0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
2fe0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3000: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
3010: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
3020: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
3030: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3040: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
3050: 69 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  i;..  if( v==0 )
3060: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
3070: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
3080: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
3090: 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   was a LIMIT cla
30a0: 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  use on the SELEC
30b0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
30c0: 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20  n do the check. 
30d0: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68   ** to see if th
30e0: 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65  is row should be
30f0: 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
3100: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
3110: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4f  ){.    if( p->iO
3120: 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20  ffset>=0 ){.    
3130: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
3140: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
3150: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
3160: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3170: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
3180: 4f 66 66 73 65 74 2c 20 61 64 64 72 2b 32 29 3b  Offset, addr+2);
3190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
31a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
31b0: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
31c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31d0: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
31e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
31f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
3200: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
3210: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
3220: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
3230: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
3240: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
3250: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
3260: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3270: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
3280: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3290: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
32a0: 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d  rcTab, i);.    }
32b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
32c0: 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  olumn = pEList->
32d0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
32e0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
32f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
3300: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
3310: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
3320: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3330: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3340: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3350: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
3360: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3370: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
3380: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
3390: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
33a0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
33b0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
33c0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
33d0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  lt..  */.  if( d
33e0: 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45  istinct>=0 && pE
33f0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
3400: 6e 45 78 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e  nExpr>0 ){.#if N
3410: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
3420: 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 56 64  NCT.    sqliteVd
3430: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
3440: 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e  Null, -pEList->n
3450: 45 78 70 72 2c 20 73 71 6c 69 74 65 56 64 62 65  Expr, sqliteVdbe
3460: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
3470: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
3480: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3490: 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c   OP_MakeKey, pEL
34a0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a  ist->nExpr, 1);.
34b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
34c0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
34d0: 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65  =4 ) sqliteAddKe
34e0: 79 54 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29  yType(v, pEList)
34f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
3500: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3510: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3520: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
3530: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
3540: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3550: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69  (v, OP_Pop, pELi
3560: 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b  st->nExpr+1, 0);
3570: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3580: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3590: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
35a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
35b0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
35c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
35d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
35e0: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69  OP_PutStrKey, di
35f0: 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a  stinct, 0);.  }.
3600: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
3610: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
3620: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
3630: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
3640: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
3650: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3660: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3670: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3680: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
3690: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
36a0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
36b0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
36c0: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
36d0: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
36e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
36f0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3720: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
3730: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3740: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
3750: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
3760: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
3770: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
3780: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
3790: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
37a0: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
37b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
37c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
37d0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
37e0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
37f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3800: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3810: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3820: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3830: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3840: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3850: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
3860: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3870: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3880: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
3890: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
38a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
38b0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
38c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
38d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
38e0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
38f0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
3900: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
3910: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
3920: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
3930: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
3940: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
3950: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
3960: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
3970: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3980: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
3990: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
39a0: 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  pt: {.      int 
39b0: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
39c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
39d0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
39e0: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
39f0: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3a00: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3a10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3a20: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
3a30: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
3a40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3a50: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
3a60: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3a80: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
3a90: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
3aa0: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
3ab0: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
3ac0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
3ad0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
3ae0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
3af0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
3b00: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
3b10: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
3b20: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
3b30: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
3b40: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3b50: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
3b60: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 56 64  addr1 = sqliteVd
3b70: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3b80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
3b90: 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  2;.      assert(
3ba0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
3bb0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3bc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
3bd0: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29  ll, -1, addr1+3)
3be0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3bf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3c00: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
3c10: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 56 64  addr2 = sqliteVd
3c20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3c30: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  to, 0, 0);.     
3c40: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3c50: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3c60: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3c70: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3ca0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
3cb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
3cc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3cd0: 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
3ce0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
3cf0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
3d00: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
3d10: 61 64 64 72 32 2c 20 73 71 6c 69 74 65 56 64 62  addr2, sqliteVdb
3d20: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
3d30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3d40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3d50: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
3d60: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
3d70: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
3d80: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
3d90: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
3da0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
3db0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
3dc0: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
3dd0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
3de0: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
3df0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
3e00: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
3e10: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3e30: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3e40: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3e50: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3e60: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3e70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3e80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3e90: 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
3ea0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
3eb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3ec0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3ed0: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ef0: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3f00: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3f10: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3f20: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f30: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3f40: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3f50: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3f60: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3f70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f80: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b  Op(v, OP_SortMak
3f90: 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  eRec, nColumn, 0
3fa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3fb0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3fc0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3fd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3fe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
3ff0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
4000: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4010: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4020: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4030: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4040: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4050: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
4060: 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  ke a subroutine 
4070: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  to handle the re
4080: 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72  sults.  The subr
4090: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20  outine itself.  
40a0: 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69    ** is responsi
40b0: 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20  ble for popping 
40c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20  the results off 
40d0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
40e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
40f0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4100: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4110: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4120: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4130: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4140: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4150: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4160: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
4170: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
4180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
41a0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
41b0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
41c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
41d0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  }..    /* Discar
41e0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
41f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4200: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4210: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
4220: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
4230: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
4240: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
4250: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
4260: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
4270: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
4280: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
4290: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
42a0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
42b0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
42c0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
42d0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
42e0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
42f0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
4300: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
4310: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4320: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4330: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4360: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4370: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4380: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4390: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
43a0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
43b0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
43c0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
43d0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
43e0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
43f0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
4400: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
4410: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
4420: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
4430: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
4440: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4450: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4460: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4480: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4490: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
44a0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
44b0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
44c0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
44d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
44e0: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
44f0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4510: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
4520: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
4530: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
4540: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
4550: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
4560: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
4570: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
4580: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
4590: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
45a0: 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c  .  int end = sql
45b0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
45c0: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
45d0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
45e0: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
45f0: 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  n;.  sqliteVdbeA
4600: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
4610: 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d   0, 0);.  addr =
4620: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4630: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
4640: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69 66 28 20   0, end);.  if( 
4650: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b  p->iOffset>=0 ){
4660: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4670: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4680: 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  cr, p->iOffset, 
4690: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c  addr+4);.    sql
46a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
46b0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
46c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
46d0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
46e0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69  , addr);.  }.  i
46f0: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
4700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
4710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4720: 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Incr, p->iLimit,
4730: 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 77 69   end);.  }.  swi
4740: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
4750: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4760: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ack: {.      sql
4770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4780: 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c  OP_SortCallback,
4790: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
47a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
47b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
47c0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
47d0: 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20  T_TempTable: {. 
47e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
47f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
4800: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
4810: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4820: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4830: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4840: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4850: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
4860: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4880: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
4890: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
48a0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
48b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
48c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
48d0: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64 62  l, -1, sqliteVdb
48e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
48f0: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
4900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4910: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
4920: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4930: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4940: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
4950: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4960: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4970: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4980: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
4990: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
49a0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
49b0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
49c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
49d0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
49e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
49f0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4a00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4a10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
4a20: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
4a30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4a40: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4a50: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 20 20   0, end);.      
4a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a70: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4a80: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
4a90: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
4aa0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
4ab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
4ac0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4ad0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
4ae0: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
4af0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4b00: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
4b10: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
4b20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4b30: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4b40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4b50: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
4b60: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
4b70: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
4b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4b90: 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41   }.  sqliteVdbeA
4ba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4bb0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
4bc0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
4bd0: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73  bel(v, end);.  s
4be0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4bf0: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
4c00: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
4c10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4c20: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
4c30: 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74 79   VDBE the dataty
4c40: 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  pes of.** column
4c50: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4c60: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  set..**.** This 
4c70: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e  routine only gen
4c80: 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20 74  erates code if t
4c90: 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77 5f  he "PRAGMA show_
4ca0: 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a  datatypes=on".**
4cb0: 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75 74   has been execut
4cc0: 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79 70  ed.  The datatyp
4cd0: 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  es are reported 
4ce0: 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  out in the azCol
4cf0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f  .** parameter to
4d00: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4d10: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 72  nction.  The fir
4d20: 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74  st N azCol[] ent
4d30: 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  ries.** are the 
4d40: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
4d50: 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 65  umns, and the se
4d60: 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20 61  cond N entries a
4d70: 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  re the.** dataty
4d80: 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  pes for the colu
4d90: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  mns..**.** The "
4da0: 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61 20  datatype" for a 
4db0: 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20 61  result that is a
4dc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70   column of a typ
4dd0: 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  e is the.** data
4de0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
4df0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4e00: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
4e10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
4e20: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61  e datatype for a
4e30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4e40: 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20 4e  either TEXT or N
4e50: 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20  UMERIC.  The.** 
4e60: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20 52  datatype for a R
4e70: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
4e80: 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  TEGER..*/.static
4e90: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
4ea0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
4eb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4ec0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4ed0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
4ee0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
4ef0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
4f00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4f10: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
4f20: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
4f30: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
4f40: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
4f50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4f60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
4f70: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
4f80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
4f90: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
4fa0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
4fb0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
4fc0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   0;.    if( p==0
4fd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4fe0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
4ff0: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
5000: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
5010: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e   *pTab;.      in
5020: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
5030: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
5040: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
5050: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
5060: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
5070: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
5080: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
5090: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
50a0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
50b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
50c0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
50d0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
50e0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
50f0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
5100: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5110: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5120: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5130: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
5140: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
5150: 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  GER";.      }els
5160: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
5170: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
5180: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
5190: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
51a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
51b0: 70 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54  prType(p)==SQLIT
51c0: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
51d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
51e0: 58 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  XT";.      }else
51f0: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
5200: 3d 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20  = "NUMERIC";.   
5210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5220: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5230: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5240: 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i + pEList->nEx
5250: 70 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  pr, 0);.    sqli
5260: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5270: 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 30 29 3b  , -1, zType, 0);
5280: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
5290: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
52a0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
52b0: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
52c0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
52d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
52e0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
52f0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
5300: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
5310: 5b 5d 20 76 61 6f 6c 75 65 73 20 69 6e 20 74 68  [] vaolues in th
5320: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
5330: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
5340: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
5350: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5360: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
5370: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
5380: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
5390: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
53a0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
53b0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
53c0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
53d0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
53e0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
53f0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
5400: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
5410: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
5420: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
5430: 30 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  0 || sqlite_mall
5440: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
5450: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
5460: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
5470: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
5480: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
5490: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
54a0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
54b0: 30 3b 0a 20 20 20 20 69 6e 74 20 73 68 6f 77 46  0;.    int showF
54c0: 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 70 20  ullNames;.    p 
54d0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
54e0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d  Expr;.    if( p=
54f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
5500: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
5510: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
5520: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
5530: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
5540: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
5550: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5560: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
5570: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5580: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
5590: 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  -1, zName, strle
55a0: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
55b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
55c0: 0a 20 20 20 20 73 68 6f 77 46 75 6c 6c 4e 61 6d  .    showFullNam
55d0: 65 73 20 3d 20 28 70 50 61 72 73 65 2d 3e 64 62  es = (pParse->db
55e0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
55f0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
5600: 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  0;.    if( p->op
5610: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
5620: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
5630: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5640: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
5650: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
5660: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
5670: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
5680: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
5690: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
56a0: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
56b0: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
56c0: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
56d0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
56e0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
56f0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
5700: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5710: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
5720: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
5730: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
5740: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
5750: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
5760: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
5770: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
5780: 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20  = "_ROWID_";.   
5790: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
57a0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65  TEGER";.      }e
57b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
57c0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
57d0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
57e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
57f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
5800: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
5810: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20    if( p->span.z 
5820: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
5830: 26 26 20 21 73 68 6f 77 46 75 6c 6c 4e 61 6d 65  && !showFullName
5840: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  s ){.        int
5850: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
5860: 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c  beAddOp(v,OP_Col
5870: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
5880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5890: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
58a0: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
58b0: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  span.n);.       
58c0: 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72   sqliteVdbeCompr
58d0: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
58e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
58f0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
5900: 63 3e 31 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e  c>1 || showFullN
5910: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
5920: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
5930: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5940: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
5950: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
5960: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
5970: 20 20 20 20 20 69 66 28 20 73 68 6f 77 46 75 6c       if( showFul
5980: 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d  lNames || zTab==
5990: 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d  0 ) zTab = pTab-
59a0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
59b0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
59c0: 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e  &zName, zTab, ".
59d0: 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  ", zCol, 0);.   
59e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
59f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
5a00: 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20  nName, i, 0);.  
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5a20: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
5a30: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
5a40: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ame));.        s
5a50: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
5a60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5a70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
5a80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
5a90: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
5aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5ab0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
5ac0: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
5ad0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
5ae0: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
5af0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
5b00: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
5b10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5b20: 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  v,OP_ColumnName,
5b30: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
5b40: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5b50: 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e  (v, -1, p->span.
5b60: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
5b70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5b80: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
5b90: 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  addr);.    }else
5ba0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61  {.      char zNa
5bb0: 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73  me[30];.      as
5bc0: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
5bd0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69  COLUMN || pTabLi
5be0: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  st==0 );.      s
5bf0: 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63  printf(zName, "c
5c00: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
5c10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5c20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
5c30: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20  mnName, i, 0);. 
5c40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5c50: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
5c60: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
5c70: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
5c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  }../*.** Name of
5c90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5ca0: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
5cb0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
5cc0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
5cd0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
5ce0: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
5cf0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
5d00: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
5d10: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
5d20: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
5d30: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
5d40: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
5d50: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
5d60: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
5d70: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
5d80: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
5d90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5da0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
5db0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
5dc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5dd0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
5de0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
5df0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
5e00: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
5e10: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a  olumnList(Parse*
5e20: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a  , Select*);../*.
5e30: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
5e40: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
5e50: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
5e60: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
5e70: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
5e80: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
5e90: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
5ea0: 65 20 2a 73 71 6c 69 74 65 52 65 73 75 6c 74 53  e *sqliteResultS
5eb0: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
5ec0: 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a   *pParse, char *
5ed0: 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74  zTabName, Select
5ee0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
5ef0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
5f00: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
5f10: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c  t *pEList;.  Col
5f20: 75 6d 6e 20 2a 61 43 6f 6c 3b 0a 0a 20 20 69 66  umn *aCol;..  if
5f30: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
5f40: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
5f50: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
5f60: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
5f70: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5f80: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
5f90: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
5fa0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5fb0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d    }.  pTab->zNam
5fc0: 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73  e = zTabName ? s
5fd0: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62  qliteStrDup(zTab
5fe0: 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c  Name) : 0;.  pEL
5ff0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
6000: 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e  EList;.  pTab->n
6010: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
6020: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
6030: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
6040: 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43   pTab->aCol = aC
6050: 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ol = sqliteMallo
6060: 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e  c( sizeof(pTab->
6070: 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e  aCol[0])*pTab->n
6080: 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Col );.  for(i=0
6090: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
60a0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
60b0: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 69 66 28 20  p, *pR;.    if( 
60c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
60d0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 61 43 6f 6c  me ){.      aCol
60e0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
60f0: 74 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d  teStrDup(pEList-
6100: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
6110: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70    }else if( (p=p
6120: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6130: 72 29 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a  r)->op==TK_DOT .
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
6150: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
6160: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
6170: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
6180: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  z[0] ){.      in
6190: 74 20 63 6e 74 3b 0a 20 20 20 20 20 20 73 71 6c  t cnt;.      sql
61a0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 61  iteSetNString(&a
61b0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52  Col[i].zName, pR
61c0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74  ->token.z, pR->t
61d0: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
61e0: 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a    for(j=cnt=0; j
61f0: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
6200: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
6210: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
6220: 65 2c 20 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e, aCol[i].zName
6230: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6240: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
6250: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
6260: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69  ;.          spri
6270: 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 2b  ntf(zBuf,"_%d",+
6280: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  +cnt);.         
6290: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66   n = strlen(zBuf
62a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
62b0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 61  iteSetNString(&a
62c0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 52  Col[i].zName, pR
62d0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 2d 3e 74  ->token.z, pR->t
62e0: 6f 6b 65 6e 2e 6e 2c 20 7a 42 75 66 2c 20 6e 2c  oken.n, zBuf, n,
62f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20  0);.          j 
6300: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = -1;.        }.
6310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6320: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
6330: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
6340: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
6350: 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d  etNString(&pTab-
6360: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
6370: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
6380: 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65  an.n, 0);.    }e
6390: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
63a0: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
63b0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63  sprintf(zBuf, "c
63c0: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
63d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
63e0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
63f0: 74 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a  teStrDup(zBuf);.
6400: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
6410: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
6420: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
6430: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69  /*.** For the gi
6440: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
6450: 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20 74  ment, do three t
6460: 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  hings..**.**    
6470: 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (1)  Fill in the
6480: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
6490: 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
64a0: 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
64b0: 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
64c0: 65 73 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  es the set of ta
64d0: 62 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64  bles that should
64e0: 20 62 65 20 73 63 61 6e 6e 65 64 2e 20 20 46 6f   be scanned.  Fo
64f0: 72 20 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20 20  r views,.**     
6500: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
6510: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
6520: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
6530: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6540: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
6550: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
6560: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
6570: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
6580: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
6590: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
65a0: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
65b0: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
65c0: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
65d0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
65e0: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
65f0: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
6600: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
6610: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
6620: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
6630: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
6640: 20 20 20 20 28 32 29 20 20 41 64 64 20 74 65 72      (2)  Add ter
6650: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
6660: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
6670: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
6680: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
6690: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
66a0: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
66b0: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
66c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  s..**.**    (3) 
66d0: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
66e0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
66f0: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
6700: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
6710: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
6720: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
6730: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
6740: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
6750: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
6760: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
6770: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
6780: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
6790: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
67a0: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
67b0: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
67c0: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
67d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
67e0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
67f0: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
6800: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
6810: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
6820: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
6830: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
6840: 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f  tic int fillInCo
6850: 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20 2a  lumnList(Parse *
6860: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
6870: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
6880: 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74  k, rc;.  SrcList
6890: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
68a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
68b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
68c0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
68d0: 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >pSrc==0 ) retur
68e0: 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  n 1;.  pTabList 
68f0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
6900: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
6910: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
6920: 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68  very table in th
6930: 65 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20  e table list..  
6940: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
6950: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
6960: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  i++){.    if( pT
6970: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
6980: 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  b ){.      /* Th
6990: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
69a0: 75 6e 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e  un before!  No n
69b0: 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  eed to continue 
69c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
69d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
69e0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
69f0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
6a00: 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
6a10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
6a20: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
6a30: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
6a40: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6a50: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
6a60: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
6a70: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30  ->a[i].zAlias==0
6a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
6a90: 20 7a 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a   zFakeName[60];.
6aa0: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
6ab0: 7a 46 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69  zFakeName, "sqli
6ac0: 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
6ad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
6ae0: 69 64 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b  id*)pTabList->a[
6af0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
6b00: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
6b10: 72 69 6e 67 28 26 70 54 61 62 4c 69 73 74 2d 3e  ring(&pTabList->
6b20: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61  a[i].zAlias, zFa
6b30: 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  keName, 0);.    
6b40: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 4c 69    }.      pTabLi
6b50: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  st->a[i].pTab = 
6b60: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
6b70: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
6b80: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
6b90: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6ba0: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6bd0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6be0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
6bf0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
6c00: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6c10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
6c20: 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20  The isTransient 
6c30: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
6c40: 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74  hat the Table st
6c50: 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e  ructure has been
6c60: 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
6c70: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
6c80: 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64  and may be freed
6c90: 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49   at any time.  I
6ca0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20  n other words,. 
6cb0: 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20       ** pTab is 
6cc0: 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
6cd0: 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  a persistent tab
6ce0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
6cf0: 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20  t defines.      
6d00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
6d10: 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
6d20: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
6d30: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
6d40: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
6d50: 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
6d60: 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
6d70: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
6d80: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
6d90: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
6da0: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
6db0: 74 65 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  teLocateTable(pP
6dc0: 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61  arse,pTabList->a
6dd0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c 69  [i].zName,pTabLi
6de0: 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61  st->a[i].zDataba
6df0: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
6e00: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
6e10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6e20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
6e30: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
6e40: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
6e50: 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
6e60: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
6e70: 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
6e80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
6e90: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
6ea0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
6eb0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
6ec0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6ed0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
6ee0: 49 66 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  If pTabList->a[i
6ef0: 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ].pSelect!=0 it 
6f00: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
6f10: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
6f20: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
6f30: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
6f40: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
6f50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
6f60: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
6f70: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
6f80: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
6f90: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
6fa0: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
6fb0: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
6fc0: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
6fd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
6fe0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6ff0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
7000: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
7010: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
7020: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 54 61  iteSelectDup(pTa
7030: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
7040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7050: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
7060: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
7070: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
7080: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
7090: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
70a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
70b0: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
70c0: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
70d0: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
70e0: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
70f0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
7100: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
7110: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
7120: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
7130: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
7140: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
7150: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
7160: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
7170: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
7180: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
7190: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
71a0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
71b0: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
71c0: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
71d0: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
71e0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
71f0: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
7200: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
7210: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
7220: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
7230: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
7240: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
7250: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
7260: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
7270: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
7280: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
7290: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
72a0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
72b0: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
72c0: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
72d0: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
72e0: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
72f0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7300: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
7310: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
7320: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
7330: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
7340: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
7350: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
7360: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
7370: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
7380: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
7390: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
73a0: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
73b0: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
73c0: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
73d0: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
73e0: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
73f0: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
7400: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
7410: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
7420: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
7430: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
7440: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
7450: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
7460: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
7470: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
7480: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
7490: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
74a0: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
74b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
74c0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
74d0: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
74e0: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
74f0: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f  pNew = 0;.    fo
7500: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
7510: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
7520: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61      Expr *pE = a
7530: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
7540: 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
7550: 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20  ALL &&.         
7560: 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f    (pE->op!=TK_DO
7570: 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d  T || pE->pRight=
7580: 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  =0 || pE->pRight
7590: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
75a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
75b0: 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
75c0: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
75d0: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
75e0: 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
75f0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
7600: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
7610: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
7620: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
7630: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
7640: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
7650: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
7660: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
7670: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
7680: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
7690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
76a0: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
76b0: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
76c0: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
76d0: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
76e0: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
76f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
7700: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
7710: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
7720: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
7730: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  hes */.        T
7740: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
7750: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
7760: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
7770: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
7780: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
7790: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
77a0: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
77b0: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
77c0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
77d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  {.          pNam
77e0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
77f0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
7800: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
7810: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
7820: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
7830: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
7840: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
7850: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
7860: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
7870: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
7880: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
7890: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
78a0: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
78b0: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
78c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
78d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
78e0: 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20     if( pName && 
78f0: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
7900: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
7910: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
7920: 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43      sqliteStrNIC
7930: 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61  mp(pName->z, zTa
7940: 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29  bName, pName->n)
7950: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
7960: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
7970: 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29  [pName->n]!=0) )
7980: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7990: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
79a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
79b0: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
79c0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
79d0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
79e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
79f0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
7a00: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
7a10: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7a20: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
7a30: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
7a40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
7a50: 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  0 && (pTabList->
7a60: 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  a[i-1].jointype 
7a70: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
7a80: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
7a90: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
7aa0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
7ab0: 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  .pTab, zName)>=0
7ac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7ad0: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
7ae0: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
7af0: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
7b00: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
7b10: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
7b20: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7b40: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7b50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7b60: 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c 69   if( i>0 && sqli
7b70: 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 70 54  teIdListIndex(pT
7b80: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70  abList->a[i-1].p
7b90: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
7ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7bb0: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
7bc0: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
7bd0: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
7be0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
7bf0: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
7c00: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
7c10: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7c20: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
7c30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7c50: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
7c60: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
7c70: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
7c80: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
7c90: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
7cb0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e  ht->token.z = zN
7cc0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
7cd0: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
7ce0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
7cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
7d00: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  ight->token.dyn 
7d10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7d20: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
7d30: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
7d40: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
7d50: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
7d60: 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  eExpr(TK_ID, 0, 
7d70: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
7d80: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
7d90: 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  iteExpr(TK_DOT, 
7da0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
7db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7dc0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7de0: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
7df0: 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a  n.z = zTabName;.
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
7e10: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  eft->token.n = s
7e20: 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b  trlen(zTabName);
7e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7e40: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Left->token.dyn 
7e50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7e60: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7e70: 6e 67 28 28 63 68 61 72 2a 2a 29 26 70 45 78 70  ng((char**)&pExp
7e80: 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a 54 61 62 4e  r->span.z, zTabN
7e90: 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e 61 6d 65 2c  ame, ".", zName,
7ea0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
7eb0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
7ec0: 20 3d 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d   = strlen(pExpr-
7ed0: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  >span.z);.      
7ee0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
7ef0: 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
7f00: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7f10: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
7f30: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
7f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7f50: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
7f60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7f80: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
7f90: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
7fa0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
7fb0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7fd0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
7fe0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
7ff0: 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70  ppend(pNew, pExp
8000: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
8010: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8020: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
8030: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
8040: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
8050: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8060: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8070: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
8080: 20 25 54 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20   %T", pName);.  
8090: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
80a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
80b0: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
80c0: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
80d0: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
80e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
80f0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
8100: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8110: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69      sqliteExprLi
8120: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
8130: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
8140: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
8150: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8160: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
8170: 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e  ecursively unlin
8180: 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  ks the Select.pS
8190: 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e  rc.a[].pTab poin
81a0: 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c  ters.** in a sel
81b0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
81c0: 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  It just sets the
81d0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c   pointers to NUL
81e0: 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  L.  This.** rout
81f0: 69 6e 65 20 69 73 20 72 65 63 75 72 73 69 76 65  ine is recursive
8200: 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
8210: 61 74 20 69 66 20 74 68 65 20 53 65 6c 65 63 74  at if the Select
8220: 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63  .pSrc.a[].pSelec
8230: 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20  t.** pointer is 
8240: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72  not NULL, this r
8250: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8260: 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
8270: 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  that pointer..**
8280: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8290: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
82a0: 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
82b0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  re that defines 
82c0: 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64  a.** VIEW in ord
82d0: 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62  er to undo any b
82e0: 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65  indings to table
82f0: 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  s.  This is nece
8300: 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65  ssary.** because
8310: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69   those tables mi
8320: 67 68 74 20 62 65 20 44 52 4f 50 65 64 20 62 79  ght be DROPed by
8330: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 53 51   a subsequent SQ
8340: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 66  L command..** If
8350: 20 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61 72   the bindings ar
8360: 65 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20 74  e not removed, t
8370: 68 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70  hen the Select.p
8380: 53 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  Src->a[].pTab fi
8390: 65 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6c  eld.** will be l
83a0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
83b0: 61 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54 61  a deallocated Ta
83c0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 66  ble structure af
83d0: 74 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50 20  ter the.** DROP 
83e0: 61 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20 77  and a coredump w
83f0: 69 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e 65  ill occur the ne
8400: 78 74 20 74 69 6d 65 20 74 68 65 20 56 49 45 57  xt time the VIEW
8410: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   is used..*/.voi
8420: 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e  d sqliteSelectUn
8430: 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b  bind(Select *p){
8440: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
8450: 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
8460: 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Src;.  Table *pT
8470: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
8480: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
8490: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
84a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
84b0: 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b  (pTab = pSrc->a[
84c0: 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20  i].pTab)!=0 ){. 
84d0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69       if( pTab->i
84e0: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
84f0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
8500: 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29  teTable(0, pTab)
8510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8520: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  pSrc->a[i].pTab 
8530: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
8540: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
8550: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8560: 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  iteSelectUnbind(
8570: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
8580: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
8590: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
85a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  This routine ass
85b0: 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73 20  ociates entries 
85c0: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65  in an ORDER BY e
85d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77  xpression list w
85e0: 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  ith.** columns i
85f0: 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  n a result.  For
8600: 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20 65   each ORDER BY e
8610: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f  xpression, the o
8620: 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20  pcode of.** the 
8630: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
8640: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
8650: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69  COLUMN and the i
8660: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a  Column value of.
8670: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
8680: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
8690: 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e  in with column n
86a0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 54  umber and the iT
86b0: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  able.** value of
86c0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
86d0: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ode is filled wi
86e0: 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65  th iTable parame
86f0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
8700: 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53 45  ere are prior SE
8710: 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68  LECT clauses, th
8720: 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ey are processed
8730: 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68   first.  A match
8740: 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65  .** in an earlie
8750: 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70  r SELECT takes p
8760: 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61  recedence over a
8770: 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a   later SELECT..*
8780: 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74  *.** Any entry t
8790: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
87a0: 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61 73  ch is flagged as
87b0: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
87c0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
87d0: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
87e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
87f0: 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 63 6f 72  ine does NOT cor
8800: 72 65 63 74 6c 79 20 69 6e 69 74 69 61 6c 69 7a  rectly initializ
8810: 65 20 74 68 65 20 45 78 70 72 2e 64 61 74 61 54  e the Expr.dataT
8820: 79 70 65 20 20 66 69 65 6c 64 0a 2a 2a 20 6f 66  ype  field.** of
8830: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78   the ORDER BY ex
8840: 70 72 65 73 73 69 6f 6e 73 2e 20 20 54 68 65 20  pressions.  The 
8850: 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f  multiSelectSortO
8860: 72 64 65 72 28 29 20 72 6f 75 74 69 6e 65 0a 2a  rder() routine.*
8870: 2a 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  * must be called
8880: 20 74 6f 20 64 6f 20 74 68 61 74 20 61 66 74 65   to do that afte
8890: 72 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  r the individual
88a0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
88b0: 74 73 0a 2a 2a 20 68 61 76 65 20 61 6c 6c 20 62  ts.** have all b
88c0: 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 20 20 54  een analyzed.  T
88d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
88e0: 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 75 74 65  nable to compute
88f0: 20 45 78 70 72 2e 64 61 74 61 54 79 70 65 0a 2a   Expr.dataType.*
8900: 2a 20 62 65 63 61 75 73 65 20 69 74 20 6d 75 73  * because it mus
8910: 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
8920: 72 65 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  re the individua
8930: 6c 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  l select stateme
8940: 6e 74 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  nts.** have been
8950: 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74   analyzed..*/.st
8960: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
8970: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
8980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8990: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
89a0: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
89b0: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
89c0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
89d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
89e0: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
89f0: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
8a00: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
8a10: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
8a20: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8a30: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
8a40: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
8a50: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a70: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
8a80: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
8a90: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
8aa0: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
8ab0: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
8ac0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
8ad0: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
8ae0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
8af0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8b00: 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t;..  if( pSelec
8b10: 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79  t==0 || pOrderBy
8b20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
8b30: 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65    if( mustComple
8b40: 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  te ){.    for(i=
8b50: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
8b60: 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64  Expr; i++){ pOrd
8b70: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
8b80: 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  = 0; }.  }.  if(
8b90: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
8ba0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
8bb0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
8bc0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   1;.  }.  if( pS
8bd0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b  elect->pPrior ){
8be0: 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72  .    if( matchOr
8bf0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
8c00: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
8c10: 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c  Prior, pOrderBy,
8c20: 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20   iTable, 0) ){. 
8c30: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
8c50: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
8c60: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
8c70: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
8c80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
8c90: 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79  r *pE = pOrderBy
8ca0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
8cb0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b    int iCol = -1;
8cc0: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
8cd0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63  y->a[i].done ) c
8ce0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
8cf0: 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
8d00: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
8d10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
8d20: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
8d30: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
8d40: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
8d50: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
8d60: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
8d70: 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f   position %d sho
8d80: 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31  uld be between 1
8d90: 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20   and %d",.      
8da0: 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74      iCol, pEList
8db0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
8dc0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
8dd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8de0: 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74  .      if( !must
8df0: 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69  Complete ) conti
8e00: 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d  nue;.      iCol-
8e10: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  -;.    }.    for
8e20: 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20  (j=0; iCol<0 && 
8e30: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
8e40: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
8e50: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
8e60: 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d  ame && (pE->op==
8e70: 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d  TK_ID || pE->op=
8e80: 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20  =TK_STRING) ){. 
8e90: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
8ea0: 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20  me, *zLabel;.   
8eb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
8ec0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
8ed0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8ee0: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a   pE->token.z );.
8ef0: 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d          zLabel =
8f00: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
8f10: 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e  E->token.z, pE->
8f20: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
8f30: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
8f40: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  zLabel);.       
8f50: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
8f60: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
8f70: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
8f80: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
8f90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
8fa0: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
8fb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8fc0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
8fd0: 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65  qliteExprCompare
8fe0: 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  (pE, pEList->a[j
8ff0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
9000: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
9010: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9020: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
9030: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
9040: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70  _COLUMN;.      p
9050: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  E->iColumn = iCo
9060: 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61  l;.      pE->iTa
9070: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
9080: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
9090: 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  i].done = 1;.   
90a0: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c   }.    if( iCol<
90b0: 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74  0 && mustComplet
90c0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
90d0: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
90e0: 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ,.        "ORDER
90f0: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
9100: 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  %d does not matc
9110: 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  h any result col
9120: 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  umn", i+1);.    
9130: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
9140: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9150: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
9160: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
9170: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
9180: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
9190: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
91a0: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
91b0: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
91c0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
91d0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
91e0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
91f0: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
9200: 71 6c 69 74 65 47 65 74 56 64 62 65 28 50 61 72  qliteGetVdbe(Par
9210: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
9220: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9230: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
9240: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
9250: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
9260: 6c 69 74 65 56 64 62 65 43 72 65 61 74 65 28 70  liteVdbeCreate(p
9270: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
9280: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f    return v;.}../
9290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
92a0: 65 20 73 65 74 73 20 74 68 65 20 45 78 70 72 2e  e sets the Expr.
92b0: 64 61 74 61 54 79 70 65 20 66 69 65 6c 64 20 6f  dataType field o
92c0: 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f  n all elements o
92d0: 66 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42  f.** the pOrderB
92e0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  y expression lis
92f0: 74 2e 20 20 54 68 65 20 70 4f 72 64 65 72 42 79  t.  The pOrderBy
9300: 20 6c 69 73 74 20 77 69 6c 6c 20 68 61 76 65 20   list will have 
9310: 62 65 65 6e 0a 2a 2a 20 73 65 74 20 75 70 20 62  been.** set up b
9320: 79 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  y matchOrderbyTo
9330: 43 6f 6c 75 6d 6e 28 29 2e 20 20 48 65 6e 63 65  Column().  Hence
9340: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
9350: 20 68 61 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c   has.** a TK_COL
9360: 55 4d 4e 20 61 73 20 69 74 73 20 72 6f 6f 74 20  UMN as its root 
9370: 6e 6f 64 65 2e 20 20 54 68 65 20 45 78 70 72 2e  node.  The Expr.
9380: 69 43 6f 6c 75 6d 6e 20 72 65 66 65 72 73 20 74  iColumn refers t
9390: 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  o a .** column i
93a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
93b0: 2e 20 20 20 54 68 65 20 64 61 74 61 74 79 70 65  .   The datatype
93c0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
93d0: 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a 20 69 66 20  E_SO_TEXT.** if 
93e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
93f0: 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 20 61 6e  g column in p an
9400: 64 20 65 76 65 72 79 20 53 45 4c 45 43 54 20 74  d every SELECT t
9410: 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 0a 2a 2a  o the left of.**
9420: 20 70 20 68 61 73 20 61 20 64 61 74 61 74 79 70   p has a datatyp
9430: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 4f 5f 54  e of SQLITE_SO_T
9440: 45 58 54 2e 20 20 49 66 20 74 68 65 20 63 6f 6f  EXT.  If the coo
9450: 72 65 73 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75  ressponding colu
9460: 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f 72 20 61 6e  mn.** in p or an
9470: 79 20 6f 66 20 74 68 65 20 6c 65 66 74 20 53 45  y of the left SE
9480: 4c 45 43 54 73 20 69 73 20 53 51 4c 49 54 45 5f  LECTs is SQLITE_
9490: 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e 20 74 68 65  SO_NUM, then the
94a0: 20 64 61 74 61 74 79 70 65 0a 2a 2a 20 6f 66 20   datatype.** of 
94b0: 74 68 65 20 6f 72 64 65 72 2d 62 79 20 65 78 70  the order-by exp
94c0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74  ression is set t
94d0: 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2e  o SQLITE_SO_NUM.
94e0: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a  .**.** Examples:
94f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  .**.**     CREAT
9500: 45 20 54 41 42 4c 45 20 6f 6e 65 28 61 20 49 4e  E TABLE one(a IN
9510: 54 45 47 45 52 2c 20 62 20 54 45 58 54 29 3b 0a  TEGER, b TEXT);.
9520: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
9530: 42 4c 45 20 74 77 6f 28 63 20 56 41 52 43 48 41  BLE two(c VARCHA
9540: 52 28 35 29 2c 20 64 20 46 4c 4f 41 54 29 3b 0a  R(5), d FLOAT);.
9550: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
9560: 20 62 2c 20 62 20 46 52 4f 4d 20 6f 6e 65 20 55   b, b FROM one U
9570: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20 63  NION SELECT d, c
9580: 20 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20   FROM two ORDER 
9590: 42 59 20 31 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20 54  BY 1, 2;.**.** T
95a0: 68 65 20 70 72 69 6d 61 72 79 20 73 6f 72 74 20  he primary sort 
95b0: 6b 65 79 20 77 69 6c 6c 20 75 73 65 20 53 51 4c  key will use SQL
95c0: 49 54 45 5f 53 4f 5f 4e 55 4d 20 62 65 63 61 75  ITE_SO_NUM becau
95d0: 73 65 20 74 68 65 20 22 64 22 20 69 6e 0a 2a 2a  se the "d" in.**
95e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 53 45 4c 45   the second SELE
95f0: 43 54 20 69 73 20 6e 75 6d 65 72 69 63 2e 20 20  CT is numeric.  
9600: 54 68 65 20 31 73 74 20 63 6f 6c 75 6d 6e 20 6f  The 1st column o
9610: 66 20 74 68 65 20 66 69 72 73 74 20 53 45 4c 45  f the first SELE
9620: 43 54 0a 2a 2a 20 69 73 20 74 65 78 74 20 62 75  CT.** is text bu
9630: 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
9640: 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 61  matter because a
9650: 20 6e 75 6d 65 72 69 63 20 61 6c 77 61 79 73 20   numeric always 
9660: 6f 76 65 72 72 69 64 65 73 0a 2a 2a 20 61 20 74  overrides.** a t
9670: 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ext..**.** The s
9680: 65 63 6f 6e 64 61 72 79 20 6b 65 79 20 77 69 6c  econdary key wil
9690: 6c 20 75 73 65 20 74 68 65 20 53 51 4c 49 54 45  l use the SQLITE
96a0: 5f 53 4f 5f 54 45 58 54 20 73 6f 72 74 20 6f 72  _SO_TEXT sort or
96b0: 64 65 72 20 62 65 63 61 75 73 65 0a 2a 2a 20 62  der because.** b
96c0: 6f 74 68 20 74 68 65 20 28 73 65 63 6f 6e 64 29  oth the (second)
96d0: 20 22 62 22 20 69 6e 20 74 68 65 20 66 69 72 73   "b" in the firs
96e0: 74 20 53 45 4c 45 43 54 20 61 6e 64 20 74 68 65  t SELECT and the
96f0: 20 22 63 22 20 69 6e 20 74 68 65 20 73 65 63 6f   "c" in the seco
9700: 6e 64 0a 2a 2a 20 53 45 4c 45 43 54 20 68 61 76  nd.** SELECT hav
9710: 65 20 61 20 64 61 74 61 74 79 70 65 20 6f 66 20  e a datatype of 
9720: 74 65 78 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  text..*/ .static
9730: 20 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63   void multiSelec
9740: 74 53 6f 72 74 4f 72 64 65 72 28 53 65 6c 65 63  tSortOrder(Selec
9750: 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a  t *p, ExprList *
9760: 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74  pOrderBy){.  int
9770: 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   i;.  ExprList *
9780: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4f  pEList;.  if( pO
9790: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
97a0: 72 6e 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  rn;.  if( p==0 )
97b0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
97c0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
97d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; i++){.      pO
97e0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
97f0: 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53  pr->dataType = S
9800: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
9810: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b     }.    return;
9820: 0a 20 20 7d 0a 20 20 6d 75 6c 74 69 53 65 6c 65  .  }.  multiSele
9830: 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2d 3e 70  ctSortOrder(p->p
9840: 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 29  Prior, pOrderBy)
9850: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
9860: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
9870: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
9880: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9890: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
98a0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
98b0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 64 61 74  .    if( pE->dat
98c0: 61 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f  aType==SQLITE_SO
98d0: 5f 4e 55 4d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _NUM ) continue;
98e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
98f0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20  >iColumn>=0 );. 
9900: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e     if( pEList->n
9910: 45 78 70 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e  Expr>pE->iColumn
9920: 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 64 61   ){.      pE->da
9930: 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65 45  taType = sqliteE
9940: 78 70 72 54 79 70 65 28 70 45 4c 69 73 74 2d 3e  xprType(pEList->
9950: 61 5b 70 45 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  a[pE->iColumn].p
9960: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
9970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
9980: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
9990: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
99a0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
99b0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e 4c  sed on the.** nL
99c0: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
99d0: 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69 74   fields.  nLimit
99e0: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c   and nOffset hol
99f0: 64 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a 2a  d the integers.*
9a00: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
9a10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
9a20: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
9a30: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
9a40: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
9a50: 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f 6c  ds.  Or that hol
9a60: 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74 68  d -1 and 0 if th
9a70: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
9a80: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c 69   omitted..** iLi
9a90: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
9aa0: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
9ab0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
9ac0: 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20 63  numbers for.** c
9ad0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
9ae0: 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  compute the limi
9af0: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
9b00: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a  f there is no.**
9b10: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
9b20: 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d 69  fset, then iLimi
9b30: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
9b40: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
9b50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
9b60: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
9b70: 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s if iLimit and 
9b80: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
9b90: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
9ba0: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
9bb0: 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f  by nLimit and nO
9bc0: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
9bd0: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
9be0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
9bf0: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
9c00: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
9c10: 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20  ues.** (usually 
9c20: 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d  but not always -
9c30: 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  1) prior to call
9c40: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
9c50: 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69  ..** Only if nLi
9c60: 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65  mit>=0 or nOffse
9c70: 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  t>0 do the limit
9c80: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
9c90: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
9ca0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
9cb0: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
9cc0: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
9cd0: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
9ce0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
9cf0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
9d00: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
9d10: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
9d20: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
9d30: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
9d40: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
9d50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
9d60: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20  elect *p){.  /* 
9d70: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  .  ** If the com
9d80: 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e 4c  parison is p->nL
9d90: 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49 4d  imit>0 then "LIM
9da0: 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a 2a  IT 0" shows.  **
9db0: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20 69   all rows.  It i
9dc0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e 6f  s the same as no
9dd0: 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20 63   limit. If the c
9de0: 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20 20  omparision is.  
9df0: 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20  ** p->nLimit>=0 
9e00: 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20 73  then "LIMIT 0" s
9e10: 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20 61  how no rows at a
9e20: 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  ll..  ** "LIMIT 
9e30: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
9e40: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
9e50: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
9e60: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
9e70: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
9e80: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
9e90: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
9ea0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
9eb0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
9ec0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
9ed0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
9ee0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
9ef0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
9f00: 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
9f10: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56  e->nMem++;.    V
9f20: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
9f30: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9f40: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
9f50: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
9f60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9f70: 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c  _Integer, -p->nL
9f80: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
9f90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9fa0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
9fb0: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69  em, 1);.    p->i
9fc0: 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  Limit = iMem;.  
9fd0: 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73  }.  if( p->nOffs
9fe0: 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  et>0 ){.    int 
9ff0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
a000: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
a010: 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
a020: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
a030: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
a040: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  n;.    sqliteVdb
a050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
a060: 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65  eger, -p->nOffse
a070: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
a080: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a090: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
a0a0: 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66   1);.    p->iOff
a0b0: 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a  set = iMem;.  }.
a0c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a0d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a0e0: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
a0f0: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
a100: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
a110: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
a120: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
a130: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
a140: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
a150: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
a160: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
a170: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
a180: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
a190: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
a1a0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
a1b0: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
a1c0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
a1d0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
a1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a1f0: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
a200: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
a210: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
a220: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
a230: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
a240: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
a250: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
a260: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
a270: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
a280: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
a290: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
a2a0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
a2b0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
a2c0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
a2d0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
a2e0: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
a2f0: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
a300: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
a310: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
a320: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
a330: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
a340: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
a350: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
a360: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
a370: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
a380: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
a3a0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
a3b0: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
a3c0: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
a3d0: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
a3e0: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
a3f0: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
a400: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
a410: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a420: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
a430: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
a440: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
a450: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
a460: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
a470: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
a480: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
a490: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
a4a0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
a4b0: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
a4c0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
a4d0: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
a4e0: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
a4f0: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
a500: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
a510: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
a520: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
a530: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
a540: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
a550: 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Parm){.  int rc;
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a570: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
a580: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
a590: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
a5a0: 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  or;     /* Anoth
a5b0: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
a5c0: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
a5d0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
a5f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
a600: 68 69 73 20 56 44 42 45 20 2a 2f 0a 0a 20 20 2f  his VDBE */..  /
a610: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
a620: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
a630: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
a640: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
a650: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
a660: 65 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69 6e  e last SELECT in
a670: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
a680: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
a690: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
a6a0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
a6b0: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
a6c0: 75 72 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72 20  urn 1;.  pPrior 
a6d0: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69  = p->pPrior;.  i
a6e0: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
a6f0: 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
a700: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
a710: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
a720: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
a730: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
a740: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
a750: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
a760: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a770: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
a780: 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20 70 50 72  nLimit>=0 || pPr
a790: 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29  ior->nOffset>0 )
a7a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
a7b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
a7c0: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
a7d0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
a7e0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
a7f0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
a800: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75  ->op));.    retu
a810: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
a820: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
a830: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
a840: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
a850: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
a860: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
a870: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
a880: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
a890: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
a8a0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
a8b0: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
a8c0: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
a8d0: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
a8e0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
a8f0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
a900: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a910: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
a920: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73  rm, 0);.    eDes
a930: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
a940: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
a950: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
a960: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
a970: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
a980: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
a990: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
a9a0: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
a9b0: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
a9c0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
a9d0: 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20 3d  pPrior->nLimit =
a9e0: 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20   p->nLimit;.    
a9f0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66 66      pPrior->nOff
aa00: 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74  set = p->nOffset
aa10: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
aa20: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
aa30: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
aa40: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
aa50: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
aa60: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
aa70: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
aa80: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
aa90: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
aaa0: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
aab0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
aac0: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
aad0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  .        p->nLim
aae0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  it = -1;.       
aaf0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b   p->nOffset = 0;
ab00: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ab10: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
ab20: 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
ab30: 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  rm, 0, 0, 0);.  
ab40: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ab50: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
ab60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ab70: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62 72  n rc;.        br
ab80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ab90: 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20     /* For UNION 
aba0: 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ALL ... ORDER BY
abb0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
abc0: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
abd0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
abe0: 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
abf0: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
ac00: 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
ac10: 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
ac20: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
ac30: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ac40: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
ac50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20  /.      int op; 
ac60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
ac70: 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
ac80: 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
ac90: 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
aca0: 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
acb0: 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
acc0: 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
acd0: 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
ace0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
acf0: 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b 20  Limit, nOffset; 
ad00: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
ad10: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
ad20: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
ad30: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
ad40: 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65  OrderBy;  /* The
ad50: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ad60: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 53   for the right S
ad70: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20 20  ELECT */..      
ad80: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
ad90: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
ada0: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
adb0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
adc0: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e  ==priorOp && p->
add0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70  pOrderBy==0 && p
ade0: 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70 2d  ->nLimit<0 && p-
adf0: 3e 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  >nOffset==0 ){. 
ae00: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
ae10: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
ae20: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
ae30: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
ae40: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
ae50: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
ae60: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
ae70: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
ae80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae90: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
aea0: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
aeb0: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
aec0: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
aed0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
aee0: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
aef0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
af00: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
af10: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
af20: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
af30: 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20  rderBy .        
af40: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
af50: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
af60: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
af70: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a  unionTab, 1) ){.
af80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
af90: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
afa0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21        if( p->op!
afb0: 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20  =TK_ALL ){.     
afc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
afd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
afe0: 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31  emp, unionTab, 1
aff0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b000: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b010: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e  OP_KeyAsData, un
b020: 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20  ionTab, 1);.    
b030: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b040: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b050: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
b060: 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  emp, unionTab, 0
b070: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b080: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
b090: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
b0a0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
b0b0: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
b0c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b0d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b0e0: 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20  Prior, priorOp, 
b0f0: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
b100: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
b110: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
b120: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
b130: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
b140: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
b150: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
b160: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
b170: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
b180: 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63  T:  op = SRT_Exc
b190: 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ept;   break;.  
b1a0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55         case TK_U
b1b0: 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54  NION:   op = SRT
b1c0: 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b  _Union;    break
b1d0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
b1e0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d  TK_ALL:     op =
b1f0: 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62   SRT_Table;    b
b200: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b210: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
b220: 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  0;.      pOrderB
b230: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
b240: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
b250: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4c  By = 0;.      nL
b260: 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74  imit = p->nLimit
b270: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  ;.      p->nLimi
b280: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 4f  t = -1;.      nO
b290: 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73  ffset = p->nOffs
b2a0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66  et;.      p->nOf
b2b0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
b2c0: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
b2d0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
b2e0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
b2f0: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
b300: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
b310: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
b320: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
b330: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e     p->nLimit = n
b340: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
b350: 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65  nOffset = nOffse
b360: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
b370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
b380: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
b390: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
b3a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
b3b0: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
b3c0: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
b3d0: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
b3e0: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
b3f0: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
b400: 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  ( eDest!=priorOp
b410: 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50   || unionTab!=iP
b420: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
b430: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
b440: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
b450: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
b460: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
b470: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
b480: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
b490: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
b4a0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
b4b0: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
b4c0: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
b4d0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
b4e0: 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d  rse, p->pSrc, p-
b4f0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
b500: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65    }.        iBre
b510: 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  ak = sqliteVdbeM
b520: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b530: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
b540: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
b550: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
b560: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b570: 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
b580: 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  Tab, iBreak);.  
b590: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
b5a0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
b5b0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
b5c0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
b5d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b5e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69  );.        multi
b5f0: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
b600: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  p, p->pOrderBy);
b610: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
b620: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
b630: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
b640: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
b650: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
b680: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
b690: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
b6c0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b6d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b6e0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 1;.        sql
b6f0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b700: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
b710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b720: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
b730: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
b740: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
b750: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
b760: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
b770: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b790: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
b7a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
b7b0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
b7c0: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
b7d0: 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
b7e0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
b7f0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
b800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b810: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b820: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b830: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
b840: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
b850: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
b860: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
b870: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  tart;.      int 
b880: 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b  nLimit, nOffset;
b890: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
b8a0: 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
b8b0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
b8c0: 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
b8d0: 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
b8e0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b8f0: 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
b900: 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
b910: 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
b920: 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
b930: 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
b940: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
b950: 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
b960: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
b970: 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
b980: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
b990: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
b9a0: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
b9b0: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c  Column(pParse,p,
b9c0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31  p->pOrderBy,tab1
b9d0: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,1) ){.        r
b9e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
b9f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ba00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
ba10: 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b  nTemp, tab1, 1);
ba20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ba30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79  eAddOp(v, OP_Key
ba40: 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29  AsData, tab1, 1)
ba50: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
ba60: 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
ba70: 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
ba80: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
ba90: 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
baa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bab0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
bac0: 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e  Prior, SRT_Union
bad0: 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 29  , tab1, 0, 0, 0)
bae0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
baf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
bb00: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
bb10: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
bb20: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
bb30: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
bb40: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
bb50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
bb60: 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31  penTemp, tab2, 1
bb70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
bb80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
bb90: 65 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20  eyAsData, tab2, 
bba0: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  1);.      p->pPr
bbb0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  ior = 0;.      n
bbc0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
bbd0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  t;.      p->nLim
bbe0: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
bbf0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
bc00: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  set;.      p->nO
bc10: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
bc20: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
bc30: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52  ct(pParse, p, SR
bc40: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30  T_Union, tab2, 0
bc50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
bc60: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
bc70: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  r;.      p->nLim
bc80: 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  it = nLimit;.   
bc90: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
bca0: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  nOffset;.      i
bcb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
bcc0: 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  c;..      /* Gen
bcd0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
bce0: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
bcf0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
bd00: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
bd10: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
bd20: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
bd30: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
bd40: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
bd50: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
bd60: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
bd70: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
bd80: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
bd90: 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
bda0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
bdb0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70  arse, p->pSrc, p
bdc0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
bdd0: 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
bde0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
bdf0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
be00: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64  iCont = sqliteVd
be10: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
be20: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
be30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
be40: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
be50: 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
be60: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
be70: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
be80: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
be90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bea0: 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30  FullKey, tab1, 0
beb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
bec0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
bed0: 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
bee0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 6d 75 6c  Cont);.      mul
bef0: 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65  tiSelectSortOrde
bf00: 72 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  r(p, p->pOrderBy
bf10: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
bf20: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
bf30: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
bf40: 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c  st, tab1, p->pEL
bf50: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
bf80: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
bf90: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
bfc0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eak);.      if( 
bfd0: 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rc ) return 1;. 
bfe0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
bff0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
c000: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
c010: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c020: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
c030: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
c040: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
c050: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
c060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
c070: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
c080: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
c090: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c0a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
c0b0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
c0c0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
c0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
c0e0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20  rateSortTail(p, 
c0f0: 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  v, p->pEList->nE
c100: 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
c110: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
c120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c130: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
c140: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
c150: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
c160: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
c170: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
c180: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
c190: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
c1a0: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
c1b0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
c1c0: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
c1d0: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
c1e0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
c1f0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
c200: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
c210: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
c220: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
c230: 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c   /* Issue a null
c240: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61   callback if tha
c250: 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73  t is what the us
c260: 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20  er wants..  */. 
c270: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
c280: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
c290: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c2a0: 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61  v, OP_NullCallba
c2b0: 63 6b 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ck, p->pEList->n
c2c0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Expr, 0);.  }.  
c2d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c2e0: 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
c2f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
c300: 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
c310: 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
c320: 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
c330: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
c340: 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
c350: 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
c360: 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
c370: 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
c380: 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
c390: 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
c3a0: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
c3b0: 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
c3c0: 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
c3d0: 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
c3e0: 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
c3f0: 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
c400: 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
c410: 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
c420: 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
c430: 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
c440: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
c450: 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
c460: 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
c470: 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
c480: 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
c490: 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
c4a0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
c4b0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
c4c0: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
c4d0: 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
c4e0: 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
c4f0: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
c500: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
c510: 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
c520: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c530: 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
c540: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
c550: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
c560: 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a  t*,int,ExprList*
c570: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44  );  /* Forward D
c580: 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ecl */.static vo
c590: 69 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70  id substExpr(Exp
c5a0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54  r *pExpr, int iT
c5b0: 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  able, ExprList *
c5c0: 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  pEList){.  if( p
c5d0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
c5e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
c5f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
c600: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
c610: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
c620: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
c630: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
c640: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
c650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c660: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
c670: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
c680: 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
c690: 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
c6a0: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
c6b0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
c6c0: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
c6d0: 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78  pRight==0 && pEx
c6e0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
c6f0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c        pNew = pEL
c700: 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
c710: 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
c720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
c730: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  !=0 );.      pEx
c740: 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
c750: 70 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  p;.      pExpr->
c760: 64 61 74 61 54 79 70 65 20 3d 20 70 4e 65 77 2d  dataType = pNew-
c770: 3e 64 61 74 61 54 79 70 65 3b 0a 20 20 20 20 20  >dataType;.     
c780: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
c790: 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
c7a0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
c7b0: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
c7c0: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
c7d0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
c7e0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
c7f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
c800: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ht = sqliteExprD
c810: 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  up(pNew->pRight)
c820: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c830: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
c840: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
c850: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  pList = sqliteEx
c860: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
c870: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45  pList);.      pE
c880: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e  xpr->iTable = pN
c890: 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ew->iTable;.    
c8a0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
c8b0: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
c8c0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
c8d0: 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
c8e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 54 6f  ;.      sqliteTo
c8f0: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
c900: 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
c910: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
c920: 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  teTokenCopy(&pEx
c930: 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
c940: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
c950: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
c960: 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  Expr(pExpr->pLef
c970: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
c980: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
c990: 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  r(pExpr->pRight,
c9a0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
c9b0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
c9c0: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
c9d0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
c9e0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
c9f0: 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c  void .substExprL
ca00: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
ca10: 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  ist, int iTable,
ca20: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ca30: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
ca40: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
ca50: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
ca60: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
ca70: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74   i++){.    subst
ca80: 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Expr(pList->a[i]
ca90: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
caa0: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  pEList);.  }.}..
cab0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cac0: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
cad0: 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
cae0: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
caf0: 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
cb00: 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
cb10: 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
cb20: 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
cb30: 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
cb40: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
cb50: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
cb60: 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
cb70: 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
cb80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
cb90: 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
cba0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
cbb0: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
cbc0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
cbd0: 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
cbe0: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
cbf0: 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
cc00: 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
cc10: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
cc20: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
cc30: 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
cc40: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
cc50: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
cc60: 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
cc70: 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
cc80: 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
cc90: 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
cca0: 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
ccb0: 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
ccc0: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
ccd0: 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
cce0: 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
ccf0: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
cd00: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
cd10: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
cd20: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
cd30: 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
cd40: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
cd50: 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
cd60: 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
cd70: 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
cd80: 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
cd90: 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
cda0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
cdb0: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
cdc0: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
cdd0: 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
cde0: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
cdf0: 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
ce00: 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
ce10: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
ce20: 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
ce30: 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
ce40: 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
ce50: 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
ce60: 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
ce70: 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
ce80: 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
ce90: 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
cea0: 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
ceb0: 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
cec0: 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
ced0: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
cee0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
cef0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
cf00: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
cf10: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cf20: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
cf30: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
cf40: 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
cf50: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
cf60: 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
cf70: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
cf80: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
cf90: 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
cfa0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
cfb0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
cfc0: 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
cfd0: 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
cfe0: 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
cff0: 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
d000: 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
d010: 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
d020: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
d030: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
d040: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d050: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
d060: 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
d070: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
d080: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
d090: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
d0a0: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
d0b0: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
d0c0: 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
d0d0: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
d0e0: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
d0f0: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
d100: 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
d110: 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
d120: 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
d130: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
d140: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
d150: 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
d160: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
d170: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
d180: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
d190: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
d1a0: 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
d1b0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
d1c0: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
d1d0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
d1e0: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
d1f0: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
d200: 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
d210: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
d220: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
d230: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
d240: 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
d250: 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
d260: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
d270: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
d280: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d290: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
d2a0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d2b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
d2c0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
d2d0: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
d2e0: 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
d2f0: 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
d300: 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
d310: 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
d320: 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
d330: 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
d340: 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
d350: 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
d360: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
d370: 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
d380: 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
d390: 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
d3a0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
d3b0: 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
d3c0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d3d0: 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
d3e0: 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
d3f0: 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
d400: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
d410: 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
d420: 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
d430: 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
d440: 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
d450: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
d460: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
d470: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
d480: 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
d490: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
d4a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
d4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
d4c0: 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
d4d0: 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
d4e0: 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
d4f0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
d500: 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
d510: 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
d520: 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
d530: 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
d540: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
d550: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
d560: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
d570: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
d580: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
d590: 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
d5a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
d5b0: 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
d5c0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
d5d0: 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
d5e0: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
d5f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
d600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
d610: 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
d620: 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
d630: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
d640: 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
d650: 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
d660: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
d670: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
d680: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  tions */.){.  Se
d690: 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
d6a0: 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
d6b0: 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
d6c0: 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  y" */.  SrcList 
d6d0: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
d6e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
d6f0: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
d700: 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
d710: 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
d720: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
d730: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
d740: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d750: 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
d760: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
d770: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
d780: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
d790: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
d7a0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
d7b0: 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
d7c0: 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
d7d0: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
d7e0: 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43  *pWhere;..  /* C
d7f0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
d800: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
d810: 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
d820: 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
d830: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
d840: 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
d850: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
d860: 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
d870: 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
d880: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
d890: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d   = pSrc->a[iFrom
d8a0: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ].pSelect;.  ass
d8b0: 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
d8c0: 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
d8d0: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
d8e0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
d8f0: 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
d900: 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
d910: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53  eturn 0;.  pSubS
d920: 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
d930: 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
d940: 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  rc );.  if( pSub
d950: 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
d960: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d970: 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
d980: 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74   || pSub->nLimit
d990: 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e  >=0) &&  (pSrc->
d9a0: 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
d9b0: 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
d9c0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  0;.  }.  if( (p-
d9d0: 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
d9e0: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20  ->nLimit>=0) && 
d9f0: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
da00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
da10: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
da20: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
da30: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
da40: 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
da50: 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
da60: 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
da70: 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
da80: 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
da90: 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
daa0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
dab0: 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
dac0: 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
dad0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
dae0: 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
daf0: 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
db00: 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
db10: 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
db20: 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
db30: 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
db40: 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
db50: 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
db60: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
db70: 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
db80: 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
db90: 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
dba0: 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   thing..  */.  i
dbb0: 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
dbc0: 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26  >1 && iFrom>0 &&
dbd0: 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d   (pSrc->a[iFrom-
dbe0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
dbf0: 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
dc00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
dc10: 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
dc20: 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
dc30: 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
dc40: 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
dc50: 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
dc60: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
dc70: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
dc80: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
dc90: 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
dca0: 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
dcb0: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
dcc0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
dcd0: 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
dce0: 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
dcf0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
dd00: 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
dd10: 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
dd20: 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
dd30: 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
dd40: 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
dd50: 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
dd60: 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
dd70: 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
dd80: 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
dd90: 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
dda0: 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
ddb0: 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
ddc0: 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
ddd0: 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
dde0: 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
ddf0: 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46  N..  */.  if( iF
de00: 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e  rom>0 && (pSrc->
de10: 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74  a[iFrom-1].joint
de20: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
de30: 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75  =0 .      && pSu
de40: 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a  b->pWhere!=0 ){.
de50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
de60: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
de70: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
de80: 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
de90: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
dea0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
deb0: 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
dec0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
ded0: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
dee0: 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ry..  */..  /* M
def0: 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
df00: 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
df10: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
df20: 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
df30: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
df40: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
df50: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
df60: 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
df70: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
df80: 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
df90: 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
dfa0: 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
dfb0: 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
dfc0: 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
dfd0: 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
dfe0: 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
dff0: 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
e000: 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
e010: 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
e020: 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
e030: 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
e040: 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
e050: 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
e060: 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
e070: 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
e080: 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
e090: 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
e0a0: 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
e0b0: 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 72 63    iParent = pSrc
e0c0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73  ->a[iFrom].iCurs
e0d0: 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  or;.  {.    int 
e0e0: 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
e0f0: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74  c->nSrc;.    int
e100: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 72 63   jointype = pSrc
e110: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
e120: 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ype;..    if( pS
e130: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
e140: 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72  b && pSrc->a[iFr
e150: 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e  om].pTab->isTran
e160: 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  sient ){.      s
e170: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
e180: 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  (0, pSrc->a[iFro
e190: 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  m].pTab);.    }.
e1a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e1b0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44  Src->a[iFrom].zD
e1c0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
e1d0: 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61  liteFree(pSrc->a
e1e0: 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a  [iFrom].zName);.
e1f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e200: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41  Src->a[iFrom].zA
e210: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e  lias);.    if( n
e220: 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
e230: 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53    int extra = nS
e240: 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20  ubSrc - 1;.     
e250: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62   for(i=1; i<nSub
e260: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
e270: 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
e280: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53  SrcListAppend(pS
e290: 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
e2a0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63   }.      p->pSrc
e2b0: 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
e2c0: 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
e2d0: 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
e2e0: 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
e2f0: 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
e300: 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
e310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e320: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
e330: 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
e340: 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
e350: 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
e360: 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
e370: 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
e380: 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
e390: 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
e3a0: 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
e3b0: 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a  rom+nSubSrc-1].j
e3c0: 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
e3d0: 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
e3e0: 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
e3f0: 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
e400: 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
e410: 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
e420: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
e430: 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
e440: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
e450: 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
e460: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
e470: 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
e480: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
e490: 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
e4a0: 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
e4b0: 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
e4e0: 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
e4f0: 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
e500: 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
e510: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
e520: 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
e530: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e540: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
e550: 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
e560: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
e570: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
e580: 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
e590: 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
e5a0: 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
e5b0: 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
e5c0: 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
e5d0: 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
e5e0: 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73  "y+10"..  */.  s
e5f0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
e600: 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
e610: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
e620: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
e630: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
e640: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
e650: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
e660: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
e670: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
e680: 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
e690: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e6a0: 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
e6b0: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
e6c0: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
e6d0: 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e  eStrNDup(pExpr->
e6e0: 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
e6f0: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pan.n);.    }.  
e700: 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
e710: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
e720: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
e730: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
e740: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
e750: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
e760: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
e770: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
e780: 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
e790: 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
e7a0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
e7b0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
e7c0: 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
e7d0: 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
e7e0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
e7f0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
e800: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
e810: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
e820: 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
e830: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
e840: 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
e850: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
e860: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
e870: 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72  rDup(pSub->pWher
e880: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
e890: 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
e8a0: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
e8b0: 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65  sAgg ){.    asse
e8c0: 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  rt( p->pHaving==
e8d0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  0 );.    p->pHav
e8e0: 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ing = p->pWhere;
e8f0: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
e900: 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62   pWhere;.    sub
e910: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
e920: 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
e930: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
e940: 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  f( pSub->pHaving
e950: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
e960: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
e970: 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48  ExprDup(pSub->pH
e980: 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66  aving);.      if
e990: 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
e9a0: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69          p->pHavi
e9b0: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ng = sqliteExpr(
e9c0: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69  TK_AND, p->pHavi
e9d0: 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b  ng, pHaving, 0);
e9e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e9f0: 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67        p->pHaving
ea00: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20   = pHaving;.    
ea10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
ea20: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
ea30: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
ea40: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
ea50: 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
ea60: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
ea70: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
ea80: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
ea90: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
eaa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
eab0: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
eac0: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
ead0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
eae0: 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20  f( pWhere ){.   
eaf0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
eb00: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44  qliteExpr(TK_AND
eb10: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  , p->pWhere, pWh
eb20: 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ere, 0);.    }. 
eb30: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
eb40: 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
eb50: 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
eb60: 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
eb70: 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
eb80: 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
eb90: 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
eba0: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
ebb0: 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
ebc0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
ebd0: 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
ebe0: 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  limit expression
ebf0: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
ec00: 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a  ry to the outer.
ec10: 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f    ** query..  */
ec20: 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69  .  if( pSub->nLi
ec30: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  mit>=0 ){.    if
ec40: 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b  ( p->nLimit<0 ){
ec50: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
ec60: 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b   = pSub->nLimit;
ec70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
ec80: 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66  ->nLimit+p->nOff
ec90: 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d  set > pSub->nLim
eca0: 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  it+pSub->nOffset
ecb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
ecc0: 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d  mit = pSub->nLim
ecd0: 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73  it + pSub->nOffs
ece0: 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et - p->nOffset;
ecf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
ed00: 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d  nOffset += pSub-
ed10: 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20  >nOffset;..  /* 
ed20: 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
ed30: 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
ed40: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
ed50: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
ed60: 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
ed70: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
ed80: 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pSub);.  return
ed90: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
eda0: 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
edb0: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
edc0: 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
edd0: 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
ede0: 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
edf0: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
ee00: 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
ee10: 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
ee20: 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
ee30: 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
ee40: 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
ee50: 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
ee60: 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
ee70: 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
ee80: 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
ee90: 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
eea0: 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
eeb0: 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
eec0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
eed0: 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
eee0: 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
eef0: 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
ef00: 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
ef10: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
ef20: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
ef30: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
ef40: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
ef50: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
ef60: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
ef70: 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
ef80: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
ef90: 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
efa0: 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
efb0: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
efc0: 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
efd0: 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
efe0: 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
eff0: 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
f000: 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
f010: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
f020: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
f030: 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
f040: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
f050: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
f060: 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
f070: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
f080: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
f090: 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
f0a0: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e 0a  sqliteSelect()..
f0b0: 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
f0c0: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
f0d0: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
f0e0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
f0f0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
f100: 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
f110: 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
f120: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
f130: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
f140: 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
f150: 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
f160: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
f170: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
f180: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
f190: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
f1a0: 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
f1b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 65 4c 69 73  .  ExprList eLis
f1c0: 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
f1d0: 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49  List_item eListI
f1e0: 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  tem;..  /* Check
f1f0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
f200: 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
f210: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
f220: 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
f230: 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
f240: 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
f250: 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
f260: 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
f270: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
f280: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
f290: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
f2a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f2b0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f2c0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
f2d0: 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
f2e0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
f2f0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
f300: 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
f310: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
f320: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  if( pExpr->pList
f330: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
f340: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
f350: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f360: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
f370: 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
f380: 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43  if( sqliteStrNIC
f390: 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  mp(pExpr->token.
f3a0: 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b  z,"min",3)==0 ){
f3b0: 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50  .    seekOp = OP
f3c0: 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65  _Rewind;.  }else
f3d0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
f3e0: 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
f3f0: 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29  .z,"max",3)==0 )
f400: 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
f410: 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  P_Last;.  }else{
f420: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f430: 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 45 78   }.  pExpr = pEx
f440: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
f450: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
f460: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
f470: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
f480: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
f490: 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20  olumn;.  pTab = 
f4a0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
f4b0: 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ab;..  /* If we 
f4c0: 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
f4d0: 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
f4e0: 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
f4f0: 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
f500: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
f510: 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
f520: 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
f530: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
f540: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
f550: 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
f560: 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
f570: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
f580: 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
f590: 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
f5a0: 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
f5b0: 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
f5c0: 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
f5d0: 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
f5e0: 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
f5f0: 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
f600: 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
f610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
f620: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
f630: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f640: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f650: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
f660: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
f670: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
f680: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
f690: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
f6a0: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
f6b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
f6c0: 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
f6d0: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
f6e0: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
f6f0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  the callback.  T
f700: 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
f710: 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
f720: 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
f730: 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20  to a table or a 
f740: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a  memory cell..  *
f750: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * The column nam
f760: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
f770: 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69  been generated i
f780: 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  n the calling fu
f790: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76  nction..  */.  v
f7a0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
f7b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f7c0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
f7d0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
f7e0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
f7f0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
f800: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Types(pParse, p-
f810: 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74  >pSrc, p->pEList
f820: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
f830: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
f840: 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
f850: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
f860: 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
f870: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
f880: 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29  =SRT_TempTable )
f890: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
f8a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
f8b0: 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b  Temp, iParm, 0);
f8c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
f8d0: 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
f8e0: 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
f8f0: 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
f900: 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
f910: 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
f920: 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
f930: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
f940: 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
f950: 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
f960: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
f970: 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
f980: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
f990: 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
f9a0: 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
f9b0: 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
f9c0: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  table..  */.  sq
f9d0: 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79 53 63  liteCodeVerifySc
f9e0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61  hema(pParse, pTa
f9f0: 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20  b->iDb);.  base 
fa00: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
fa10: 69 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75  iCursor;.  compu
fa20: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
fa30: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 73  (pParse, p);.  s
fa40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fa50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
fa60: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73  ab->iDb, 0);.  s
fa70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fa80: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62  , OP_OpenRead, b
fa90: 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  ase, pTab->tnum)
faa0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
fab0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
fac0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
fad0: 41 54 49 43 29 3b 0a 20 20 63 6f 6e 74 20 3d 20  ATIC);.  cont = 
fae0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
faf0: 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49  bel(v);.  if( pI
fb00: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
fb10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fb20: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
fb30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
fb40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fb50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
fb60: 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  dx->iDb, 0);.   
fb70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
fb80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
fb90: 20 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74   base+1, pIdx->t
fba0: 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  num);.    sqlite
fbb0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
fbc0: 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  -1, pIdx->zName,
fbd0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
fbe0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
fbf0: 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
fc00: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
fc10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fc20: 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65  P_IdxRecno, base
fc30: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
fc40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fc50: 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c  P_Close, base+1,
fc60: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
fc70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
fc80: 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b  oveTo, base, 0);
fc90: 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78  .  }.  eList.nEx
fca0: 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74  pr = 1;.  memset
fcb0: 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20  (&eListItem, 0, 
fcc0: 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d  sizeof(eListItem
fcd0: 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20  ));.  eList.a = 
fce0: 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c  &eListItem;.  eL
fcf0: 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  ist.a[0].pExpr =
fd00: 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74   pExpr;.  select
fd10: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
fd20: 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20  , p, &eList, 0, 
fd30: 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c  0, 0, -1, eDest,
fd40: 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f   iParm, cont, co
fd50: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
fd60: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
fd70: 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
fd80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fd90: 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
fda0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
fdb0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
fdc0: 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
fdd0: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
fde0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
fdf0: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
fe00: 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
fe10: 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
fe20: 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
fe30: 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
fe40: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
fe50: 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
fe60: 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
fe70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
fe80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
feb0: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
fec0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
fed0: 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
fee0: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
fef0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
ff00: 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
ff10: 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
ff20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
ff30: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
ff40: 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
ff50: 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
ff60: 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69  ys of a table wi
ff70: 74 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a  th cursor iParm.
ff80: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
ff90: 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
ffa0: 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
ffb0: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
ffc0: 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
ffd0: 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
ffe0: 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
fff0: 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
10000 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
10010 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
10020 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
10030 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
10040 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
10050 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
10060 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
10070 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
10080 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
10090 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
100a0 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
100b0 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
100c0 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
100d0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
100e0 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
100f0 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
10100 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
10110 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
10120 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
10130 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
10140 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
10150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
10160 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
10170 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
10180 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
10190 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
101a0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
101b0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
101c0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
101d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
101e0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
101f0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
10200 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
10210 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
10220 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
10230 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
10240 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
10250 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
10260 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
10270 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
10280 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
10290 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
102a0 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
102b0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
102c0 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
102d0 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
102e0 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
102f0 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
10300 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
10310 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
10320 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
10330 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
10340 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
10350 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
10360 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
10370 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
10380 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
10390 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
103a0 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
103b0 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
103c0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
103d0 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
103e0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
103f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
10400 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
10410 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
10420 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
10430 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
10440 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
10450 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
10460 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
10470 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
104b0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
104c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
104d0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
104e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
104f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10500 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
10510 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
10520 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
10530 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
10540 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
10550 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
10560 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
10570 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
10580 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
10590 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
105a0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
105b0 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
105c0 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
105d0 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
105e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
105f0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
10600 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
10610 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
10620 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
10630 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
10640 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
10650 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
10660 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
10670 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
10680 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
10690 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20   sqliteSelect(. 
106a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
106b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
106c0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
106d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
106e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
106f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10700 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
10710 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
10720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
10730 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
10740 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
10750 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
10760 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
10770 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
10780 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
10790 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
107a0 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
107b0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
107c0 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
107d0 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
107e0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
107f0 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
10800 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
10810 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
10820 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
10830 74 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20  t *pParentAgg   
10840 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10850 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
10860 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
10870 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
10880 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
10890 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  nfo;.  Vdbe *v;.
108a0 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b    int isAgg = 0;
108b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
108c0 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
108d0 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
108e0 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
108f0 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
10900 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
10910 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
10920 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
10930 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
10940 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
10950 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
10960 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
10970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
10980 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
10990 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
109a0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
109b0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
109c0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
109d0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
109e0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
109f0 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
10a00 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
10a10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
10a20 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
10a30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
10a40 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
10a50 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
10a60 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20  t isDistinct;   
10a70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10a80 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
10a90 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
10aa0 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
10ab0 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
10ac0 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
10ad0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
10ae0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
10af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10b00 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
10b10 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
10b20 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c  on */..  if( sql
10b30 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
10b40 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
10b50 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75  r || p==0 ) retu
10b60 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
10b70 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
10b80 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
10b90 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
10ba0 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  turn 1;..  /* If
10bb0 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
10bc0 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
10bd0 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
10be0 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
10bf0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
10c00 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
10c10 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
10c20 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
10c30 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   iParm);.  }..  
10c40 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
10c50 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
10c60 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
10c70 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
10c80 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
10c90 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
10ca0 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72  pWhere;.  pOrder
10cb0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
10cc0 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
10cd0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
10ce0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
10cf0 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  ng;.  isDistinct
10d00 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
10d10 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
10d20 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f   VDBE cursors fo
10d30 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20  r each table in 
10d40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
10d50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 53 72 63    */.  sqliteSrc
10d60 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
10d70 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10d80 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  st);..  /* .  **
10d90 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
10da0 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
10db0 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
10dc0 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
10dd0 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
10de0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
10df0 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
10e00 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10e10 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
10e20 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70  t_end;..  /* Exp
10e30 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d  and any "*" term
10e40 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
10e50 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70  set.  (For examp
10e60 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20  le the "*" in.  
10e70 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ** "SELECT * FRO
10e80 4d 20 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c  M t1")  The fill
10e90 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72  InColumnlist() r
10ea0 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
10eb0 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72   some.  ** other
10ec0 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20   housekeeping - 
10ed0 73 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  see the header c
10ee0 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69  omment for detai
10ef0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66  ls..  */.  if( f
10f00 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
10f10 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
10f20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
10f30 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20  d;.  }.  pWhere 
10f40 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
10f50 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
10f60 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
10f70 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
10f80 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
10f90 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
10fa0 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
10fb0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
10fc0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
10fd0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
10fe0 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  */.  if( (eDest=
10ff0 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
11000 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
11010 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
11020 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
11030 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
11040 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
11050 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
11060 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
11070 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
11080 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
11090 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
110a0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
110b0 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67  * ORDER BY is ig
110c0 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64  nored for some d
110d0 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a  estinations..  *
110e0 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  /.  switch( eDes
110f0 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
11100 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73  T_Union:.    cas
11110 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20  e SRT_Except:.  
11120 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61    case SRT_Disca
11130 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72  rd:.      pOrder
11140 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  By = 0;.      br
11150 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
11160 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
11170 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
11180 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c   point, we shoul
11190 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  d have allocated
111a0 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73   all the cursors
111b0 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65   that we.  ** ne
111c0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62  ed to handle sub
111d0 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f  querys and tempo
111e0 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20  rary tables.  . 
111f0 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65   **.  ** Resolve
11200 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
11210 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e  s and do a seman
11220 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c  tics check on al
11230 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  l the expression
11240 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
11250 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
11260 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
11270 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
11280 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11290 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69  TabList, 0, pELi
112a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
112b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
112c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
112d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
112e0 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
112f0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11300 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  pr, 1, &isAgg) )
11310 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11320 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11330 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20   }.  if( pWhere 
11340 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
11350 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
11360 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11370 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65  , pEList, pWhere
11380 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11390 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
113a0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
113b0 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
113c0 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20  , pWhere, 0, 0) 
113d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
113e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
113f0 20 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e    }.  if( pHavin
11400 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72  g ){.    if( pGr
11410 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
11420 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
11430 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
11440 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
11450 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
11460 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67  AVING");.      g
11470 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11480 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
11490 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
114a0 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
114b0 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61  ist, pEList, pHa
114c0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
114d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
114e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
114f0 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
11500 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31  arse, pHaving, 1
11510 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20  , &isAgg) ){.   
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 7d 0a 20 20  nd;.    }.  }.  
11540 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
11550 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11560 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
11570 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
11580 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72  iCol;.      Expr
11590 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
115a0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
115b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
115c0 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
115d0 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20  iCol) && iCol>0 
115e0 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d  && iCol<=pEList-
115f0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
11600 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
11610 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
11620 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
11630 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
11640 74 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  teExprDup(pEList
11650 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70  ->a[iCol-1].pExp
11660 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11670 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11680 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
11690 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
116a0 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
116b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
116c0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
116d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
116e0 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
116f0 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
11700 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11710 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
11720 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11730 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  eExprIsConstant(
11740 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pE) ){.        i
11750 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  f( sqliteExprIsI
11760 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
11770 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11780 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
11790 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
117a0 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
117b0 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
117c0 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
117d0 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20  nstants");.     
117e0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
117f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  _end;.        }e
11800 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20  lse if( iCol<=0 
11810 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
11820 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
11830 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
11840 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
11850 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
11860 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
11870 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
11880 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
11890 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77             "betw
118a0 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69  een 1 and %d", i
118b0 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
118c0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  pr);.          g
118d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
118e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
118f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
11900 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
11910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
11920 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
11930 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
11940 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ol;.      Expr *
11950 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61  pE = pGroupBy->a
11960 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
11970 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
11980 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
11990 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26  ol) && iCol>0 &&
119a0 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
119b0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
119c0 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
119d0 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
119e0 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
119f0 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
11a00 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
11a10 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
11a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11a30 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
11a40 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
11a50 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11a60 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
11a70 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11a80 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
11a90 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
11aa0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
11ab0 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
11ac0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11ad0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
11ae0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11af0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
11b00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
11b10 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
11b20 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
11b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11b40 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
11b50 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
11b60 20 20 20 22 47 52 4f 55 50 20 42 59 20 74 65 72     "GROUP BY ter
11b70 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ms must not be n
11b80 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  on-integer const
11b90 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ants");.        
11ba0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11bb0 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
11bc0 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
11bd0 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
11be0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
11bf0 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
11c00 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
11c10 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f      "GROUP BY co
11c20 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
11c30 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
11c40 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
11c50 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
11c60 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c  1 and %d", iCol,
11c70 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
11c80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11c90 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11cb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
11cc0 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
11cd0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
11ce0 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
11cf0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
11d00 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
11d10 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end;..  /* Ident
11d20 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
11d30 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
11d40 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63  sing them in a c
11d50 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
11d60 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
11d70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
11d80 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f  t is going to so
11d90 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61  me other destina
11da0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
11db0 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
11dc0 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
11dd0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
11de0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11df0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
11e00 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74    /* Check for t
11e10 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
11e20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  of a min() or ma
11e30 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20  x() function by 
11e40 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74  itself.  ** in t
11e50 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
11e60 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65   */.  if( simple
11e70 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72  MinMaxQuery(pPar
11e80 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
11e90 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  arm) ){.    rc =
11ea0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   0;.    goto sel
11eb0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
11ec0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11ed0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
11ee0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
11ef0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66   clause.  */.  f
11f00 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
11f10 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
11f20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11f30 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
11f40 74 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  t;.    int needR
11f50 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a  estoreContext;..
11f60 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
11f70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[i].pSelect==
11f80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
11f90 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
11fa0 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b  a[i].zName!=0 ){
11fb0 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75 74  .      zSavedAut
11fc0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
11fd0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
11fe0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
11ff0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54  AuthContext = pT
12000 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
12010 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
12020 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
12030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12040 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
12050 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
12060 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
12070 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  t(pParse, pTabLi
12080 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
12090 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c  , SRT_TempTable,
120a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
120b0 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
120c0 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c  ].iCursor, p, i,
120d0 20 26 69 73 41 67 67 29 3b 0a 20 20 20 20 69 66   &isAgg);.    if
120e0 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
120f0 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
12100 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
12110 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
12120 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
12130 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
12140 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
12150 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
12160 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54    if( eDest!=SRT
12170 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21  _Union && eDest!
12180 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65  =SRT_Except && e
12190 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72  Dest!=SRT_Discar
121a0 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  d ){.      pOrde
121b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
121c0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
121d0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
121e0 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
121f0 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
12200 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
12210 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
12220 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
12230 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
12240 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74   a subquery that
12250 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e   can be "flatten
12260 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72  ed" into its par
12270 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61  ent..  ** If fla
12280 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73  ttening is a pos
12290 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61  siblity, do so a
122a0 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
122b0 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20  ately.  .  */.  
122c0 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
122d0 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
122e0 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
122f0 72 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65  ry(pParse, pPare
12300 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a  nt, parentTab, *
12310 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67  pParentAgg, isAg
12320 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  g) ){.    if( is
12330 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67  Agg ) *pParentAg
12340 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  g = 1;.    retur
12350 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
12360 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
12370 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
12380 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
12390 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
123a0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
123b0 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
123c0 20 62 65 20 75 73 69 6e 67 20 61 20 63 61 6c 6c   be using a call
123d0 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
123e0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
123f0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
12400 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 64 65 73  s going to a des
12410 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 0a 20  tination other. 
12420 20 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c 6c 62   ** than a callb
12430 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ack..  **.  ** W
12440 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
12450 73 20 73 65 70 61 72 61 74 65 6c 79 20 66 72 6f  s separately fro
12460 6d 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  m the creation o
12470 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  f column names. 
12480 20 2a 2a 20 61 62 6f 76 65 20 62 65 63 61 75 73   ** above becaus
12490 65 20 69 66 20 74 68 65 20 70 54 61 62 4c 69 73  e if the pTabLis
124a0 74 20 63 6f 6e 74 61 69 6e 73 20 76 69 65 77 73  t contains views
124b0 20 74 68 65 6e 20 74 68 65 79 20 77 69 6c 6c 20   then they will 
124c0 6e 6f 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  not.  ** have be
124d0 65 6e 20 72 65 73 6f 6c 76 65 64 20 61 6e 64 20  en resolved and 
124e0 77 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  we will not know
124f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
12500 73 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e 6f 77  s until.  ** now
12510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
12520 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
12530 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
12540 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
12550 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
12560 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
12570 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
12580 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
12590 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
125a0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
125b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
125c0 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
125d0 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
125e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
125f0 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c  OpenTemp, iParm,
12600 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44   0);.  }..  /* D
12610 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
12620 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65   aggregate expre
12630 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73  ssions..  */.  s
12640 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
12650 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
12660 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20  .  if( isAgg || 
12670 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
12680 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12690 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  nAgg==0 );.    i
126a0 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  sAgg = 1;.    fo
126b0 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
126c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
126d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
126e0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
126f0 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69  tes(pParse, pELi
12700 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
12710 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12720 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12730 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12740 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
12750 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12760 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
12770 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
12780 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  ( sqliteExprAnal
12790 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
127a0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
127b0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
127c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
127d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
127e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
127f0 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
12800 67 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 41  g && sqliteExprA
12810 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
12820 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
12830 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
12840 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12850 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
12860 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
12870 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
12880 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
12890 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
128a0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
128b0 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f  gates(pParse, pO
128c0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
128d0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
128e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
128f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12910 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61 67   /* Reset the ag
12920 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20  gregator.  */.  
12930 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
12940 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12950 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c  (v, OP_AggReset,
12960 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67   0, pParse->nAgg
12970 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
12980 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
12990 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63  i++){.      Func
129a0 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  Def *pFunc;.    
129b0 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70    if( (pFunc = p
129c0 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
129d0 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e  Func)!=0 && pFun
129e0 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  c->xFinalize!=0 
129f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12a00 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12a10 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 29 3b  _AggInit, 0, i);
12a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12a30 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
12a40 31 2c 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c  1, (char*)pFunc,
12a50 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
12a60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12a70 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
12a80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
12a90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
12aa0 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
12ab0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12ac0 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63  dOp(v, OP_AggFoc
12ad0 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  us, 0, 0);.    }
12ae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
12af0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
12b00 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20   cell to NULL.  
12b10 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
12b20 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73  SRT_Mem ){.    s
12b30 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12b40 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
12b50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
12b60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
12b70 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
12b80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
12b90 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
12ba0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
12bb0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
12bc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
12bd0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69  stinct ){.    di
12be0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
12bf0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
12c00 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12c10 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73  OP_OpenTemp, dis
12c20 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c  tinct, 1);.  }el
12c30 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
12c40 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
12c50 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
12c60 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20  ase scan.  */.  
12c70 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57  pWInfo = sqliteW
12c80 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
12c90 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
12ca0 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  re, 0, .        
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30      pGroupBy ? 0
12cd0 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20   : &pOrderBy);. 
12ce0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
12cf0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12d00 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20  ;..  /* Use the 
12d10 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
12d20 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f  oop if we are no
12d30 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20  t dealing with. 
12d40 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20   ** aggregates. 
12d50 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
12d60 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65   ){.    if( sele
12d70 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12d80 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
12d90 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
12da0 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a  istinct, eDest,.
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66      iParm, pWInf
12dd0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
12de0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b  Info->iBreak) ){
12df0 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
12e00 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
12e10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
12e20 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
12e30 61 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e  aggregates, then
12e40 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   do the special 
12e50 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70  aggregate.  ** p
12e60 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a  rocessing.  .  *
12e70 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 66  /.  else{.    if
12e80 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
12e90 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20      int lbl1;.  
12ea0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12eb0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
12ec0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
12ed0 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
12ee0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
12ef0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
12f00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
12f10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12f20 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42  MakeKey, pGroupB
12f30 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
12f40 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
12f50 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
12f60 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65  =4 ) sqliteAddKe
12f70 79 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42  yType(v, pGroupB
12f80 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  y);.      lbl1 =
12f90 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
12fa0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
12fb0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12fc0 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30  , OP_AggFocus, 0
12fd0 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66  , lbl1);.      f
12fe0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
12ff0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
13000 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
13010 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
13020 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13030 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
13040 64 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  de(pParse, pPars
13050 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
13060 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13070 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
13080 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a  _AggSet, 0, i);.
13090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
130a0 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
130b0 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20  abel(v, lbl1);. 
130c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
130d0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
130e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
130f0 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e  pr *pE;.      in
13100 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21  t j;.      if( !
13110 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
13120 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
13130 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61  ;.      pE = pPa
13140 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
13150 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
13160 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
13170 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
13180 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74     if( pE->pList
13190 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
131a0 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74  j=0; j<pE->pList
131b0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
131c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
131d0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
131e0 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  pE->pList->a[j].
131f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
13200 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13210 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13220 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
13230 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
13240 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
13250 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45  P_AggFunc, 0, pE
13260 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c  ->pList ? pE->pL
13270 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
13280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13290 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
132a0 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  Func!=0 );.     
132b0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
132c0 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e  >aAgg[i].pFunc->
132d0 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20  xStep!=0 );.    
132e0 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
132f0 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
13300 72 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  r*)pParse->aAgg[
13310 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49  i].pFunc, P3_POI
13320 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NTER);.    }.  }
13330 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
13340 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
13350 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
13360 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
13370 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
13380 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  e processing agg
13390 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64  regates, we need
133a0 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63   to set up a sec
133b0 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76  ond loop.  ** ov
133c0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67  er all of the ag
133d0 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61  gregate values a
133e0 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e  nd process them.
133f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
13400 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  g ){.    int end
13410 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
13420 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
13430 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a    int startagg;.
13440 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73      startagg = s
13450 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
13460 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
13470 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
13480 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
13490 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
134a0 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
134b0 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
134c0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
134d0 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20  artagg, 1);.    
134e0 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  }.    if( select
134f0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
13500 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
13510 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
13520 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20  tinct, eDest,.  
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67    iParm, startag
13550 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20  g, endagg) ){.  
13560 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
13570 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
13580 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
13590 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
135a0 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
135b0 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
135c0 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a  bel(v, endagg);.
135d0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
135e0 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
135f0 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
13600 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20  e->useAgg = 0;. 
13610 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
13620 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
13630 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
13640 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
13650 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
13660 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
13670 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
13680 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
13690 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
136a0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
136b0 54 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73  Tail(p, v, pELis
136c0 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
136d0 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20   iParm);.  }... 
136e0 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c   /* Issue a null
136f0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61   callback if tha
13700 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73  t is what the us
13710 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20  er wants..  */. 
13720 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
13730 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
13740 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
13750 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61  v, OP_NullCallba
13760 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ck, pEList->nExp
13770 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r, 0);.  }..  /*
13780 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73   If this was a s
13790 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65  ubquery, we have
137a0 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74   now converted t
137b0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
137c0 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
137d0 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c  y table.  So del
137e0 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ete the subquery
137f0 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
13800 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
13810 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  to prevent this 
13820 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65  subquery from be
13830 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67  ing evaluated ag
13840 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65  ain and to force
13850 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73   the.  ** the us
13860 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  e of the tempora
13870 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ry table..  */. 
13880 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
13890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
138a0 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ent->pSrc->nSrc>
138b0 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20  parentTab );.   
138c0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
138d0 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
138e0 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20  Tab].pSelect==p 
138f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  );.    sqliteSel
13900 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  ectDelete(p);.  
13910 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
13920 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
13930 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  elect = 0;.  }..
13940 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
13950 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
13960 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
13970 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
13980 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
13990 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
139a0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
139b0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
139c0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
139d0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
139e0 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
139f0 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
13a00 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
13a10 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
13a20 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c  elect_end:.  sql
13a30 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
13a40 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20  Reset(pParse);. 
13a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.