/ Hex Artifact Content
Login

Artifact 2712bd4d311ebe7dbf8fd7596a809042657db85f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 34 37  select.c,v 1.147
0200: 20 32 30 30 34 2f 30 31 2f 31 34 20 31 33 3a 33   2004/01/14 13:3
0210: 38 3a 35 34 20 64 72 68 20 45 78 70 20 24 0a 2a  8:54 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 70 4e 65 77 2d 3e 70 45  se{.    pNew->pE
05e0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
05f0: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
0600: 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pSrc;.    pNew->
0610: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0620: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
0630: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
0640: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
0650: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
0660: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
0670: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
0680: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
0690: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20   = isDistinct;. 
06a0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b     pNew->op = TK
06b0: 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65  _SELECT;.    pNe
06c0: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  w->nLimit = nLim
06d0: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  it;.    pNew->nO
06e0: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
06f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  .    pNew->iLimi
0700: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77  t = -1;.    pNew
0710: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
0720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0730: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  w;.}../*.** Give
0740: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
0750: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
0760: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0770: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0780: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0790: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
07a0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
07b0: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
07c0: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
07d0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
07e0: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
07f0: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0800: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  R.**     JT_OUTE
0810: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0820: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0830: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0840: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0850: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0860: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0870: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0880: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0890: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
08a0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
08b0: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
08c0: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
08d0: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
08e0: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
08f0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0900: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0910: 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 50  sqliteJoinType(P
0920: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0930: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0940: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0950: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0960: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0970: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0980: 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  p;.  static stru
0990: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
09a0: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
09b0: 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20     int nChar;.  
09c0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d 20    int code;.  } 
09d0: 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20  keywords[] = {. 
09e0: 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20     { "natural", 
09f0: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c  7, JT_NATURAL },
0a00: 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20  .    { "left",  
0a10: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
0a20: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0a30: 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f  right",   5, JT_
0a40: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0a50: 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20  ,.    { "full", 
0a60: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0a70: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0a80: 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22  },.    { "outer"
0a90: 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  ,   5, JT_OUTER 
0aa0: 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22  },.    { "inner"
0ab0: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0ac0: 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22  },.    { "cross"
0ad0: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0ae0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0af0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0b00: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0b10: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0b20: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0b30: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0b40: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0b50: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0b60: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0b70: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0b80: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0b90: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0ba0: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0bb0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0bc0: 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e     && sqliteStrN
0bd0: 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f  ICmp(p->z, keywo
0be0: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
0bf0: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
0c00: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0c10: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
0c20: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
0c30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0c40: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
0c50: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0c60: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
0c70: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
0c80: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
0c90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0ca0: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
0cb0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
0cc0: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
0cd0: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
0ce0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
0cf0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
0d00: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
0d10: 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64 75   static Token du
0d20: 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  mmy = { 0, 0 };.
0d30: 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20 3d      char *zSp1 =
0d40: 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22 20   " ", *zSp2 = " 
0d50: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0d60: 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79 3b   ){ pB = &dummy;
0d70: 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20 20   zSp1 = 0; }.   
0d80: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70 43   if( pC==0 ){ pC
0d90: 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32 20   = &dummy; zSp2 
0da0: 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  = 0; }.    sqlit
0db0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
0dc0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
0dd0: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0de0: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0df0: 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70 41   ", 0,.       pA
0e00: 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70 31  ->z, pA->n, zSp1
0e10: 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e  , 1, pB->z, pB->
0e20: 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d 3e  n, zSp2, 1, pC->
0e30: 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20  z, pC->n, 0);.  
0e40: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0e50: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0e60: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
0e70: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
0e80: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
0e90: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
0ea0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0eb0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0ec0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0ed0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0ee0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
0ef0: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
0f00: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
0f10: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
0f20: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
0f30: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
0f40: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
0f50: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
0f60: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
0f70: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
0f80: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
0f90: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
0fa0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
0fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
0fc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0fd0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
0fe0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
0ff0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1000: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1010: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1020: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1030: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1040: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
1050: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
1060: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
1070: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
1080: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
1090: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
10a0: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
10b0: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
10c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10d0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
10e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
10f0: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  l,        /* Nam
1100: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1110: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1120: 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a   *pTab1,      /*
1130: 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a   First table */.
1140: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
1150: 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65  Tab2,      /* Se
1160: 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  cond table */.  
1170: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
1180: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1190: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
11a0: 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  m to this expres
11b0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  sion */.){.  Tok
11c0: 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70 72  en dummy;.  Expr
11d0: 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a   *pE1a, *pE1b, *
11e0: 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE1c;.  Expr *pE
11f0: 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63  2a, *pE2b, *pE2c
1200: 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20  ;.  Expr *pE;.. 
1210: 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c 3b   dummy.z = zCol;
1220: 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72  .  dummy.n = str
1230: 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75 6d  len(zCol);.  dum
1240: 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 45  my.dyn = 0;.  pE
1250: 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  1a = sqliteExpr(
1260: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
1270: 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20 73  mmy);.  pE2a = s
1280: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c  qliteExpr(TK_ID,
1290: 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a   0, 0, &dummy);.
12a0: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62    dummy.z = pTab
12b0: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d  1->zName;.  dumm
12c0: 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d  y.n = strlen(dum
12d0: 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d 20  my.z);.  pE1b = 
12e0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
12f0: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1300: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1310: 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b2->zName;.  dum
1320: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
1330: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20 3d  mmy.z);.  pE2b =
1340: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
1350: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1360: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
1370: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  eExpr(TK_DOT, pE
1380: 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20  1b, pE1a, 0);.  
1390: 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78 70  pE2c = sqliteExp
13a0: 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  r(TK_DOT, pE2b, 
13b0: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
13c0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 45   sqliteExpr(TK_E
13d0: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
13e0: 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  );.  ExprSetProp
13f0: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
1400: 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20 2a 70 70  Join);.  if( *pp
1410: 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70 45  Expr ){.    *ppE
1420: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
1430: 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70 72  (TK_AND, *ppExpr
1440: 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , pE, 0);.  }els
1450: 65 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  e{.    *ppExpr =
1460: 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   pE;.  }.}../*.*
1470: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
1480: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
1490: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
14a0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
14b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
14c0: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
14d0: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
14e0: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
14f0: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
1500: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
1510: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
1520: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
1530: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
1540: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
1550: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
1560: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
1570: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
1580: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
1590: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
15a0: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
15b0: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
15c0: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
15d0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
15e0: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
15f0: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
1600: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
1610: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
1620: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
1630: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1640: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
1650: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
1660: 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c  Expr *p){.  whil
1670: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
1680: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
1690: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
16a0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
16b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20  pLeft);.    p = 
16c0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
16d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16e0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
16f0: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1700: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1710: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1720: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1730: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
1740: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
1750: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
1760: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
1770: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
1780: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
1790: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
17a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17b0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
17c0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
17d0: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
17e0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
17f0: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72  eProcessJoin(Par
1800: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1810: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
1820: 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69  t *pSrc;.  int i
1830: 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  , j;.  pSrc = p-
1840: 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
1850: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
1860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1870: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1880: 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e  *pTerm = &pSrc->
1890: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
18a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
18b0: 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61  Other = &pSrc->a
18c0: 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [i+1];..    if( 
18d0: 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c  pTerm->pTab==0 |
18e0: 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d  | pOther->pTab==
18f0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1900: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1910: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1920: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
1930: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1940: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
1950: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
1960: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
1970: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
1980: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65    */.    if( pTe
1990: 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rm->jointype & J
19a0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
19b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
19c0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
19d0: 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70  >pOn || pTerm->p
19e0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
19f0: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
1a00: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
1a10: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
1a20: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
1a30: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
1a40: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
1a50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a70: 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61  Tab = pTerm->pTa
1a80: 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  b;.      for(j=0
1a90: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1aa0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1ab0: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f  ( columnIndex(pO
1ac0: 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62  ther->pTab, pTab
1ad0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
1ae0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1af0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54   addWhereTerm(pT
1b00: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1b10: 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d  e, pTab, pOther-
1b20: 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72  >pTab, &p->pWher
1b30: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1b40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b50: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
1b60: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
1b70: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
1b80: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
1b90: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f     if( pTerm->pO
1ba0: 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69  n && pTerm->pUsi
1bb0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1bc0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
1bd0: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
1be0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1bf0: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
1c00: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
1c10: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
1c20: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
1c30: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
1c40: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
1c50: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
1c60: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
1c70: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64  ed by.    ** and
1c80: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
1c90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1ca0: 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  erm->pOn ){.    
1cb0: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 54    setJoinExpr(pT
1cc0: 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20  erm->pOn);.     
1cd0: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
1ce0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1cf0: 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e  pWhere = pTerm->
1d00: 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pOn;.      }else
1d10: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1d20: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
1d30: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65  (TK_AND, p->pWhe
1d40: 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c 20  re, pTerm->pOn, 
1d50: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1d60: 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20 30    pTerm->pOn = 0
1d70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d80: 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72  Create extra ter
1d90: 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20  ms on the WHERE 
1da0: 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20  clause for each 
1db0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20  column named.   
1dc0: 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47   ** in the USING
1dd0: 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c   clause.  Exampl
1de0: 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61  e: If the two ta
1df0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1e00: 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20  d are .    ** A 
1e10: 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53  and B and the US
1e20: 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73  ING clause names
1e30: 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68   X, Y, and Z, th
1e40: 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20  en add this.    
1e50: 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ** to the WHERE 
1e60: 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42  clause:    A.X=B
1e70: 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41  .X AND A.Y=B.Y A
1e80: 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a  ND A.Z=B.Z.    *
1e90: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
1ea0: 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  r if any column 
1eb0: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
1ec0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73   USING clause is
1ed0: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74  .    ** not cont
1ee0: 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61  ained in both ta
1ef0: 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65  bles to be joine
1f00: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1f10: 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67 20  ( pTerm->pUsing 
1f20: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
1f30: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  *pList;.      in
1f40: 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1f50: 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  t( i<pSrc->nSrc-
1f60: 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  1 );.      pList
1f70: 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67   = pTerm->pUsing
1f80: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1f90: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
1fa0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1fb0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 65   columnIndex(pTe
1fc0: 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d  rm->pTab, pList-
1fd0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 7c  >a[j].zName)<0 |
1fe0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  |.            co
1ff0: 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65 72  lumnIndex(pOther
2000: 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61  ->pTab, pList->a
2010: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  [j].zName)<0 ){.
2020: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2030: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2040: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
2050: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
2060: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
2070: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
2080: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
2090: 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ", pList->a[j].z
20a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
20b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
20c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
20d0: 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74 2d  WhereTerm(pList-
20e0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 65  >a[j].zName, pTe
20f0: 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65 72  rm->pTab, pOther
2100: 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ->pTab, &p->pWhe
2110: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2120: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2130: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
2140: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
2150: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
2160: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2170: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
2180: 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74  oid sqliteSelect
2190: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
21a0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
21b0: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
21c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
21d0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
21e0: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
21f0: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c  (p->pSrc);.  sql
2200: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
2210: 3e 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  >pWhere);.  sqli
2220: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
2230: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
2240: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
2250: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
2260: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
2270: 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42  elete(p->pOrderB
2280: 79 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  y);.  sqliteSele
2290: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
22a0: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  or);.  sqliteFre
22b0: 65 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20  e(p->zSelect);. 
22c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
22e0: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e  the aggregate in
22f0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2300: 68 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75  he parse structu
2310: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
2320: 69 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  id sqliteAggrega
2330: 74 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73  teInfoReset(Pars
2340: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
2350: 6c 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d  liteFree(pParse-
2360: 3e 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65  >aAgg);.  pParse
2370: 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
2380: 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
2390: 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
23a0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
23b0: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
23c0: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
23d0: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
23e0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
23f0: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
2400: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
2410: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
2420: 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70  oSorter(Parse *p
2430: 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20  Parse, Vdbe *v, 
2440: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2450: 42 79 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f  By){.  char *zSo
2460: 72 74 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69  rtOrder;.  int i
2470: 3b 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d  ;.  zSortOrder =
2480: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
2490: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
24a0: 20 31 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72   1 );.  if( zSor
24b0: 74 4f 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75  tOrder==0 ) retu
24c0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
24d0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
24e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
24f0: 6f 72 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79  order = pOrderBy
2500: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2510: 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a  ;.    int type;.
2520: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
2530: 66 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49  f( (order & SQLI
2540: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d  TE_SO_TYPEMASK)=
2550: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
2560: 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  ){.      type = 
2570: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
2580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f      }else if( (o
2590: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
25a0: 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49  _TYPEMASK)==SQLI
25b0: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
25c0: 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45     type = SQLITE
25d0: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c  _SO_NUM;.    }el
25e0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  se if( pParse->d
25f0: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
2600: 34 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20  4 ){.      type 
2610: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
2620: 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
2630: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pExpr);.    }els
2640: 65 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  e{.      type = 
2650: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
2660: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72     }.    if( (or
2670: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
2680: 44 49 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  DIRMASK)==SQLITE
2690: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  _SO_ASC ){.     
26a0: 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54   c = type==SQLIT
26b0: 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20  E_SO_TEXT ? 'A' 
26c0: 3a 20 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65  : '+';.    }else
26d0: 7b 0a 20 20 20 20 20 20 63 20 3d 20 74 79 70 65  {.      c = type
26e0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  ==SQLITE_SO_TEXT
26f0: 20 3f 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20   ? 'D' : '-';.  
2700: 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64    }.    zSortOrd
2710: 65 72 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73  er[i] = c;.    s
2720: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
2730: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
2740: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[i].pExpr);.  }
2750: 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f  .  zSortOrder[pO
2760: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d  rderBy->nExpr] =
2770: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
2780: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
2790: 4d 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42  MakeKey, pOrderB
27a0: 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
27b0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
27c0: 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f  P3(v, -1, zSortO
27d0: 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f  rder, strlen(zSo
27e0: 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c  rtOrder));.  sql
27f0: 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64  iteFree(zSortOrd
2800: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  er);.  sqliteVdb
2810: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2820: 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  tPut, 0, 0);.}..
2830: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2840: 6e 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67  ne adds a P3 arg
2850: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73  ument to the las
2860: 74 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68  t VDBE opcode th
2870: 61 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74  at was.** insert
2880: 65 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d  ed. The P3 argum
2890: 65 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73  ent added is a s
28a0: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
28b0: 6f 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61  or the .** OP_Ma
28c0: 6b 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65  keKey or OP_Make
28d0: 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20  IdxKey opcodes. 
28e0: 20 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73   The string cons
28f0: 69 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61  ists of.** chara
2900: 63 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27  cters 't' or 'n'
2910: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
2920: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2930: 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c   various.** fiel
2940: 64 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f  ds of the key to
2950: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68   be generated sh
2960: 6f 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20  ould be treated 
2970: 61 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72  as numeric.** or
2980: 20 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74   as text.  See t
2990: 68 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e  he OP_MakeKey an
29a0: 64 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  d OP_MakeIdxKey 
29b0: 6f 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65  opcode.** docume
29c0: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  ntation for addi
29d0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
29e0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20  on about the P3 
29f0: 73 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61  string..** See a
2a00: 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64  lso the sqliteAd
2a10: 64 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f  dIdxKeyType() ro
2a20: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
2a30: 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28  qliteAddKeyType(
2a40: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2a50: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e  t *pEList){.  in
2a60: 74 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69  t nColumn = pELi
2a70: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61  st->nExpr;.  cha
2a80: 72 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  r *zType = sqlit
2a90: 65 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e  eMalloc( nColumn
2aa0: 2b 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  +1 );.  int i;. 
2ab0: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
2ac0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2ad0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
2ae0: 2b 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d  +){.    zType[i]
2af0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70   = sqliteExprTyp
2b00: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
2b10: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
2b20: 5f 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27  _NUM ? 'n' : 't'
2b30: 3b 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d  ;.  }.  zType[i]
2b40: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64   = 0;.  sqliteVd
2b50: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
2b60: 2c 20 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e  , zType, nColumn
2b70: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2b80: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
2b90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2ba0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2bb0: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2bc0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2bd0: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2be0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
2bf0: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
2c00: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
2c10: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
2c20: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
2c30: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
2c40: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
2c50: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
2c60: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
2c70: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
2c80: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
2c90: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
2ca0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
2cb0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
2cc0: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2cd0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2ce0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2cf0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2d00: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2d10: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2d20: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d40: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
2d50: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2d60: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2d70: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2d80: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
2d90: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
2da0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
2db0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
2dc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
2dd0: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
2de0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
2df0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
2e00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
2e20: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
2e30: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2e40: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
2e50: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
2e60: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
2e70: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
2e80: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
2e90: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
2ea0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
2eb0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
2ec0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
2ed0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2ee0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
2ef0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
2f00: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
2f10: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
2f20: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
2f30: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
2f40: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2f60: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
2f70: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
2f80: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
2fb0: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
2fc0: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
2fd0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2fe0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2ff0: 69 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  i;..  if( v==0 )
3000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
3010: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
3020: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
3030: 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   was a LIMIT cla
3040: 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  use on the SELEC
3050: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
3060: 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20  n do the check. 
3070: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68   ** to see if th
3080: 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65  is row should be
3090: 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
30a0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
30b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4f  ){.    if( p->iO
30c0: 66 66 73 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20  ffset>=0 ){.    
30d0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
30e0: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
30f0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
3100: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3110: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
3120: 4f 66 66 73 65 74 2c 20 61 64 64 72 2b 32 29 3b  Offset, addr+2);
3130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3140: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3150: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3170: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
3180: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3190: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
31a0: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
31b0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
31c0: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
31d0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
31e0: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
31f0: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
3200: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3210: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
3220: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3230: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
3240: 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d  rcTab, i);.    }
3250: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
3260: 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  olumn = pEList->
3270: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
3280: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
3290: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
32a0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
32b0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
32c0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
32d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
32e0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
32f0: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
3300: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
3310: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
3320: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
3330: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
3340: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
3350: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
3360: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
3370: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  lt..  */.  if( d
3380: 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45  istinct>=0 && pE
3390: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
33a0: 6e 45 78 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e  nExpr>0 ){.#if N
33b0: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
33c0: 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 56 64  NCT.    sqliteVd
33d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
33e0: 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e  Null, -pEList->n
33f0: 45 78 70 72 2c 20 73 71 6c 69 74 65 56 64 62 65  Expr, sqliteVdbe
3400: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
3410: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
3420: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3430: 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c   OP_MakeKey, pEL
3440: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a  ist->nExpr, 1);.
3450: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
3460: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
3470: 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65  =4 ) sqliteAddKe
3480: 79 54 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29  yType(v, pEList)
3490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
34a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
34b0: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
34c0: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
34d0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
34e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
34f0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69  (v, OP_Pop, pELi
3500: 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b  st->nExpr+1, 0);
3510: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3520: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3530: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3540: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3550: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3560: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
3570: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3580: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69  OP_PutStrKey, di
3590: 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a  stinct, 0);.  }.
35a0: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
35b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
35c0: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
35d0: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
35e0: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
35f0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3600: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3610: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3620: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
3630: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3640: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3650: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
3660: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
3670: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
3680: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3690: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
36a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
36b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
36c0: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
36d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
36e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74      }..    /* St
36f0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
3700: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
3710: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
3720: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
3730: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
3740: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
3750: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3760: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3770: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
3780: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
3790: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
37a0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
37b0: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
37c0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
37d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
37e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
37f0: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61  OP_NewRecno, iPa
3800: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3810: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3820: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
3830: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3840: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3850: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
3860: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
3870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3880: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
3890: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
38a0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
38b0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
38c0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
38d0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
38e0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
38f0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
3900: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
3910: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3920: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
3930: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
3940: 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  pt: {.      int 
3950: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
3960: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
3970: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3980: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
3990: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
39a0: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
39b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
39c0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
39d0: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
39e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
39f0: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
3a00: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3a10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3a20: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
3a30: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
3a40: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
3a50: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
3a60: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
3a70: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
3a80: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
3a90: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
3aa0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
3ab0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
3ac0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
3ad0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
3ae0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3af0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
3b00: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 56 64  addr1 = sqliteVd
3b10: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3b20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
3b30: 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  2;.      assert(
3b40: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
3b50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3b60: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
3b70: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29  ll, -1, addr1+3)
3b80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3b90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3ba0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
3bb0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 56 64  addr2 = sqliteVd
3bc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3bd0: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  to, 0, 0);.     
3be0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3bf0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3c00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3c10: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3c20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c30: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3c40: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
3c50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
3c60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3c70: 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
3c80: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
3c90: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
3ca0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
3cb0: 61 64 64 72 32 2c 20 73 71 6c 69 74 65 56 64 62  addr2, sqliteVdb
3cc0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
3cd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3ce0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
3cf0: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
3d00: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
3d10: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
3d20: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
3d30: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
3d40: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
3d50: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
3d60: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
3d70: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
3d80: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
3d90: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
3da0: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
3db0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3dc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3dd0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3de0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3df0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3e00: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3e10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3e20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3e30: 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
3e40: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
3e50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3e60: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
3e70: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
3e80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3e90: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
3ea0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
3eb0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
3ec0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3ed0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
3ee0: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
3ef0: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
3f00: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3f10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3f20: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b  Op(v, OP_SortMak
3f30: 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  eRec, nColumn, 0
3f40: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
3f50: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3f60: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3f70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
3f90: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
3fa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
3fb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3fc0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
3fd0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
3fe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
4000: 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  ke a subroutine 
4010: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  to handle the re
4020: 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72  sults.  The subr
4030: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20  outine itself.  
4040: 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69    ** is responsi
4050: 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20  ble for popping 
4060: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20  the results off 
4070: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
4080: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4090: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
40a0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
40b0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
40c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
40d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
40e0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
40f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4100: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
4110: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
4120: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4130: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4140: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
4150: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
4160: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4170: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  }..    /* Discar
4180: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
4190: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
41a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
41b0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
41c0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
41d0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
41e0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
41f0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
4200: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
4210: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
4220: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
4230: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
4240: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
4250: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
4260: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
4270: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
4280: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4290: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
42a0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
42b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
42c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
42d0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
42e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4300: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4310: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4320: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4330: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
4340: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
4350: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
4360: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
4370: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
4380: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
4390: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
43a0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
43b0: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
43c0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
43d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
43e0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
43f0: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4400: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4410: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4420: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4430: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
4440: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
4450: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
4460: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
4470: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
4480: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
4490: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
44a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
44b0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
44c0: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
44d0: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
44e0: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
44f0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
4500: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
4510: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
4520: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
4530: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
4540: 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c  .  int end = sql
4550: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
4560: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
4570: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
4580: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
4590: 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  n;.  sqliteVdbeA
45a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
45b0: 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d   0, 0);.  addr =
45c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
45d0: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
45e0: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69 66 28 20   0, end);.  if( 
45f0: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b  p->iOffset>=0 ){
4600: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4610: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
4620: 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  cr, p->iOffset, 
4630: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c  addr+4);.    sql
4640: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4650: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
4660: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4670: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4680: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69  , addr);.  }.  i
4690: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
46a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
46b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
46c0: 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Incr, p->iLimit,
46d0: 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 77 69   end);.  }.  swi
46e0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
46f0: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4700: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ack: {.      sql
4710: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4720: 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c  OP_SortCallback,
4730: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4750: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
4760: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
4770: 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20  T_TempTable: {. 
4780: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4790: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
47a0: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
47b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
47c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
47d0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
47e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
47f0: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
4800: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4820: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
4830: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4840: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4850: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4860: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
4870: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64 62  l, -1, sqliteVdb
4880: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
4890: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
48a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
48b0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
48c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
48d0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
48e0: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
48f0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4900: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4910: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
4920: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
4930: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4940: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
4950: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4970: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
4980: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4990: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
49a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
49b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
49c0: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
49d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
49e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
49f0: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 20 20   0, end);.      
4a00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a10: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4a20: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
4a30: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
4a40: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
4a50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
4a60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4a70: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
4a80: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
4a90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4aa0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
4ab0: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
4ac0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4ad0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
4ae0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4af0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
4b00: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
4b10: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
4b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4b30: 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41   }.  sqliteVdbeA
4b40: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4b50: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
4b60: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
4b70: 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73  bel(v, end);.  s
4b80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4b90: 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20  , OP_SortReset, 
4ba0: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
4bb0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
4bc0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
4bd0: 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74 79   VDBE the dataty
4be0: 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d 6e  pes of.** column
4bf0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4c00: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  set..**.** This 
4c10: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65 6e  routine only gen
4c20: 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20 74  erates code if t
4c30: 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77 5f  he "PRAGMA show_
4c40: 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a 2a  datatypes=on".**
4c50: 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75 74   has been execut
4c60: 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79 70  ed.  The datatyp
4c70: 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  es are reported 
4c80: 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c  out in the azCol
4c90: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74 6f  .** parameter to
4ca0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4cb0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 72  nction.  The fir
4cc0: 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e 74  st N azCol[] ent
4cd0: 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  ries.** are the 
4ce0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
4cf0: 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73 65  umns, and the se
4d00: 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20 61  cond N entries a
4d10: 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79  re the.** dataty
4d20: 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  pes for the colu
4d30: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  mns..**.** The "
4d40: 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61 20  datatype" for a 
4d50: 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20 61  result that is a
4d60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79 70   column of a typ
4d70: 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  e is the.** data
4d80: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
4d90: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4da0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
4db0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68  statement..** Th
4dc0: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61  e datatype for a
4dd0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4de0: 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20 4e  either TEXT or N
4df0: 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a 20  UMERIC.  The.** 
4e00: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20 52  datatype for a R
4e10: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
4e20: 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  TEGER..*/.static
4e30: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
4e40: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
4e50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4e60: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
4e70: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
4e80: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
4e90: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
4ea0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4eb0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
4ec0: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
4ed0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
4ee0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
4ef0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4f00: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
4f10: 20 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c   pParse->useCall
4f20: 62 61 63 6b 20 26 26 20 28 70 50 61 72 73 65 2d  back && (pParse-
4f30: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
4f40: 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 29  ITE_ReportTypes)
4f50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
4f60: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
4f70: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
4f80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
4f90: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
4fa0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
4fb0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
4fc0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
4fd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
4fe0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
4ff0: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
5000: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
5010: 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ab;.      int iC
5020: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
5030: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
5040: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
5050: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
5060: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
5070: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
5080: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
5090: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
50a0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
50b0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
50c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
50d0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
50e0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
50f0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
5100: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
5110: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
5120: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
5130: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
5140: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
5150: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5160: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
5170: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5180: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zType;.      }. 
5190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
51a0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 54 79  if( sqliteExprTy
51b0: 70 65 28 70 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  pe(p)==SQLITE_SO
51c0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
51d0: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
51e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
51f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 4e        zType = "N
5200: 55 4d 45 52 49 43 22 3b 0a 20 20 20 20 20 20 7d  UMERIC";.      }
5210: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5220: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5230: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 20 2b  _ColumnName, i +
5240: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
5250: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
5260: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
5270: 2c 20 7a 54 79 70 65 2c 20 50 33 5f 53 54 41 54  , zType, P3_STAT
5280: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
5290: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
52a0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
52b0: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
52c0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
52d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
52e0: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
52f0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
5300: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
5310: 7a 43 6f 6c 5b 5d 20 76 61 6f 6c 75 65 73 20 69  zCol[] vaolues i
5320: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
5330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
5340: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
5350: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
5360: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
5370: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5380: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
5390: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
53a0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
53b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
53c0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
53d0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
53e0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
53f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5400: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
5410: 20 6a 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   j;.  if( pParse
5420: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
5430: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 5f   v==0 || sqlite_
5440: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
5450: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
5460: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
5470: 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
5480: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
5490: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
54a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
54b0: 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  e = 0;.    int s
54c0: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20  howFullNames;.  
54d0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
54e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
54f0: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
5500: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
5510: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
5520: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
5530: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
5540: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
5550: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5560: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5570: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
5580: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5590: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
55a0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
55b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
55c0: 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 46 75 6c     }.    showFul
55d0: 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72 73 65  lNames = (pParse
55e0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
55f0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
5600: 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 70  s)!=0;.    if( p
5610: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
5620: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
5630: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
5640: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
5650: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
5660: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
5670: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
5680: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
5690: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
56a0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
56b0: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
56c0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
56d0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
56e0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
56f0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
5700: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5710: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
5720: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
5730: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
5740: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
5750: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
5760: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
5770: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
5780: 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b  Col = "_ROWID_";
5790: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
57a0: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
57b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
57c0: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
57d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
57e0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
57f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5800: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a  .zType;.      }.
5810: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 70 61        if( p->spa
5820: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
5830: 5b 30 5d 20 26 26 20 21 73 68 6f 77 46 75 6c 6c  [0] && !showFull
5840: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
5850: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
5860: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50  teVdbeAddOp(v,OP
5870: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
5880: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
5890: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
58a0: 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  , -1, p->span.z,
58b0: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
58c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
58d0: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
58e0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  addr);.      }el
58f0: 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  se if( pTabList-
5900: 3e 6e 53 72 63 3e 31 20 7c 7c 20 73 68 6f 77 46  >nSrc>1 || showF
5910: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
5920: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
5930: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
5940: 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20  r *zTab;. .     
5950: 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69     zTab = pTabLi
5960: 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b  st->a[j].zAlias;
5970: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f  .        if( sho
5980: 77 46 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54  wFullNames || zT
5990: 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70  ab==0 ) zTab = p
59a0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
59b0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
59c0: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62  ing(&zName, zTab
59d0: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
59e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
59f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5a00: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29  olumnName, i, 0)
5a10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5a20: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
5a30: 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  -1, zName, strle
5a40: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
5a50: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
5a60: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
5a70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5a80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5a90: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
5aa0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
5ab0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5ac0: 2c 20 2d 31 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a  , -1, zCol, 0);.
5ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5ae0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
5af0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
5b00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
5b10: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
5b20: 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e  dOp(v,OP_ColumnN
5b30: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
5b40: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
5b50: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73  geP3(v, -1, p->s
5b60: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
5b70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5b80: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
5b90: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
5ba0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
5bb0: 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20   zName[30];.    
5bc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
5bd0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54  =TK_COLUMN || pT
5be0: 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  abList==0 );.   
5bf0: 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65     sprintf(zName
5c00: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
5c10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5c20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5c30: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30  ColumnName, i, 0
5c40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5c50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
5c60: 31 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  1, zName, strlen
5c70: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  (zName));.    }.
5c80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d    }.}../*.** Nam
5c90: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
5ca0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
5cb0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
5cc0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
5cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
5ce0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
5cf0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
5d00: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
5d10: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
5d20: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
5d30: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
5d40: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
5d50: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
5d60: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
5d70: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
5d80: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
5d90: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
5da0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
5db0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
5dc0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
5dd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
5de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
5df0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
5e00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
5e10: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61  lInColumnList(Pa
5e20: 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  rse*, Select*);.
5e30: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
5e40: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
5e50: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
5e60: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
5e70: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
5e80: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
5e90: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
5ea0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 52 65 73  Table *sqliteRes
5eb0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
5ec0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
5ed0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65  ar *zTabName, Se
5ee0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
5ef0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
5f00: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
5f10: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
5f20: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
5f30: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
5f40: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
5f50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
5f60: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5f70: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
5f80: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
5f90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5fa0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  .  }.  pTab->zNa
5fb0: 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20  me = zTabName ? 
5fc0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61  sqliteStrDup(zTa
5fd0: 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45  bName) : 0;.  pE
5fe0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
5ff0: 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e  pEList;.  pTab->
6000: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
6010: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
6020: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
6030: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73    pTab->aCol = s
6040: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
6050: 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30  eof(pTab->aCol[0
6060: 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ])*pTab->nCol );
6070: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
6080: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
6090: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
60a0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
60b0: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
60c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
60d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
60e0: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  Dup(pEList->a[i]
60f0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  .zName);.    }el
6100: 73 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73 74  se if( (p=pEList
6110: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
6120: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
6130: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
6140: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
6150: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &pTab->aCol[i].z
6160: 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  Name, p->span.z,
6170: 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a   p->span.n, 0);.
6180: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
6190: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
61a0: 2d 3e 70 52 69 67 68 74 20 26 26 20 70 2d 3e 70  ->pRight && p->p
61b0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  Right->token.z &
61c0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  &.           p->
61d0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
61e0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
61f0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54  teSetNString(&pT
6200: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
6210: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  e, .           p
6220: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
6230: 7a 2c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  z, p->pRight->to
6240: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d  ken.n, 0);.    }
6250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
6260: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20   zBuf[30];.     
6270: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
6280: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
6290: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
62a0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  l[i].zName = sql
62b0: 69 74 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b  iteStrDup(zBuf);
62c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
62d0: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
62e0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
62f0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67  ./*.** For the g
6300: 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
6310: 65 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20  ement, do three 
6320: 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  things..**.**   
6330: 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (1)  Fill in th
6340: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
6350: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
6360: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
6370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
6380: 6e 65 73 20 74 68 65 20 73 65 74 20 6f 66 20 74  nes the set of t
6390: 61 62 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c  ables that shoul
63a0: 64 20 62 65 20 73 63 61 6e 6e 65 64 2e 20 20 46  d be scanned.  F
63b0: 6f 72 20 76 69 65 77 73 2c 0a 2a 2a 20 20 20 20  or views,.**    
63c0: 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
63d0: 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
63e0: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
63f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6400: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
6410: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
6420: 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
6430: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
6440: 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
6450: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
6460: 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
6470: 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
6480: 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
6490: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
64a0: 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
64b0: 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
64c0: 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
64d0: 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
64e0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
64f0: 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
6500: 2a 20 20 20 20 28 32 29 20 20 41 64 64 20 74 65  *    (2)  Add te
6510: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
6520: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
6530: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
6540: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
6550: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
6560: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
6570: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
6580: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ns..**.**    (3)
6590: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
65a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
65b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
65c0: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
65d0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
65e0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
65f0: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
6600: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
6610: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
6620: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
6630: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
6640: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
6650: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
6660: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
6670: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
6680: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
6690: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
66a0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
66b0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
66c0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
66d0: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
66e0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
66f0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
6700: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
6710: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 20  olumnList(Parse 
6720: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
6730: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
6740: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
6750: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
6760: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
6770: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
6780: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
6790: 2d 3e 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->pSrc==0 ) retu
67a0: 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74  rn 1;.  pTabList
67b0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
67c0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
67d0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
67e0: 65 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74  every table in t
67f0: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20  he table list.. 
6800: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
6810: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
6820: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
6830: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
6840: 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ab ){.      /* T
6850: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
6860: 72 75 6e 20 62 65 66 6f 72 65 21 20 20 4e 6f 20  run before!  No 
6870: 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65  need to continue
6880: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
6890: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
68a0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
68b0: 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
68c0: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
68d0: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
68e0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
68f0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
6900: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
6910: 2e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20  .pSelect!=0 );. 
6920: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
6930: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d  t->a[i].zAlias==
6940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
6950: 72 20 7a 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b  r zFakeName[60];
6960: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
6970: 28 7a 46 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c  (zFakeName, "sql
6980: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
6990: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76  ",.           (v
69a0: 6f 69 64 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61  oid*)pTabList->a
69b0: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
69c0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
69d0: 74 72 69 6e 67 28 26 70 54 61 62 4c 69 73 74 2d  tring(&pTabList-
69e0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46  >a[i].zAlias, zF
69f0: 61 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  akeName, 0);.   
6a00: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 4c     }.      pTabL
6a10: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  ist->a[i].pTab =
6a20: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
6a30: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
6a40: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
6a50: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6a60: 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20  zAlias,.        
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6aa0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
6ab0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
6ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
6ae0: 20 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74   The isTransient
6af0: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
6b00: 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73  that the Table s
6b10: 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65  tructure has bee
6b20: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d  n.      ** dynam
6b30: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
6b40: 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65   and may be free
6b50: 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20  d at any time.  
6b60: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
6b70: 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73        ** pTab is
6b80: 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
6b90: 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61   a persistent ta
6ba0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
6bb0: 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20  at defines.     
6bc0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6bd0: 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20  schema. */.     
6be0: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
6bf0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  nt = 1;.    }els
6c00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
6c10: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
6c20: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
6c30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
6c40: 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d  .      pTabList-
6c50: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[i].pTab = pTa
6c60: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
6c70: 69 74 65 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  iteLocateTable(p
6c80: 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2d 3e  Parse,pTabList->
6c90: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70 54 61 62 4c  a[i].zName,pTabL
6ca0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62  ist->a[i].zDatab
6cb0: 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
6cc0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
6cd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6ce0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
6cf0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
6d00: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
6d10: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
6d20: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
6d30: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
6d40: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
6d50: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
6d60: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
6d70: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
6d80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
6da0: 20 49 66 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   If pTabList->a[
6db0: 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  i].pSelect!=0 it
6dc0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
6dd0: 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
6de0: 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
6df0: 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
6e00: 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
6e10: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
6e20: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
6e30: 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
6e40: 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
6e50: 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
6e60: 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
6e70: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
6e80: 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
6e90: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  /.        if( pT
6ea0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
6eb0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
6ec0: 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61       pTabList->a
6ed0: 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  [i].pSelect = sq
6ee0: 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 54  liteSelectDup(pT
6ef0: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
6f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6f10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6f20: 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
6f30: 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
6f40: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
6f50: 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
6f60: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72  /.  if( sqlitePr
6f70: 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
6f80: 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , p) ) return 1;
6f90: 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
6fa0: 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
6fb0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
6fc0: 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
6fd0: 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
6fe0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
6ff0: 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
7000: 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
7010: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
7020: 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
7030: 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
7040: 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
7050: 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
7060: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
7070: 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
7080: 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
7090: 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
70a0: 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
70b0: 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
70c0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
70d0: 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
70e0: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
70f0: 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
7100: 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
7110: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
7120: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
7130: 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
7140: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
7150: 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
7160: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
7170: 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
7180: 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
7190: 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
71a0: 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
71b0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
71c0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
71d0: 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
71e0: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
71f0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
7200: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
7210: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
7220: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
7230: 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
7240: 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
7250: 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
7260: 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
7270: 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
7280: 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
7290: 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
72a0: 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
72b0: 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
72c0: 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
72d0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
72e0: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
72f0: 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
7300: 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
7310: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
7320: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
7330: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
7340: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
7350: 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
7360: 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
7370: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
7380: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
7390: 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
73a0: 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
73b0: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66  *pNew = 0;.    f
73c0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
73d0: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
73e0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
73f0: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
7400: 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
7410: 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20  _ALL &&.        
7420: 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44     (pE->op!=TK_D
7430: 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
7440: 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  ==0 || pE->pRigh
7450: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
7460: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
7470: 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
7480: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
7490: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
74a0: 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
74b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
74c0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
74d0: 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e  pend(pNew, a[k].
74e0: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
74f0: 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
7500: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
7510: 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
7520: 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
7530: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
7540: 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
7550: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7560: 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
7570: 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
7580: 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
7590: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
75a0: 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
75b0: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
75c0: 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
75d0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
75e0: 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
75f0: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
7600: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
7610: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
7620: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
7630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7640: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
7650: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
7660: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d           pName =
7670: 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b   &pE->pLeft->tok
7680: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  en;.        }els
7690: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61  e{.          pNa
76a0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
76b0: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
76c0: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
76d0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
76e0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
76f0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
7700: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
7710: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
7720: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
7730: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
7740: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
7750: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
7760: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
7770: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
7780: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
7790: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
77a0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26      if( pName &&
77b0: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
77c0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
77d0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
77e0: 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49       sqliteStrNI
77f0: 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54  Cmp(pName->z, zT
7800: 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e  abName, pName->n
7810: 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  )!=0 ||.        
7820: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
7830: 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20  e[pName->n]!=0) 
7840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
7850: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
7870: 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ableSeen = 1;.  
7880: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7890: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
78a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
78b0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70   Expr *pExpr, *p
78c0: 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20  Left, *pRight;. 
78d0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
78e0: 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
78f0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  Col[j].zName;.. 
7900: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
7910: 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d  >0 && (pTabList-
7920: 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
7930: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
7940: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
7950: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
7960: 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  (pTabList->a[i-1
7970: 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ].pTab, zName)>=
7980: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7990: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
79a0: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
79b0: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
79c0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
79d0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
79e0: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7a00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7a20: 20 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c    if( i>0 && sql
7a30: 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 70  iteIdListIndex(p
7a40: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7a50: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
7a60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7a70: 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
7a80: 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
7a90: 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
7aa0: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
7ab0: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
7ac0: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
7ad0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
7ae0: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
7af0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7b00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7b10: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
7b20: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
7b30: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
7b40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
7b50: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
7b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7b70: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  ght->token.z = z
7b80: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7b90: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7ba0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
7bb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
7bc0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  Right->token.dyn
7bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7be0: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26    if( zTabName &
7bf0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
7c00: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
7c10: 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
7c20: 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  teExpr(TK_ID, 0,
7c30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
7c40: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
7c50: 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c  liteExpr(TK_DOT,
7c60: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
7c70: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7c80: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
7c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7ca0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
7cb0: 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b  en.z = zTabName;
7cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7cd0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Left->token.n = 
7ce0: 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29  strlen(zTabName)
7cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7d00: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pLeft->token.dyn
7d10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7d20: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
7d30: 69 6e 67 28 28 63 68 61 72 2a 2a 29 26 70 45 78  ing((char**)&pEx
7d40: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a 54 61 62  pr->span.z, zTab
7d50: 4e 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e 61 6d 65  Name, ".", zName
7d60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7d70: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
7d80: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 45 78 70 72  n = strlen(pExpr
7d90: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20  ->span.z);.     
7da0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7db0: 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  span.dyn = 1;.  
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7dd0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a  r->token.z = 0;.
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
7df0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30  xpr->token.n = 0
7e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7e10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pExpr->token.dyn
7e20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7e40: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
7e50: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
7e60: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
7e70: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b   = pExpr->token;
7e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7e90: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
7ea0: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
7eb0: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78  Append(pNew, pEx
7ec0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
7ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7ee0: 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
7ef0: 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
7f00: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
7f10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7f20: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
7f30: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
7f40: 3a 20 25 54 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  : %T", pName);. 
7f50: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7f70: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
7f80: 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
7f90: 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
7fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7fb0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
7fc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7fd0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c  .    sqliteExprL
7fe0: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
7ff0: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
8000: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
8010: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8020: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8030: 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69  recursively unli
8040: 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70  nks the Select.p
8050: 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69  Src.a[].pTab poi
8060: 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65  nters.** in a se
8070: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
8080: 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68   It just sets th
8090: 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55  e pointers to NU
80a0: 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  LL.  This.** rou
80b0: 74 69 6e 65 20 69 73 20 72 65 63 75 72 73 69 76  tine is recursiv
80c0: 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  e in the sense t
80d0: 68 61 74 20 69 66 20 74 68 65 20 53 65 6c 65 63  hat if the Selec
80e0: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65  t.pSrc.a[].pSele
80f0: 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73  ct.** pointer is
8100: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20   not NULL, this 
8110: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8120: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
8130: 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a   that pointer..*
8140: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8150: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  e is called on t
8160: 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
8170: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
8180: 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72   a.** VIEW in or
8190: 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20  der to undo any 
81a0: 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c  bindings to tabl
81b0: 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  es.  This is nec
81c0: 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73  essary.** becaus
81d0: 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d  e those tables m
81e0: 69 67 68 74 20 62 65 20 44 52 4f 50 65 64 20 62  ight be DROPed b
81f0: 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 53  y a subsequent S
8200: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49  QL command..** I
8210: 66 20 74 68 65 20 62 69 6e 64 69 6e 67 73 20 61  f the bindings a
8220: 72 65 20 6e 6f 74 20 72 65 6d 6f 76 65 64 2c 20  re not removed, 
8230: 74 68 65 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  then the Select.
8240: 70 53 72 63 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  pSrc->a[].pTab f
8250: 69 65 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ield.** will be 
8260: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
8270: 20 61 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 54   a deallocated T
8280: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
8290: 66 74 65 72 20 74 68 65 0a 2a 2a 20 44 52 4f 50  fter the.** DROP
82a0: 20 61 6e 64 20 61 20 63 6f 72 65 64 75 6d 70 20   and a coredump 
82b0: 77 69 6c 6c 20 6f 63 63 75 72 20 74 68 65 20 6e  will occur the n
82c0: 65 78 74 20 74 69 6d 65 20 74 68 65 20 56 49 45  ext time the VIE
82d0: 57 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  W is used..*/.vo
82e0: 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55  id sqliteSelectU
82f0: 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29  nbind(Select *p)
8300: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  {.  int i;.  Src
8310: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
8320: 70 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSrc;.  Table *p
8330: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
8340: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8350: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
8360: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
8370: 20 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61   (pTab = pSrc->a
8380: 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a  [i].pTab)!=0 ){.
8390: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
83a0: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
83b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c         sqliteDel
83c0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62  eteTable(0, pTab
83d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
83e0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62   pSrc->a[i].pTab
83f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
8400: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pSrc->a[i].pSele
8410: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
8420: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
8430: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c  (pSrc->a[i].pSel
8440: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
8450: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8460: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
8470: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
8480: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
8490: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
84a0: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
84b0: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
84c0: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
84d0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
84e0: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
84f0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
8500: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
8510: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
8520: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
8530: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
8540: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
8550: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
8560: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
8570: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
8580: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
8590: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
85a0: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
85b0: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
85c0: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
85d0: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
85e0: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
85f0: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
8600: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
8610: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
8620: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
8630: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
8640: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
8650: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
8660: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
8670: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
8680: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
8690: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
86a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
86b0: 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 63 6f  tine does NOT co
86c0: 72 72 65 63 74 6c 79 20 69 6e 69 74 69 61 6c 69  rrectly initiali
86d0: 7a 65 20 74 68 65 20 45 78 70 72 2e 64 61 74 61  ze the Expr.data
86e0: 54 79 70 65 20 20 66 69 65 6c 64 0a 2a 2a 20 6f  Type  field.** o
86f0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  f the ORDER BY e
8700: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 54 68 65  xpressions.  The
8710: 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74   multiSelectSort
8720: 4f 72 64 65 72 28 29 20 72 6f 75 74 69 6e 65 0a  Order() routine.
8730: 2a 2a 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ** must be calle
8740: 64 20 74 6f 20 64 6f 20 74 68 61 74 20 61 66 74  d to do that aft
8750: 65 72 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  er the individua
8760: 6c 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  l select stateme
8770: 6e 74 73 0a 2a 2a 20 68 61 76 65 20 61 6c 6c 20  nts.** have all 
8780: 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 20 20  been analyzed.  
8790: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
87a0: 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 75 74  unable to comput
87b0: 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65 0a  e Expr.dataType.
87c0: 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 6d 75  ** because it mu
87d0: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
87e0: 6f 72 65 20 74 68 65 20 69 6e 64 69 76 69 64 75  ore the individu
87f0: 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  al select statem
8800: 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  ents.** have bee
8810: 6e 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73  n analyzed..*/.s
8820: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
8830: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a  rderbyToColumn(.
8840: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
8860: 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72  lace to leave er
8870: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
8880: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
8890: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
88a0: 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c  ch to result col
88b0: 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c  umns of this SEL
88c0: 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ECT */.  ExprLis
88d0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
88e0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
88f0: 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68   values to match
8900: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
8910: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
8920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8930: 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c   Insert this val
8940: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
8950: 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65    int mustComple
8960: 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  te        /* If 
8970: 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42  TRUE all ORDER B
8980: 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f  Ys must match */
8990: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  .){.  int nErr =
89a0: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
89b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
89c0: 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65  st;..  if( pSele
89d0: 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42  ct==0 || pOrderB
89e0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  y==0 ) return 1;
89f0: 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  .  if( mustCompl
8a00: 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ete ){.    for(i
8a10: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8a20: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72  nExpr; i++){ pOr
8a30: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8a40: 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   = 0; }.  }.  if
8a50: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
8a60: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
8a70: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
8a80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
8a90: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
8aa0: 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f  {.    if( matchO
8ab0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
8ac0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
8ad0: 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79  pPrior, pOrderBy
8ae0: 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
8af0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8b00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
8b10: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
8b20: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
8b30: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
8b40: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
8b50: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
8b60: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
8b70: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31     int iCol = -1
8b80: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
8b90: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
8ba0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8bb0: 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  ( sqliteExprIsIn
8bc0: 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
8bd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
8be0: 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45  ol<=0 || iCol>pE
8bf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
8c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
8c10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
8c20: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
8c30: 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68  Y position %d sh
8c40: 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20  ould be between 
8c50: 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  1 and %d",.     
8c60: 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73       iCol, pELis
8c70: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
8c80: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
8c90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8ca0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73  }.      if( !mus
8cb0: 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74  tComplete ) cont
8cc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c  inue;.      iCol
8cd0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  --;.    }.    fo
8ce0: 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26  r(j=0; iCol<0 &&
8cf0: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
8d00: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
8d10: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ( pEList->a[j].z
8d20: 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d  Name && (pE->op=
8d30: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70  =TK_ID || pE->op
8d40: 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a  ==TK_STRING) ){.
8d50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8d60: 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20  ame, *zLabel;.  
8d70: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
8d80: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
8d90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
8da0: 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b  ( pE->token.z );
8db0: 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20  .        zLabel 
8dc0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
8dd0: 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d  pE->token.z, pE-
8de0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
8df0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
8e00: 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  (zLabel);.      
8e10: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
8e20: 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65  Cmp(zName, zLabe
8e30: 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  l)==0 ){ .      
8e40: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
8e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8e60: 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65  sqliteFree(zLabe
8e70: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
8e80: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
8e90: 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72  sqliteExprCompar
8ea0: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
8eb0: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
8ec0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
8ed0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ee0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
8ef0: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
8f00: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
8f10: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
8f20: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
8f30: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
8f40: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
8f50: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  [i].done = 1;.  
8f60: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
8f70: 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65  <0 && mustComple
8f80: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
8f90: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
8fa0: 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45  e,.        "ORDE
8fb0: 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72  R BY term number
8fc0: 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   %d does not mat
8fd0: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
8fe0: 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20  lumn", i+1);.   
8ff0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
9000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9010: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
9020: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20    .}../*.** Get 
9030: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
9040: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
9050: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
9060: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
9070: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
9080: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
9090: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
90a0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
90b0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
90c0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 50 61  sqliteGetVdbe(Pa
90d0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
90e0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
90f0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
9100: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
9110: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
9120: 71 6c 69 74 65 56 64 62 65 43 72 65 61 74 65 28  qliteVdbeCreate(
9130: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d  pParse->db);.  }
9140: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
9150: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9160: 6e 65 20 73 65 74 73 20 74 68 65 20 45 78 70 72  ne sets the Expr
9170: 2e 64 61 74 61 54 79 70 65 20 66 69 65 6c 64 20  .dataType field 
9180: 6f 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  on all elements 
9190: 6f 66 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  of.** the pOrder
91a0: 42 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  By expression li
91b0: 73 74 2e 20 20 54 68 65 20 70 4f 72 64 65 72 42  st.  The pOrderB
91c0: 79 20 6c 69 73 74 20 77 69 6c 6c 20 68 61 76 65  y list will have
91d0: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 20 75 70 20   been.** set up 
91e0: 62 79 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  by matchOrderbyT
91f0: 6f 43 6f 6c 75 6d 6e 28 29 2e 20 20 48 65 6e 63  oColumn().  Henc
9200: 65 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  e each expressio
9210: 6e 20 68 61 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f  n has.** a TK_CO
9220: 4c 55 4d 4e 20 61 73 20 69 74 73 20 72 6f 6f 74  LUMN as its root
9230: 20 6e 6f 64 65 2e 20 20 54 68 65 20 45 78 70 72   node.  The Expr
9240: 2e 69 43 6f 6c 75 6d 6e 20 72 65 66 65 72 73 20  .iColumn refers 
9250: 74 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  to a .** column 
9260: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9270: 74 2e 20 20 20 54 68 65 20 64 61 74 61 74 79 70  t.   The datatyp
9280: 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
9290: 54 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a 20 69 66  TE_SO_TEXT.** if
92a0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
92b0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 20 61  ng column in p a
92c0: 6e 64 20 65 76 65 72 79 20 53 45 4c 45 43 54 20  nd every SELECT 
92d0: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 0a 2a  to the left of.*
92e0: 2a 20 70 20 68 61 73 20 61 20 64 61 74 61 74 79  * p has a dataty
92f0: 70 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 4f 5f  pe of SQLITE_SO_
9300: 54 45 58 54 2e 20 20 49 66 20 74 68 65 20 63 6f  TEXT.  If the co
9310: 6f 72 65 73 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  oressponding col
9320: 75 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f 72 20 61  umn.** in p or a
9330: 6e 79 20 6f 66 20 74 68 65 20 6c 65 66 74 20 53  ny of the left S
9340: 45 4c 45 43 54 73 20 69 73 20 53 51 4c 49 54 45  ELECTs is SQLITE
9350: 5f 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e 20 74 68  _SO_NUM, then th
9360: 65 20 64 61 74 61 74 79 70 65 0a 2a 2a 20 6f 66  e datatype.** of
9370: 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 65 78   the order-by ex
9380: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 20  pression is set 
9390: 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  to SQLITE_SO_NUM
93a0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
93b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
93c0: 54 45 20 54 41 42 4c 45 20 6f 6e 65 28 61 20 49  TE TABLE one(a I
93d0: 4e 54 45 47 45 52 2c 20 62 20 54 45 58 54 29 3b  NTEGER, b TEXT);
93e0: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
93f0: 41 42 4c 45 20 74 77 6f 28 63 20 56 41 52 43 48  ABLE two(c VARCH
9400: 41 52 28 35 29 2c 20 64 20 46 4c 4f 41 54 29 3b  AR(5), d FLOAT);
9410: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
9420: 54 20 62 2c 20 62 20 46 52 4f 4d 20 6f 6e 65 20  T b, b FROM one 
9430: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20  UNION SELECT d, 
9440: 63 20 46 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52  c FROM two ORDER
9450: 20 42 59 20 31 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20   BY 1, 2;.**.** 
9460: 54 68 65 20 70 72 69 6d 61 72 79 20 73 6f 72 74  The primary sort
9470: 20 6b 65 79 20 77 69 6c 6c 20 75 73 65 20 53 51   key will use SQ
9480: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 62 65 63 61  LITE_SO_NUM beca
9490: 75 73 65 20 74 68 65 20 22 64 22 20 69 6e 0a 2a  use the "d" in.*
94a0: 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 53 45 4c  * the second SEL
94b0: 45 43 54 20 69 73 20 6e 75 6d 65 72 69 63 2e 20  ECT is numeric. 
94c0: 20 54 68 65 20 31 73 74 20 63 6f 6c 75 6d 6e 20   The 1st column 
94d0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 53 45 4c  of the first SEL
94e0: 45 43 54 0a 2a 2a 20 69 73 20 74 65 78 74 20 62  ECT.** is text b
94f0: 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ut that does not
9500: 20 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20   matter because 
9510: 61 20 6e 75 6d 65 72 69 63 20 61 6c 77 61 79 73  a numeric always
9520: 20 6f 76 65 72 72 69 64 65 73 0a 2a 2a 20 61 20   overrides.** a 
9530: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  text..**.** The 
9540: 73 65 63 6f 6e 64 61 72 79 20 6b 65 79 20 77 69  secondary key wi
9550: 6c 6c 20 75 73 65 20 74 68 65 20 53 51 4c 49 54  ll use the SQLIT
9560: 45 5f 53 4f 5f 54 45 58 54 20 73 6f 72 74 20 6f  E_SO_TEXT sort o
9570: 72 64 65 72 20 62 65 63 61 75 73 65 0a 2a 2a 20  rder because.** 
9580: 62 6f 74 68 20 74 68 65 20 28 73 65 63 6f 6e 64  both the (second
9590: 29 20 22 62 22 20 69 6e 20 74 68 65 20 66 69 72  ) "b" in the fir
95a0: 73 74 20 53 45 4c 45 43 54 20 61 6e 64 20 74 68  st SELECT and th
95b0: 65 20 22 63 22 20 69 6e 20 74 68 65 20 73 65 63  e "c" in the sec
95c0: 6f 6e 64 0a 2a 2a 20 53 45 4c 45 43 54 20 68 61  ond.** SELECT ha
95d0: 76 65 20 61 20 64 61 74 61 74 79 70 65 20 6f 66  ve a datatype of
95e0: 20 74 65 78 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   text..*/ .stati
95f0: 63 20 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65  c void multiSele
9600: 63 74 53 6f 72 74 4f 72 64 65 72 28 53 65 6c 65  ctSortOrder(Sele
9610: 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  ct *p, ExprList 
9620: 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 6e  *pOrderBy){.  in
9630: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
9640: 2a 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  *pEList;.  if( p
9650: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
9660: 75 72 6e 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  urn;.  if( p==0 
9670: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
9680: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
9690: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; i++){.      p
96a0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
96b0: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
96c0: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
96d0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
96e0: 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69 53 65 6c  ;.  }.  multiSel
96f0: 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2d 3e  ectSortOrder(p->
9700: 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79  pPrior, pOrderBy
9710: 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  );.  pEList = p-
9720: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
9730: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
9740: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
9750: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
9760: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
9770: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 64 61  ;.    if( pE->da
9780: 74 61 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53  taType==SQLITE_S
9790: 4f 5f 4e 55 4d 20 29 20 63 6f 6e 74 69 6e 75 65  O_NUM ) continue
97a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
97b0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a  ->iColumn>=0 );.
97c0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
97d0: 6e 45 78 70 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d  nExpr>pE->iColum
97e0: 6e 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 64  n ){.      pE->d
97f0: 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ataType = sqlite
9800: 45 78 70 72 54 79 70 65 28 70 45 4c 69 73 74 2d  ExprType(pEList-
9810: 3e 61 5b 70 45 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  >a[pE->iColumn].
9820: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
9830: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  }.}../*.** Compu
9840: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
9850: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
9860: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
9870: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 6e  ased on the.** n
9880: 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65  Limit and nOffse
9890: 74 20 66 69 65 6c 64 73 2e 20 20 6e 4c 69 6d 69  t fields.  nLimi
98a0: 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f  t and nOffset ho
98b0: 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 73 0a  ld the integers.
98c0: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
98d0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
98e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
98f0: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
9900: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
9910: 72 64 73 2e 20 20 4f 72 20 74 68 61 74 20 68 6f  rds.  Or that ho
9920: 6c 64 20 2d 31 20 61 6e 64 20 30 20 69 66 20 74  ld -1 and 0 if t
9930: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
9940: 65 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 20 69 4c  e omitted..** iL
9950: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
9960: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
9970: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
9980: 20 6e 75 6d 62 65 72 73 20 66 6f 72 0a 2a 2a 20   numbers for.** 
9990: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
99a0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   compute the lim
99b0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
99c0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a  If there is no.*
99d0: 2a 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  * limit and/or o
99e0: 66 66 73 65 74 2c 20 74 68 65 6e 20 69 4c 69 6d  ffset, then iLim
99f0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
9a00: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
9a10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9a20: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
9a30: 65 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e 64  es if iLimit and
9a40: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
9a50: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
9a60: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
9a70: 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e   by nLimit and n
9a80: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
9a90: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
9aa0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
9ab0: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
9ac0: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
9ad0: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
9ae0: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
9af0: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
9b00: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
9b10: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c  e..** Only if nL
9b20: 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73  imit>=0 or nOffs
9b30: 65 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  et>0 do the limi
9b40: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
9b50: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
9b60: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
9b70: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
9b80: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
9b90: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
9ba0: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
9bb0: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
9bc0: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
9bd0: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
9be0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
9bf0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
9c00: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
9c10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9c20: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a  Select *p){.  /*
9c30: 20 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 6f   .  ** If the co
9c40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 70 2d 3e 6e  mparison is p->n
9c50: 4c 69 6d 69 74 3e 30 20 74 68 65 6e 20 22 4c 49  Limit>0 then "LI
9c60: 4d 49 54 20 30 22 20 73 68 6f 77 73 0a 20 20 2a  MIT 0" shows.  *
9c70: 2a 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 74 20  * all rows.  It 
9c80: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 6e  is the same as n
9c90: 6f 20 6c 69 6d 69 74 2e 20 49 66 20 74 68 65 20  o limit. If the 
9ca0: 63 6f 6d 70 61 72 69 73 69 6f 6e 20 69 73 0a 20  comparision is. 
9cb0: 20 2a 2a 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   ** p->nLimit>=0
9cc0: 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20   then "LIMIT 0" 
9cd0: 73 68 6f 77 20 6e 6f 20 72 6f 77 73 20 61 74 20  show no rows at 
9ce0: 61 6c 6c 2e 0a 20 20 2a 2a 20 22 4c 49 4d 49 54  all..  ** "LIMIT
9cf0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
9d00: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
9d10: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
9d20: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
9d30: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
9d40: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
9d50: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
9d60: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
9d70: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
9d80: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
9d90: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
9da0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
9db0: 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  nLimit>=0 ){.   
9dc0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
9dd0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9de0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9df0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9e00: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
9e10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
9e20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9e30: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
9e40: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
9e50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9e60: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
9e70: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
9e80: 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  iLimit = iMem;. 
9e90: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66   }.  if( p->nOff
9ea0: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  set>0 ){.    int
9eb0: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
9ec0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65  nMem++;.    Vdbe
9ed0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   *v = sqliteGetV
9ee0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
9ef0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
9f00: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  rn;.    sqliteVd
9f10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9f20: 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73  teger, -p->nOffs
9f30: 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  et, 0);.    sqli
9f40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9f50: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
9f60: 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66  , 1);.    p->iOf
9f70: 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d  fset = iMem;.  }
9f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9f90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9fa0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
9fb0: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
9fc0: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
9fd0: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
9fe0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
9ff0: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
a000: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
a010: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
a020: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
a030: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
a040: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
a050: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
a060: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
a070: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
a080: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
a090: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
a0a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
a0b0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
a0c0: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
a0d0: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
a0e0: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
a0f0: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
a100: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
a110: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
a120: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
a130: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
a140: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
a150: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
a160: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
a170: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a180: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
a190: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
a1a0: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
a1b0: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
a1c0: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
a1d0: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
a1e0: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
a1f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
a200: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
a210: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
a220: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
a230: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
a240: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
a260: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 63  ----->  SELECT c
a270: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
a280: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
a290: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
a2a0: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
a2b0: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
a2c0: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
a2d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a2e0: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
a2f0: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
a300: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
a310: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
a320: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
a330: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
a340: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
a350: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
a360: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
a370: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
a380: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
a390: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
a3a0: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
a3b0: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
a3c0: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
a3d0: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
a3e0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
a3f0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
a400: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
a410: 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63  iParm){.  int rc
a420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a430: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
a440: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
a450: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
a460: 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74  ior;     /* Anot
a470: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
a480: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
a490: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
a4b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
a4c0: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 0a 20 20  this VDBE */..  
a4d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
a4e0: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
a4f0: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
a500: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
a510: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
a520: 68 65 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69  he last SELECT i
a530: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
a540: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
a550: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
a560: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
a570: 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
a580: 74 75 72 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72  turn 1;.  pPrior
a590: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
a5a0: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
a5b0: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
a5c0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
a5d0: 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
a5e0: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
a5f0: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
a600: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
a610: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
a620: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
a630: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
a640: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 7c 7c 20 70 50  >nLimit>=0 || pP
a650: 72 69 6f 72 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  rior->nOffset>0 
a660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
a670: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
a680: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
a690: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
a6a0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
a6b0: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
a6c0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74  p->op));.    ret
a6d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
a6e0: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
a6f0: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
a700: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
a710: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
a720: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
a730: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
a740: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
a750: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
a760: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
a770: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
a780: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
a790: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
a7a0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
a7b0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
a7c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a7d0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
a7e0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65  arm, 0);.    eDe
a7f0: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
a800: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
a810: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
a820: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
a830: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
a840: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
a850: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a860: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
a870: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
a880: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
a890: 20 70 50 72 69 6f 72 2d 3e 6e 4c 69 6d 69 74 20   pPrior->nLimit 
a8a0: 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  = p->nLimit;.   
a8b0: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 6e 4f 66       pPrior->nOf
a8c0: 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65  fset = p->nOffse
a8d0: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
a8e0: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
a8f0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65  rse, pPrior, eDe
a900: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
a910: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a920: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a930: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
a940: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
a950: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
a960: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
a970: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
a980: 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
a990: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 69  ;.        p->nLi
a9a0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
a9b0: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
a9c0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
a9d0: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
a9e0: 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
a9f0: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  arm, 0, 0, 0);. 
aa00: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
aa10: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
aa20: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
aa30: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 62  rn rc;.        b
aa40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
aa50: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
aa60: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
aa70: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
aa80: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
aa90: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
aaa0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
aab0: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
aac0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
aad0: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
aae0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
aaf0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ab00: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
ab10: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b  */.      int op;
ab20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
ab30: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
ab40: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
ab50: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
ab60: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
ab70: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
ab80: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
ab90: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
aba0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
abb0: 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74 3b  nLimit, nOffset;
abc0: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
abd0: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
abe0: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
abf0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
ac00: 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68  pOrderBy;  /* Th
ac10: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
ac20: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
ac30: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20  SELECT */..     
ac40: 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70   priorOp = p->op
ac50: 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54  ==TK_ALL ? SRT_T
ac60: 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e  able : SRT_Union
ac70: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
ac80: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d  t==priorOp && p-
ac90: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
aca0: 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 26 26 20 70  p->nLimit<0 && p
acb0: 2d 3e 6e 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  ->nOffset==0 ){.
acc0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
acd0: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
ace0: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
acf0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
ad00: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
ad10: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
ad20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
ad30: 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20  nTab = iParm;.  
ad40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad50: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
ad60: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
ad70: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
ad80: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
ad90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
ada0: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
adb0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
adc0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
add0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
ade0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
adf0: 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20  OrderBy .       
ae00: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
ae10: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
ae20: 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
ae30: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b   unionTab, 1) ){
ae40: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ae50: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
ae60: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
ae70: 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
ae80: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ae90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
aea0: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
aeb0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
aec0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
aed0: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75   OP_KeyAsData, u
aee0: 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20  nionTab, 1);.   
aef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
af10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
af20: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
af30: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
af40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
af50: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
af60: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
af70: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
af80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
af90: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
afa0: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
afb0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
afc0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
afd0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
afe0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
aff0: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
b000: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
b010: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
b020: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
b030: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
b040: 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78  PT:  op = SRT_Ex
b050: 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  cept;   break;. 
b060: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
b070: 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52  UNION:   op = SR
b080: 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61  T_Union;    brea
b090: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
b0a0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20   TK_ALL:     op 
b0b0: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
b0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b0d0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
b0e0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   0;.      pOrder
b0f0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
b100: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
b110: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  rBy = 0;.      n
b120: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
b130: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  t;.      p->nLim
b140: 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
b150: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
b160: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  set;.      p->nO
b170: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
b180: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
b190: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
b1a0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
b1b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
b1c0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
b1d0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
b1e0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
b1f0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
b200: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  nLimit;.      p-
b210: 3e 6e 4f 66 66 73 65 74 20 3d 20 6e 4f 66 66 73  >nOffset = nOffs
b220: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
b230: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
b240: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
b250: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
b260: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
b270: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
b280: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
b290: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
b2a0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
b2b0: 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
b2c0: 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  f( eDest!=priorO
b2d0: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69  p || unionTab!=i
b2e0: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
b2f0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
b300: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
b310: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
b320: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
b330: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
b340: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
b350: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
b360: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
b370: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
b380: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
b390: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
b3a0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70  arse, p->pSrc, p
b3b0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
b3c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
b3d0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65  eak = sqliteVdbe
b3e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
b3f0: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
b400: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
b410: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
b420: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b430: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
b440: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
b450: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
b460: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
b470: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  rse, p);.       
b480: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
b490: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
b4a0: 76 29 3b 0a 20 20 20 20 20 20 20 20 6d 75 6c 74  v);.        mult
b4b0: 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72  iSelectSortOrder
b4c0: 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  (p, p->pOrderBy)
b4d0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
b4e0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
b4f0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
b500: 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
b510: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
b520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
b540: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
b550: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
b580: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
b590: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
b5a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71  rn 1;.        sq
b5b0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
b5c0: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
b5d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
b5e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
b5f0: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
b600: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
b610: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
b620: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
b630: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b640: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b650: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
b660: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b670: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
b680: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
b690: 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c  teSortTail(p, v,
b6a0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
b6b0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
b6c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b6d0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b6e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b6f0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
b700: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
b710: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
b720: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
b730: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  Start;.      int
b740: 20 6e 4c 69 6d 69 74 2c 20 6e 4f 66 66 73 65 74   nLimit, nOffset
b750: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
b760: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
b770: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
b780: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
b790: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
b7a0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
b7b0: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
b7c0: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
b7d0: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
b7e0: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
b7f0: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
b800: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
b810: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
b820: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
b830: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
b840: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
b850: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
b860: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
b870: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
b880: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
b890: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
b8a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
b8b0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
b8c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
b8d0: 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 31 29  enTemp, tab1, 1)
b8e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b8f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
b900: 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31  yAsData, tab1, 1
b910: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
b920: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
b930: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
b940: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
b950: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
b960: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b970: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
b980: 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f  pPrior, SRT_Unio
b990: 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30  n, tab1, 0, 0, 0
b9a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
b9b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
b9c0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
b9d0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
b9e0: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
b9f0: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
ba00: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
ba10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ba20: 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20  OpenTemp, tab2, 
ba30: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
ba40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ba50: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c  KeyAsData, tab2,
ba60: 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   1);.      p->pP
ba70: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
ba80: 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d  nLimit = p->nLim
ba90: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  it;.      p->nLi
baa0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
bab0: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
bac0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  fset;.      p->n
bad0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
bae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
baf0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53  ect(pParse, p, S
bb00: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20  RT_Union, tab2, 
bb10: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
bb20: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
bb30: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69  or;.      p->nLi
bb40: 6d 69 74 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  mit = nLimit;.  
bb50: 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
bb60: 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   nOffset;.      
bb70: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
bb80: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  rc;..      /* Ge
bb90: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
bba0: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
bbb0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
bbc0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
bbd0: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
bbe0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
bbf0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
bc00: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
bc10: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
bc20: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
bc30: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
bc40: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
bc50: 29 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  );.        gener
bc60: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
bc70: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20  Parse, p->pSrc, 
bc80: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
bc90: 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
bca0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
bcb0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
bcc0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56   iCont = sqliteV
bcd0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
bce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
bcf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
bd00: 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
bd10: 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  k);.      comput
bd20: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
bd30: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
bd40: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
bd50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
bd60: 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20  _FullKey, tab1, 
bd70: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
bd80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bd90: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
bda0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 6d 75  iCont);.      mu
bdb0: 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64  ltiSelectSortOrd
bdc0: 65 72 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  er(p, p->pOrderB
bdd0: 79 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  y);.      rc = s
bde0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
bdf0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
be00: 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
be10: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
be40: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
be50: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
be80: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  reak);.      if(
be90: 20 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   rc ) return 1;.
bea0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
beb0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
bec0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
bed0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
bee0: 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
bef0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73  iStart);.      s
bf00: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
bf10: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
bf20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
bf30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
bf40: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
bf50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
bf60: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
bf70: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
bf80: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
bf90: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  y ){.        gen
bfa0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
bfb0: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
bfc0: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
bfd0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
bfe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bff0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
c000: 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f  >pEList && pPrio
c010: 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69  r->pEList );.  i
c020: 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
c030: 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr!=pPrior->pEL
c040: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
c050: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
c060: 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
c070: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
c080: 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
c090: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
c0a0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
c0b0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
c0c0: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
c0d0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
c0e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
c0f0: 20 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c    /* Issue a nul
c100: 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  l callback if th
c110: 61 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75  at is what the u
c120: 73 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a  ser wants..  */.
c130: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
c140: 5f 43 61 6c 6c 62 61 63 6b 20 26 26 0a 20 20 20  _Callback &&.   
c150: 20 28 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c   (pParse->useCal
c160: 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20 28 70 50 61  lback==0 || (pPa
c170: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
c180: 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c   SQLITE_NullCall
c190: 62 61 63 6b 29 21 3d 30 29 0a 20 20 29 7b 0a 20  back)!=0).  ){. 
c1a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c1b0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c  Op(v, OP_NullCal
c1c0: 6c 62 61 63 6b 2c 20 70 2d 3e 70 45 4c 69 73 74  lback, p->pEList
c1d0: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  ->nExpr, 0);.  }
c1e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c1f0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
c200: 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
c210: 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
c220: 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
c230: 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
c240: 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
c250: 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
c260: 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
c270: 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
c280: 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
c290: 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
c2a0: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
c2b0: 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
c2c0: 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
c2d0: 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
c2e0: 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
c2f0: 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
c300: 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
c310: 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
c320: 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
c330: 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
c340: 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
c350: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
c360: 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
c370: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
c380: 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
c390: 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
c3a0: 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
c3b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
c3c0: 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
c3d0: 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
c3e0: 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
c3f0: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
c400: 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
c410: 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
c420: 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
c430: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
c440: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
c450: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
c460: 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  bstExprList(Expr
c470: 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69  List*,int,ExprLi
c480: 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  st*);  /* Forwar
c490: 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
c4a0: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
c4b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
c4c0: 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
c4d0: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66  t *pEList){.  if
c4e0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
c4f0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
c500: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c510: 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
c520: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 45 78 70  ==iTable && pExp
c530: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
c540: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  .    Expr *pNew;
c550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
c560: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
c570: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
c580: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73  >nExpr );.    as
c590: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
c5a0: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
c5b0: 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78  pRight==0 && pEx
c5c0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
c5d0: 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73      pNew = pELis
c5e0: 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
c5f0: 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
c600: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
c610: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
c620: 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
c630: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
c640: 20 3d 20 70 4e 65 77 2d 3e 64 61 74 61 54 79 70   = pNew->dataTyp
c650: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
c660: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
c670: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  ;.    pExpr->pLe
c680: 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ft = sqliteExprD
c690: 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b  up(pNew->pLeft);
c6a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
c6b0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
c6c0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  .    pExpr->pRig
c6d0: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ht = sqliteExprD
c6e0: 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29  up(pNew->pRight)
c6f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
c700: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
c710: 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73  .    pExpr->pLis
c720: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  t = sqliteExprLi
c730: 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73  stDup(pNew->pLis
c740: 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  t);.    pExpr->i
c750: 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54  Table = pNew->iT
c760: 61 62 6c 65 3b 0a 20 20 20 20 70 45 78 70 72 2d  able;.    pExpr-
c770: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
c780: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 45  >iColumn;.    pE
c790: 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77  xpr->iAgg = pNew
c7a0: 2d 3e 69 41 67 67 3b 0a 20 20 20 20 73 71 6c 69  ->iAgg;.    sqli
c7b0: 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  teTokenCopy(&pEx
c7c0: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
c7d0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 73 71  ->token);.    sq
c7e0: 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70  liteTokenCopy(&p
c7f0: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
c800: 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 65 6c 73  w->span);.  }els
c810: 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
c820: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
c830: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
c840: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
c850: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
c860: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
c870: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
c880: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54  pExpr->pList, iT
c890: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
c8a0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
c8b0: 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73 74 28   .substExprList(
c8c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c8d0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
c8e0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
c8f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c900: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
c910: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c920: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c930: 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
c940: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c950: 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
c960: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
c970: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
c980: 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
c990: 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
c9a0: 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a   order to speed.
c9b0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49  ** execution.  I
c9c0: 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  t returns 1 if i
c9d0: 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
c9e0: 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
c9f0: 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73  tening.** occurs
ca00: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
ca10: 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
ca20: 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
ca30: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
ca40: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
ca50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ca60: 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
ca70: 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
ca80: 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
ca90: 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
caa0: 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
cab0: 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
cac0: 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
cad0: 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
cae0: 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
caf0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
cb00: 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
cb10: 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
cb20: 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
cb30: 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
cb40: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
cb50: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
cb60: 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
cb70: 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
cb80: 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
cb90: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
cba0: 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
cbb0: 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
cbc0: 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
cbd0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
cbe0: 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
cbf0: 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
cc00: 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
cc10: 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
cc20: 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
cc30: 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
cc40: 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
cc50: 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
cc60: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
cc70: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
cc80: 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
cc90: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
cca0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
ccb0: 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
ccc0: 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
ccd0: 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
cce0: 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
ccf0: 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
cd00: 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
cd10: 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
cd20: 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
cd30: 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
cd40: 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
cd50: 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
cd60: 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
cd70: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
cd80: 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
cd90: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
cda0: 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
cdb0: 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
cdc0: 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
cdd0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
cde0: 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
cdf0: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
ce00: 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
ce10: 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
ce20: 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
ce30: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
ce40: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
ce50: 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
ce60: 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
ce70: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
ce80: 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c  left outer join,
ce90: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68   or.**        th
cea0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
ceb0: 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e  t itself a join.
cec0: 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a    (Ticket #306).
ced0: 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
cee0: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
cef0: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
cf00: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
cf10: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
cf20: 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62  *   (5)  The sub
cf30: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
cf40: 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
cf50: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
cf60: 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
cf70: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
cf80: 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
cf90: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
cfa0: 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
cfb0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
cfc0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
cfd0: 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
cfe0: 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
cff0: 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
d000: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
d010: 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
d020: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
d030: 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
d040: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
d050: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
d060: 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
d070: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
d080: 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
d090: 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
d0a0: 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
d0b0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
d0c0: 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
d0d0: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
d0e0: 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
d0f0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d100: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
d110: 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
d120: 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
d130: 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
d140: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
d150: 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
d160: 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
d170: 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20  *.**  (12)  The 
d180: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
d190: 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
d1a0: 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
d1b0: 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  OIN or the.**   
d1c0: 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61       subquery ha
d1d0: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
d1e0: 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69  e.  (added by ti
d1f0: 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a  cket #350).**.**
d200: 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
d210: 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
d220: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
d230: 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
d240: 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
d250: 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
d260: 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
d270: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
d280: 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
d290: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
d2a0: 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
d2b0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
d2c0: 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
d2d0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
d2e0: 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
d2f0: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
d300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d310: 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
d320: 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
d330: 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
d340: 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
d350: 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
d360: 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
d370: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
d380: 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
d390: 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
d3a0: 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
d3b0: 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
d3c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
d3d0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
d3e0: 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
d3f0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
d400: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
d410: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
d420: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
d430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d440: 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
d450: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
d460: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
d470: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
d480: 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
d490: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
d4a0: 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
d4b0: 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
d4c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
d4d0: 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
d4e0: 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
d4f0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
d500: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
d510: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
d520: 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
d530: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
d540: 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
d550: 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
d560: 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
d570: 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
d580: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
d590: 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
d5a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
d5b0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
d5c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
d5d0: 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
d5e0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
d5f0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
d600: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
d610: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
d620: 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
d630: 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
d640: 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
d650: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
d660: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
d670: 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
d680: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
d690: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 57 68  t i;.  Expr *pWh
d6a0: 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ere;..  /* Check
d6b0: 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
d6c0: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
d6d0: 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
d6e0: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
d6f0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
d700: 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
d710: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
d720: 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
d730: 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
d740: 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20 70  rc );.  pSub = p
d750: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53  Src->a[iFrom].pS
d760: 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
d770: 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
d780: 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
d790: 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
d7a0: 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75  n 0;.  if( subqu
d7b0: 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
d7c0: 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
d7d0: 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d  n 0;.  pSubSrc =
d7e0: 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
d7f0: 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
d800: 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
d810: 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
d820: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
d830: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
d840: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  pSub->nLimit>=0)
d850: 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63   &&  (pSrc->nSrc
d860: 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
d870: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d880: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44   }.  if( (p->isD
d890: 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c  istinct || p->nL
d8a0: 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71  imit>=0) && subq
d8b0: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
d8c0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
d8d0: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
d8e0: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
d8f0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
d900: 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
d910: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
d920: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
d930: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
d940: 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
d950: 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
d960: 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
d970: 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
d980: 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
d990: 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
d9a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
d9b0: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
d9c0: 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
d9d0: 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
d9e0: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
d9f0: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
da00: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
da10: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
da20: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
da30: 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
da40: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
da50: 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
da60: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
da70: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
da80: 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
da90: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
daa0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
dab0: 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
dac0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
dad0: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
dae0: 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
daf0: 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
db00: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
db10: 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
db20: 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
db30: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
db40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
db50: 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
db60: 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
db70: 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
db80: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
db90: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
dba0: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
dbb0: 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
dbc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
dbd0: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
dbe0: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
dbf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
dc00: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
dc10: 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
dc20: 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
dc30: 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
dc40: 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
dc50: 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
dc60: 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
dc70: 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
dc80: 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
dc90: 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
dca0: 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
dcb0: 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
dcc0: 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
dcd0: 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
dce0: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
dcf0: 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
dd00: 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
dd10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
dd20: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
dd30: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
dd40: 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
dd50: 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
dd60: 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
dd70: 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
dd80: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
dd90: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
dda0: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
ddb0: 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
ddc0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
ddd0: 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
dde0: 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
ddf0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
de00: 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
de10: 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
de20: 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
de30: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
de40: 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
de50: 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
de60: 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
de70: 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
de80: 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
de90: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
dea0: 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
deb0: 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
dec0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
ded0: 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
dee0: 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
def0: 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
df00: 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
df10: 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
df20: 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
df30: 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
df40: 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
df50: 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
df60: 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
df70: 61 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  arent = pSrc->a[
df80: 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
df90: 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62    {.    int nSub
dfa0: 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
dfb0: 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
dfc0: 6e 74 79 70 65 20 3d 20 70 53 72 63 2d 3e 61 5b  ntype = pSrc->a[
dfd0: 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 3b  iFrom].jointype;
dfe0: 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  ..    if( pSrc->
dff0: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26  a[iFrom].pTab &&
e000: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
e010: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
e020: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e030: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  eDeleteTable(0, 
e040: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
e050: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
e060: 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d  sqliteFree(pSrc-
e070: 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44 61 74 61 62  >a[iFrom].zDatab
e080: 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
e090: 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69 46 72  Free(pSrc->a[iFr
e0a0: 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  om].zName);.    
e0b0: 73 71 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d  sqliteFree(pSrc-
e0c0: 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73  >a[iFrom].zAlias
e0d0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  );.    if( nSubS
e0e0: 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  rc>1 ){.      in
e0f0: 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72  t extra = nSubSr
e100: 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  c - 1;.      for
e110: 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=1; i<nSubSrc;
e120: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
e130: 53 72 63 20 3d 20 73 71 6c 69 74 65 53 72 63 4c  Src = sqliteSrcL
e140: 69 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20  istAppend(pSrc, 
e150: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
e160: 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70       p->pSrc = p
e170: 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
e180: 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
e190: 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69  -extra>=iFrom; i
e1a0: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  --){.        pSr
e1b0: 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e  c->a[i] = pSrc->
e1c0: 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20  a[i-extra];.    
e1d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
e1e0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
e1f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53  ; i++){.      pS
e200: 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
e210: 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
e220: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
e230: 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
e240: 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
e250: 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
e260: 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b    pSrc->a[iFrom+
e270: 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74  nSubSrc-1].joint
e280: 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
e290: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65    }..  /* Now be
e2a0: 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
e2b0: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
e2c0: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
e2d0: 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72   for .  ** refer
e2e0: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
e2f0: 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
e300: 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20  r query..  ** . 
e310: 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
e320: 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20  *.  **   SELECT 
e330: 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
e340: 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
e350: 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
e360: 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
e370: 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
e380: 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
e390: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
e3a0: 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
e3b0: 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20           /.  ** 
e3c0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
e3d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
e3e0: 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
e3f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
e400: 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ____/.  **.  ** 
e410: 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
e420: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
e430: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
e440: 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
e450: 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77  e see.  ** "a" w
e460: 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
e470: 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
e480: 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
e490: 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
e4a0: 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74  0"..  */.  subst
e4b0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
e4c0: 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
e4d0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c  b->pEList);.  pL
e4e0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
e4f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
e500: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
e510: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
e520: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  r;.    if( pList
e530: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
e540: 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  && (pExpr = pLis
e550: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e  t->a[i].pExpr)->
e560: 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  span.z!=0 ){.   
e570: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a     pList->a[i].z
e580: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
e590: 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e  NDup(pExpr->span
e5a0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
e5b0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
e5c0: 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
e5d0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
e5e0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
e5f0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
e600: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
e610: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
e620: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
e630: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
e640: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
e650: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e660: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
e670: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
e680: 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
e690: 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
e6a0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
e6b0: 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
e6c0: 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
e6d0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
e6e0: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
e6f0: 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
e700: 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
e710: 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
e720: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
e730: 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a  (pSub->pWhere);.
e740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68    }else{.    pWh
e750: 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ere = 0;.  }.  i
e760: 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
e770: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e780: 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  p->pHaving==0 );
e790: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
e7a0: 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
e7b0: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
e7c0: 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ere;.    substEx
e7d0: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
e7e0: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e7f0: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
e800: 53 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  Sub->pHaving ){.
e810: 20 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76        Expr *pHav
e820: 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ing = sqliteExpr
e830: 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e  Dup(pSub->pHavin
e840: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  g);.      if( p-
e850: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
e860: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
e870: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
e880: 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ND, p->pHaving, 
e890: 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20  pHaving, 0);.   
e8a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e8b0: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
e8c0: 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a  Having;.      }.
e8d0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
e8e0: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
e8f0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
e900: 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72  pBy = sqliteExpr
e910: 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47  ListDup(pSub->pG
e920: 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65  roupBy);.  }else
e930: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
e940: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65  0 ){.    p->pWhe
e950: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d  re = pWhere;.  }
e960: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
e970: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
e980: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
e990: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
e9a0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
e9b0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
e9c0: 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  eExpr(TK_AND, p-
e9d0: 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c  >pWhere, pWhere,
e9e0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
e9f0: 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
ea00: 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
ea10: 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
ea20: 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
ea30: 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
ea40: 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
ea50: 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
ea60: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
ea70: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
ea80: 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54  istinct;..  /* T
ea90: 72 61 6e 73 66 65 72 20 74 68 65 20 6c 69 6d 69  ransfer the limi
eaa0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  t expression fro
eab0: 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  m the subquery t
eac0: 6f 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a  o the outer.  **
ead0: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69   query..  */.  i
eae0: 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e  f( pSub->nLimit>
eaf0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
eb00: 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20  >nLimit<0 ){.   
eb10: 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70     p->nLimit = p
eb20: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20  Sub->nLimit;.   
eb30: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c   }else if( p->nL
eb40: 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20  imit+p->nOffset 
eb50: 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70  > pSub->nLimit+p
eb60: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a  Sub->nOffset ){.
eb70: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
eb80: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b  = pSub->nLimit +
eb90: 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d   pSub->nOffset -
eba0: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20   p->nOffset;.   
ebb0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66   }.  }.  p->nOff
ebc0: 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66  set += pSub->nOf
ebd0: 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69  fset;..  /* Fini
ebe0: 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
ebf0: 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
ec00: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
ec10: 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
ec20: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
ec30: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
ec40: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
ec50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
ec60: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
ec70: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
ec80: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
ec90: 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
eca0: 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
ecb0: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
ecc0: 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
ecd0: 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
ece0: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
ecf0: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
ed00: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
ed10: 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
ed20: 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
ed30: 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
ed40: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
ed50: 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20   and return 1.  
ed60: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
ed70: 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
ed80: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
ed90: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
eda0: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
edb0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
edc0: 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
edd0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
ede0: 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
edf0: 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
ee00: 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
ee10: 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
ee20: 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
ee30: 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
ee40: 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
ee50: 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
ee60: 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
ee70: 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
ee80: 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
ee90: 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
eea0: 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
eeb0: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
eec0: 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
eed0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
eee0: 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
eef0: 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
ef00: 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
ef10: 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
ef20: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
ef30: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
ef40: 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
ef50: 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
ef60: 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53  teSelect()..** S
ef70: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
ef80: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
ef90: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
efa0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
efb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
efc0: 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
efd0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
efe0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
eff0: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
f000: 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  ){.  Expr *pExpr
f010: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
f020: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
f030: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
f040: 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a  t base;.  Vdbe *
f050: 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b  v;.  int seekOp;
f060: 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45  .  int cont;.  E
f070: 78 70 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20  xprList eList;. 
f080: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
f090: 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
f0a0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
f0b0: 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72  see if this quer
f0c0: 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  y is a simple mi
f0d0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
f0e0: 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a  ry.  Return.  **
f0f0: 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20   zero if it is  
f100: 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
f110: 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70  p->pGroupBy || p
f120: 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e  ->pHaving || p->
f130: 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
f140: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  0;.  if( p->pSrc
f150: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
f160: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
f170: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
f180: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
f190: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
f1a0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
f1b0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
f1c0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
f1d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f1e0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
f1f0: 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  || pExpr->pList-
f200: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
f210: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
f220: 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
f230: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f240: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
f250: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
f260: 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
f270: 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77   seekOp = OP_Rew
f280: 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ind;.  }else if(
f290: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
f2a0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
f2b0: 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
f2c0: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61    seekOp = OP_La
f2d0: 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
f2e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f2f0: 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
f300: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
f310: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
f320: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
f330: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
f340: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
f350: 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  n;.  pTab = p->p
f360: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
f370: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
f380: 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e  to here, it mean
f390: 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  s the query is o
f3a0: 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f  f the correct fo
f3b0: 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74  rm..  ** Check t
f3c0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68  o make sure we h
f3d0: 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ave an index and
f3e0: 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74   make pIdx point
f3f0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70   to the.  ** app
f400: 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20  ropriate index. 
f410: 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   If the min() or
f420: 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20   max() is on an 
f430: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a  INTEGER PRIMARY.
f440: 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c    ** key column,
f450: 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63   no index is nec
f460: 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49  essary so set pI
f470: 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20  dx to NULL.  If 
f480: 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69  no.  ** usable i
f490: 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72  ndex is found, r
f4a0: 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
f4b0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
f4c0: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65    pIdx = 0;.  }e
f4d0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64  lse{.    for(pId
f4e0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
f4f0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
f500: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
f510: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
f520: 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20  lumn>=1 );.     
f530: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
f540: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62  umn[0]==iCol ) b
f550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f560: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65  if( pIdx==0 ) re
f570: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
f580: 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
f590: 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
f5a0: 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20  ll be using the 
f5b0: 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
f5c0: 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
f5d0: 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
f5e0: 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
f5f0: 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
f600: 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68  ry cell..  ** Th
f610: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68  e column names h
f620: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
f630: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
f640: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
f650: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  on..  */.  v = s
f660: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
f670: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
f680: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f690: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
f6a0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
f6b0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
f6c0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
f6d0: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  c, p->pEList);. 
f6e0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
f6f0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
f700: 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
f710: 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
f720: 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
f730: 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
f740: 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
f750: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
f760: 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
f770: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
f780: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
f790: 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
f7a0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
f7b0: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
f7c0: 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
f7d0: 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
f7e0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ble..  */.  sqli
f7f0: 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  teCodeVerifySche
f800: 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ma(pParse, pTab-
f810: 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20  >iDb);.  base = 
f820: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
f830: 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65  ursor;.  compute
f840: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
f850: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 73 71 6c  Parse, p);.  sql
f860: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f870: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
f880: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  ->iDb, 0);.  sql
f890: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f8a0: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
f8b0: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  e, pTab->tnum);.
f8c0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
f8d0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
f8e0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
f8f0: 49 43 29 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71  IC);.  cont = sq
f900: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
f910: 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78  l(v);.  if( pIdx
f920: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
f930: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65  eVdbeAddOp(v, se
f940: 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a  ekOp, base, 0);.
f950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
f960: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f970: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
f980: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
f990: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f9a0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62  , OP_OpenRead, b
f9b0: 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75  ase+1, pIdx->tnu
f9c0: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  m);.    sqliteVd
f9d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
f9e0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
f9f0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
fa00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fa10: 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31  , seekOp, base+1
fa20: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fa30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fa40: 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31  IdxRecno, base+1
fa50: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
fa60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fa70: 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30  Close, base+1, 0
fa80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
fa90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
faa0: 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eTo, base, 0);. 
fab0: 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
fac0: 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
fad0: 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
fae0: 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
faf0: 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
fb00: 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
fb10: 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
fb20: 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
fb30: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
fb40: 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
fb50: 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
fb60: 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74  Parm, cont, cont
fb70: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52  );.  sqliteVdbeR
fb80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63  esolveLabel(v, c
fb90: 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  ont);.  sqliteVd
fba0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
fbb0: 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  ose, base, 0);. 
fbc0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
fbd0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
fbe0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
fbf0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fc00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
fc10: 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
fc20: 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
fc30: 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
fc40: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
fc50: 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d   eDest and iParm
fc60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73  ..**.**     eDes
fc70: 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65  t Value       Re
fc80: 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcc0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
fcd0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
fce0: 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
fcf0: 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
fd00: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
fd10: 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
fd20: 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
fd30: 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
fd40: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d  emory cell iParm
fd50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
fd60: 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  et         Store
fd70: 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
fd80: 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68   of a table with
fd90: 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a   cursor iParm.**
fda0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
fdb0: 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
fdc0: 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
fdd0: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
fde0: 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
fdf0: 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
fe00: 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
fe10: 74 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70  ts form the temp
fe20: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
fe30: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
fe40: 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
fe50: 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
fe60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
fe70: 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  arm.**.** The ta
fe80: 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63  ble above is inc
fe90: 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69  omplete.  Additi
fea0: 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65  onal eDist value
feb0: 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a   have be added.*
fec0: 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d  * since this com
fed0: 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e  ment was written
fee0: 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  .  See the selec
fef0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
ff00: 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63  ction for.** a c
ff10: 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20  omplete listing 
ff20: 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76  of the allowed v
ff30: 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
ff40: 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
ff50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
ff60: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
ff70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
ff80: 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
ff90: 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
ffa0: 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
ffb0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
ffc0: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
ffd0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
ffe0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
fff0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
10000 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
10010 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
10020 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
10030 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
10040 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
10050 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
10060 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
10070 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
10080 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
10090 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
100a0 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
100b0 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
100c0 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
100d0 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
100e0 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
100f0 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
10100 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
10110 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
10120 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
10130 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
10140 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
10150 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
10160 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
10170 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
10180 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
10190 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
101a0 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
101b0 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
101c0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
101d0 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
101e0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
101f0 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
10200 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
10210 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
10220 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
10230 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
10240 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
10250 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
10260 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
10270 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
10280 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
10290 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
102d0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
102e0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
102f0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
10300 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
10310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10320 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
10330 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
10340 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
10350 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
10360 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
10370 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
10380 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
10390 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
103a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
103b0 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
103c0 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
103d0 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
103e0 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
103f0 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
10400 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
10410 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
10420 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
10430 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
10440 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
10450 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
10460 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
10470 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
10480 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
10490 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
104a0 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
104b0 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20 20 50  qliteSelect(.  P
104c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
104d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
104e0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
104f0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
10510 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10520 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
10530 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
10540 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10550 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
10560 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
10570 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
10580 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d        /* A param
10590 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65  eter used by the
105a0 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20   eDest disposal 
105b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65  method */.  Sele
105c0 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
105d0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
105e0 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
105f0 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
10600 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
10610 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
10620 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
10630 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
10640 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10650 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20 20 20  *pParentAgg     
10660 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
10670 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
10680 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
10690 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
106a0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
106b0 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  o;.  Vdbe *v;.  
106c0 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20  int isAgg = 0;  
106d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
106e0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
106f0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
10700 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10710 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
10720 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
10730 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
10740 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
10750 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
10760 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
10770 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
10780 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
10790 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
107a0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
107b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
107c0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
107d0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
107e0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
107f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
10800 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
10810 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
10820 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
10830 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
10840 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
10850 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
10860 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
10870 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
10880 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
10890 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
108a0 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
108b0 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
108c0 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
108d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
108e0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
108f0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
10900 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
10910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
10920 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
10930 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
10940 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
10950 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
10960 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10970 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  || p==0 ) return
10980 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
10990 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
109a0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
109b0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
109c0 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rn 1;..  /* If t
109d0 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
109e0 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
109f0 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
10a00 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
10a10 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
10a20 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
10a30 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
10a40 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
10a50 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Parm);.  }..  /*
10a60 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
10a70 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
10a80 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
10a90 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
10aa0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
10ab0 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
10ac0 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79  here;.  pOrderBy
10ad0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
10ae0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
10af0 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
10b00 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
10b10 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d  ;.  isDistinct =
10b20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
10b30 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 56  .  /* Allocate V
10b40 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f 72 20  DBE cursors for 
10b50 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
10b60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
10b70 2a 2f 0a 20 20 73 71 6c 69 74 65 53 72 63 4c 69  */.  sqliteSrcLi
10b80 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
10b90 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
10ba0 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  );..  /* .  ** D
10bb0 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
10bc0 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
10bd0 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
10be0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
10bf0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
10c00 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
10c10 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
10c20 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
10c30 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
10c40 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e  end;..  /* Expan
10c50 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20  d any "*" terms 
10c60 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
10c70 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65  t.  (For example
10c80 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a   the "*" in.  **
10c90 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
10ca0 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e  t1")  The fillIn
10cb0 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75  Columnlist() rou
10cc0 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73  tine also does s
10cd0 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  ome.  ** other h
10ce0 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65  ousekeeping - se
10cf0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
10d00 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73  ment for details
10d10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c  ..  */.  if( fil
10d20 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
10d30 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
10d40 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
10d50 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20  .  }.  pWhere = 
10d60 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c  p->pWhere;.  pEL
10d70 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
10d80 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
10d90 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
10da0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
10db0 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
10dc0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
10dd0 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
10de0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
10df0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
10e00 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
10e10 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
10e20 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
10e30 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
10e40 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
10e50 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
10e60 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
10e70 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
10e80 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
10e90 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
10ea0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
10eb0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
10ec0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
10ed0 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
10ee0 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
10ef0 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
10f00 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
10f10 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
10f20 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
10f30 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
10f40 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
10f50 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  :.      pOrderBy
10f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
10f70 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
10f80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
10f90 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
10fa0 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
10fb0 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
10fc0 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
10fd0 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
10fe0 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
10ff0 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
11000 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
11010 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
11020 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
11030 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
11040 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
11050 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
11060 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
11070 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
11080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11090 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
110a0 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
110b0 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74  bList, 0, pEList
110c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
110d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
110e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
110f0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11100 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
11110 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11120 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a  , 1, &isAgg) ){.
11130 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11140 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
11150 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b  .  if( pWhere ){
11160 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
11170 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
11180 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
11190 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65 29 20  pEList, pWhere) 
111a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
111b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
111c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
111d0 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
111e0 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b  pWhere, 0, 0) ){
111f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
11200 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
11210 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20  }.  if( pHaving 
11220 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  ){.    if( pGrou
11230 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
11240 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
11250 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
11260 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
11270 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
11280 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  ING");.      got
11290 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
112a0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
112b0 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
112c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
112d0 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69  t, pEList, pHavi
112e0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
112f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11300 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
11310 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
11320 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c 20  se, pHaving, 1, 
11330 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20  &isAgg) ){.     
11340 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11350 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11360 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
11370 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
11380 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
11390 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
113a0 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ol;.      Expr *
113b0 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
113c0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
113d0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
113e0 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
113f0 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26  ol) && iCol>0 &&
11400 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
11410 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
11420 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
11430 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
11440 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
11450 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
11460 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
11470 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
11480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11490 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
114a0 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
114b0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
114c0 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
114d0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
114e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
114f0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
11500 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
11510 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
11520 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
11530 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
11540 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11550 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
11560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
11570 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
11580 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
11590 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
115a0 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
115b0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
115c0 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
115d0 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  rms must not be 
115e0 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73  non-integer cons
115f0 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  tants");.       
11600 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11610 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
11620 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
11630 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
11640 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
11650 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
11660 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
11670 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
11680 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
11690 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
116a0 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
116b0 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
116c0 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f  n 1 and %d", iCo
116d0 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
116e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
116f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11720 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
11730 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
11740 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
11750 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11760 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
11770 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
11780 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
11790 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  f( sqliteExprIsI
117a0 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
117b0 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69  ) && iCol>0 && i
117c0 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
117d0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
117e0 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
117f0 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  E);.        pE =
11800 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
11810 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78  pExpr = sqliteEx
11820 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
11830 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
11840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11850 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
11860 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11870 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11880 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
11890 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
118a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
118b0 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
118c0 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
118d0 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
118e0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
118f0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11900 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11910 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
11920 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11930 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
11940 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
11950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11960 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
11970 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
11980 20 22 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73   "GROUP BY terms
11990 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
119a0 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
119b0 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ts");.          
119c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
119d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
119e0 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
119f0 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
11a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11a10 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
11a20 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
11a30 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f 6c 75    "GROUP BY colu
11a40 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74  mn number %d out
11a50 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
11a60 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
11a70 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
11a80 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70  and %d", iCol, p
11a90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
11aa0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
11ab0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11ac0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11ad0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  }.  }..  /* Begi
11ae0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
11af0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
11b00 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
11b10 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
11b20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
11b30 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d;..  /* Identif
11b40 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
11b50 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
11b60 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c  ng them in a cal
11b70 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
11b80 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
11b90 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
11ba0 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65  is going to some
11bb0 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69   other destinati
11bc0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  on..  */.  if( e
11bd0 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
11be0 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
11bf0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
11c00 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
11c10 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
11c20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
11c30 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
11c40 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
11c50 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74  ) function by it
11c60 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65  self.  ** in the
11c70 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
11c80 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69  /.  if( simpleMi
11c90 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
11ca0 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
11cb0 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  m) ){.    rc = 0
11cc0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
11cd0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
11ce0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
11cf0 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
11d00 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
11d10 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  lause.  */.  for
11d20 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
11d30 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
11d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
11d50 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
11d60 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73  .    int needRes
11d70 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  toreContext;..  
11d80 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
11d90 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[i].pSelect==0 
11da0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11db0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
11dc0 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  i].zName!=0 ){. 
11dd0 20 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43       zSavedAuthC
11de0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
11df0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
11e00 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
11e10 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62  thContext = pTab
11e20 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
11e30 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74  ;.      needRest
11e40 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a  oreContext = 1;.
11e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11e60 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
11e70 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
11e80 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
11e90 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11ea0 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
11eb0 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a  SRT_TempTable, .
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
11ee0 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
11ef0 69 73 41 67 67 29 3b 0a 20 20 20 20 69 66 28 20  isAgg);.    if( 
11f00 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
11f10 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  xt ){.      pPar
11f20 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
11f30 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
11f40 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  text;.    }.    
11f50 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
11f60 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
11f70 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
11f80 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 55  if( eDest!=SRT_U
11f90 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d 53  nion && eDest!=S
11fa0 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44 65  RT_Except && eDe
11fb0 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st!=SRT_Discard 
11fc0 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
11fd0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
11fe0 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
11ff0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
12000 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
12010 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
12020 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
12030 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
12040 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
12050 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
12060 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63   subquery that c
12070 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64  an be "flattened
12080 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  " into its paren
12090 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74  t..  ** If flatt
120a0 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69  ening is a possi
120b0 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64  blity, do so and
120c0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
120d0 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ely.  .  */.  if
120e0 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
120f0 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
12100 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
12110 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
12120 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50  , parentTab, *pP
12130 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29  arentAgg, isAgg)
12140 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
12150 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20  g ) *pParentAgg 
12160 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
12170 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
12180 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
12190 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
121a0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
121b0 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 64  se, p);..  /* Id
121c0 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79  entify column ty
121d0 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  pes if we will b
121e0 65 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 62 61  e using a callba
121f0 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
12200 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
12210 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
12220 67 6f 69 6e 67 20 74 6f 20 61 20 64 65 73 74 69  going to a desti
12230 6e 61 74 69 6f 6e 20 6f 74 68 65 72 0a 20 20 2a  nation other.  *
12240 2a 20 74 68 61 6e 20 61 20 63 61 6c 6c 62 61 63  * than a callbac
12250 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  k..  **.  ** We 
12260 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
12270 73 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d 20  separately from 
12280 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
12290 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
122a0 2a 20 61 62 6f 76 65 20 62 65 63 61 75 73 65 20  * above because 
122b0 69 66 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  if the pTabList 
122c0 63 6f 6e 74 61 69 6e 73 20 76 69 65 77 73 20 74  contains views t
122d0 68 65 6e 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f  hen they will no
122e0 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
122f0 20 72 65 73 6f 6c 76 65 64 20 61 6e 64 20 77 65   resolved and we
12300 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
12310 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  he column types 
12320 75 6e 74 69 6c 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  until.  ** now..
12330 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
12340 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
12350 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
12360 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
12370 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
12380 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  st);.  }..  /* I
12390 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
123a0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
123b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
123c0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
123d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
123e0 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
123f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
12400 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
12410 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
12420 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20  );.  }..  /* Do 
12430 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61  an analysis of a
12440 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
12450 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ions..  */.  sql
12460 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
12470 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20  Reset(pParse);. 
12480 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47   if( isAgg || pG
12490 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73  roupBy ){.    as
124a0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41  sert( pParse->nA
124b0 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41  gg==0 );.    isA
124c0 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  gg = 1;.    for(
124d0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
124e0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
124f0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
12500 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
12510 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
12520 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
12530 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
12540 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12550 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12560 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
12570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
12580 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
12590 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
125a0 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
125b0 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
125c0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
125d0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
125e0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
125f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
12600 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12610 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
12620 26 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  && sqliteExprAna
12630 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
12640 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20  Parse, pHaving) 
12650 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
12660 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
12670 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
12680 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
12690 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
126a0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
126b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
126c0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
126d0 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64  tes(pParse, pOrd
126e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
126f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
12700 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12720 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
12730 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
12740 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66  egator.  */.  if
12750 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
12760 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12770 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30  , OP_AggReset, 0
12780 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b  , pParse->nAgg);
12790 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
127a0 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
127b0 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  +){.      FuncDe
127c0 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  f *pFunc;.      
127d0 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61  if( (pFunc = pPa
127e0 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
127f0 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d  nc)!=0 && pFunc-
12800 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
12810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12820 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
12830 67 67 49 6e 69 74 2c 20 30 2c 20 69 29 3b 0a 20  ggInit, 0, i);. 
12840 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
12850 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
12860 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50   (char*)pFunc, P
12870 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
12880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12890 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
128a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
128b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
128c0 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
128d0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
128e0 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
128f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
12900 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
12910 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
12920 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
12930 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
12940 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
12950 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12960 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
12970 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
12980 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
12990 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
129a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
129b0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
129c0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
129d0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
129e0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
129f0 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74  inct ){.    dist
12a00 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
12a10 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
12a20 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12a30 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69  _OpenTemp, disti
12a40 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  nct, 1);.  }else
12a50 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
12a60 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42   -1;.  }..  /* B
12a70 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
12a80 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57  e scan.  */.  pW
12a90 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65  Info = sqliteWhe
12aa0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
12ab0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
12ac0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a    pGroupBy ? 0 :
12af0 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69   &pOrderBy);.  i
12b00 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
12b10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12b20 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74  .  /* Use the st
12b30 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
12b40 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  p if we are not 
12b50 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a  dealing with.  *
12b60 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a  * aggregates.  *
12b70 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29  /.  if( !isAgg )
12b80 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  {.    if( select
12b90 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
12ba0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
12bb0 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
12bc0 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20  tinct, eDest,.  
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d    iParm, pWInfo-
12bf0 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
12c00 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20  fo->iBreak) ){. 
12c10 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
12c20 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
12c30 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
12c40 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67   dealing with ag
12c50 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64  gregates, then d
12c60 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67  o the special ag
12c70 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f  gregate.  ** pro
12c80 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a  cessing.  .  */.
12c90 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20    else{.    if( 
12ca0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
12cb0 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20    int lbl1;.    
12cc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
12cd0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
12ce0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
12cf0 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
12d00 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
12d10 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
12d20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
12d30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
12d40 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79 2d  keKey, pGroupBy-
12d50 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >nExpr, 0);.    
12d60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
12d70 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
12d80 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54   ) sqliteAddKeyT
12d90 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42 79 29  ype(v, pGroupBy)
12da0 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73  ;.      lbl1 = s
12db0 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
12dc0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
12dd0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12de0 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
12df0 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72  lbl1);.      for
12e00 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
12e10 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
12e20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
12e30 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20  aAgg[i].isAgg ) 
12e40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12e50 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
12e60 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d  (pParse, pParse-
12e70 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b  >aAgg[i].pExpr);
12e80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12e90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
12ea0 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20  ggSet, 0, i);.  
12eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12ec0 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
12ed0 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  el(v, lbl1);.   
12ee0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
12ef0 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
12f00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
12f10 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20   *pE;.      int 
12f20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  j;.      if( !pP
12f30 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
12f40 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
12f50 20 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73        pE = pPars
12f60 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
12f70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12f80 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pE->op==TK_AGG_F
12f90 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
12fa0 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20 29   if( pE->pList )
12fb0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
12fc0 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d 3e  0; j<pE->pList->
12fd0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
12fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
12ff0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
13000 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  ->pList->a[j].pE
13010 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
13020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13030 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
13040 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
13050 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
13060 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13070 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d 3e  AggFunc, 0, pE->
13080 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69 73  pList ? pE->pLis
13090 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
130a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
130b0 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
130c0 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nc!=0 );.      a
130d0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
130e0 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78 53  Agg[i].pFunc->xS
130f0 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tep!=0 );.      
13100 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
13110 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P3(v, -1, (char*
13120 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d  )pParse->aAgg[i]
13130 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54  .pFunc, P3_POINT
13140 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ER);.    }.  }..
13150 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
13160 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
13170 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68  .  */.  sqliteWh
13180 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
13190 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
131a0 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
131b0 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74  gates, we need t
131c0 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e  o set up a secon
131d0 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72  d loop.  ** over
131e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72   all of the aggr
131f0 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64  egate values and
13200 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20   process them.. 
13210 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
13220 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67  ){.    int endag
13230 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  g = sqliteVdbeMa
13240 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
13250 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20  int startagg;.  
13260 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c    startagg = sql
13270 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
13280 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65  OP_AggNext, 0, e
13290 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72  ndagg);.    pPar
132a0 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a  se->useAgg = 1;.
132b0 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
132c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
132d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
132e0 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72  e, pHaving, star
132f0 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  tagg, 1);.    }.
13300 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
13310 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
13320 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
13330 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
13340 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c  iParm, startagg,
13370 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20 20   endagg) ){.    
13380 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
13390 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  d;.    }.    sql
133a0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
133b0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72  OP_Goto, 0, star
133c0 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  tagg);.    sqlit
133d0 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
133e0 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20  l(v, endagg);.  
133f0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
13400 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  p(v, OP_Noop, 0,
13410 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
13420 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d  >useAgg = 0;.  }
13430 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
13440 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
13450 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
13460 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
13470 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
13480 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
13490 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
134a0 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
134b0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
134c0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
134d0 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  il(p, v, pEList-
134e0 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
134f0 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  Parm);.  }...  /
13500 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20 63  * Issue a null c
13510 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74 20  allback if that 
13520 69 73 20 77 68 61 74 20 74 68 65 20 75 73 65 72  is what the user
13530 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 69   wants..  */.  i
13540 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
13550 6c 6c 62 61 63 6b 20 26 26 0a 20 20 20 20 28 70  llback &&.    (p
13560 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61  Parse->useCallba
13570 63 6b 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ck==0 || (pParse
13580 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13590 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  LITE_NullCallbac
135a0 6b 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  k)!=0).  ){.    
135b0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
135c0 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61  v, OP_NullCallba
135d0 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ck, pEList->nExp
135e0 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r, 0);.  }..  /*
135f0 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
13600 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
13610 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
13620 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
13630 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
13640 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
13650 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
13660 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
13670 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
13680 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
13690 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
136a0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
136b0 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
136c0 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
136d0 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41  t_end:.  sqliteA
136e0 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
136f0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
13700 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.