/ Hex Artifact Content
Login

Artifact f504cc542229f472b3f15cefe5d6782494ee8d92:


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 30 37  select.c,v 1.107
0200: 20 32 30 30 32 2f 30 38 2f 30 34 20 30 30 3a 35   2002/08/04 00:5
0210: 32 3a 33 38 20 64 72 68 20 45 78 70 20 24 0a 2a  2:38 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 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0240: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0250: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0260: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0270: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
0280: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
0290: 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65  lect *sqliteSele
02a0: 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73  ctNew(.  ExprLis
02b0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
02c0: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
02d0: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
02e0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
02f0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0300: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0310: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0320: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0330: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0340: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0350: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0360: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0370: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0380: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0390: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
03a0: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
03b0: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
03c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
03d0: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
03e0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
03f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  e */.  int isDis
0400: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  tinct,       /* 
0410: 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
0420: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0430: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
0440: 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20   nLimit,        
0450: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75     /* LIMIT valu
0460: 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74  e.  -1 means not
0470: 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   used */.  int n
0480: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
0490: 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65   /* OFFSET value
04a0: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20  .  -1 means not 
04b0: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
04c0: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  ect *pNew;.  pNe
04d0: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
04e0: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
04f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
0500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78   ){.    sqliteEx
0510: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
0520: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
0530: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 53  SrcListDelete(pS
0540: 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  rc);.    sqliteE
0550: 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72 65  xprDelete(pWhere
0560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
0570: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f  rListDelete(pGro
0580: 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
0590: 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61 76  eExprDelete(pHav
05a0: 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
05b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
05c0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73  OrderBy);.  }els
05d0: 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c  e{.    pNew->pEL
05e0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
05f0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70    pNew->pSrc = p
0600: 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  Src;.    pNew->p
0610: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
0620: 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70      pNew->pGroup
0630: 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
0640: 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67     pNew->pHaving
0650: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20   = pHaving;.    
0660: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
0670: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
0680: 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  New->isDistinct 
0690: 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  = isDistinct;.  
06a0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
06b0: 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77  SELECT;.    pNew
06c0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69  ->nLimit = nLimi
06d0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 66  t;.    pNew->nOf
06e0: 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a  fset = nOffset;.
06f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0700: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  w;.}../*.** Give
0710: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
0720: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
0730: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0740: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0750: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0760: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0770: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0780: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0790: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
07a0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
07b0: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
07c0: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
07d0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  R.**     JT_OUTE
07e0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
07f0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0800: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0810: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0820: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0830: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0840: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0850: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0860: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0870: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0880: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0890: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
08a0: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
08b0: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
08c0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
08d0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
08e0: 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 50  sqliteJoinType(P
08f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0900: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0910: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0920: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0930: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0940: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0950: 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  p;.  static stru
0960: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0970: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0980: 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20     int nChar;.  
0990: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d 20    int code;.  } 
09a0: 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20  keywords[] = {. 
09b0: 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20     { "natural", 
09c0: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c  7, JT_NATURAL },
09d0: 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20  .    { "left",  
09e0: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
09f0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0a00: 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f  right",   5, JT_
0a10: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0a20: 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20  ,.    { "full", 
0a30: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0a40: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0a50: 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22  },.    { "outer"
0a60: 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  ,   5, JT_OUTER 
0a70: 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22  },.    { "inner"
0a80: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0a90: 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22  },.    { "cross"
0aa0: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0ab0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0ac0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0ad0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0ae0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0af0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0b00: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0b10: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0b20: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0b30: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0b40: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0b50: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0b60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0b70: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0b80: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0b90: 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e     && sqliteStrN
0ba0: 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f  ICmp(p->z, keywo
0bb0: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
0bc0: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
0bd0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0be0: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
0bf0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
0c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0c10: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
0c20: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0c30: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
0c40: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
0c50: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
0c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0c70: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
0c80: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
0c90: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
0ca0: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
0cb0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
0cc0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
0cd0: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
0ce0: 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64 75   static Token du
0cf0: 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  mmy = { 0, 0 };.
0d00: 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20 3d      char *zSp1 =
0d10: 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22 20   " ", *zSp2 = " 
0d20: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0d30: 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79 3b   ){ pB = &dummy;
0d40: 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20 20   zSp1 = 0; }.   
0d50: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70 43   if( pC==0 ){ pC
0d60: 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32 20   = &dummy; zSp2 
0d70: 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  = 0; }.    sqlit
0d80: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
0d90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
0da0: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0db0: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0dc0: 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70 41   ", 0,.       pA
0dd0: 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70 31  ->z, pA->n, zSp1
0de0: 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e  , 1, pB->z, pB->
0df0: 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d 3e  n, zSp2, 1, pC->
0e00: 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20  z, pC->n, 0);.  
0e10: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0e20: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0e30: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
0e40: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
0e50: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
0e60: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
0e70: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
0e80: 73 67 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  sg, .      "RIGH
0e90: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
0ea0: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
0eb0: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
0ec0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
0ed0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
0ee0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
0ef0: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
0f00: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
0f10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f20: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
0f30: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
0f40: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
0f50: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
0f60: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
0f70: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
0f80: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
0f90: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
0fa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0fb0: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
0fc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
0fd0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
0fe0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
0ff0: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(pTab->aCol[i].
1000: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
1010: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1020: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1030: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d  /*.** Add a term
1040: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78   to the WHERE ex
1050: 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45  pression in *ppE
1060: 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65  xpr that require
1070: 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f  s the.** zCol co
1080: 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c  lumn to be equal
1090: 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c   in the two tabl
10a0: 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61  es pTab1 and pTa
10b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
10c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
10d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10e0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
10f0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1100: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
1110: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
1120: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
1130: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
1140: 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20  *pTab2,      /* 
1150: 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  Second table */.
1160: 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20    Expr **ppExpr 
1170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1180: 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  d the equality t
1190: 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72  erm to this expr
11a0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54  ession */.){.  T
11b0: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78  oken dummy;.  Ex
11c0: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
11d0: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
11e0: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
11f0: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1200: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f  .  dummy.z = zCo
1210: 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73  l;.  dummy.n = s
1220: 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 70  trlen(zCol);.  p
1230: 45 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72  E1a = sqliteExpr
1240: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1250: 75 6d 6d 79 29 3b 0a 20 20 70 45 31 61 2d 3e 73  ummy);.  pE1a->s
1260: 74 61 74 69 63 54 6f 6b 65 6e 20 3d 20 31 3b 0a  taticToken = 1;.
1270: 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 45    pE2a = sqliteE
1280: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1290: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61   &dummy);.  pE2a
12a0: 2d 3e 73 74 61 74 69 63 54 6f 6b 65 6e 20 3d 20  ->staticToken = 
12b0: 31 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70  1;.  dummy.z = p
12c0: 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64  Tab1->zName;.  d
12d0: 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  ummy.n = strlen(
12e0: 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62  dummy.z);.  pE1b
12f0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
1300: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
1310: 79 29 3b 0a 20 20 70 45 31 62 2d 3e 73 74 61 74  y);.  pE1b->stat
1320: 69 63 54 6f 6b 65 6e 20 3d 20 31 3b 0a 20 20 64  icToken = 1;.  d
1330: 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62 32 2d 3e  ummy.z = pTab2->
1340: 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d 79 2e 6e  zName;.  dummy.n
1350: 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d 6d 79 2e   = strlen(dummy.
1360: 7a 29 3b 0a 20 20 70 45 32 62 20 3d 20 73 71 6c  z);.  pE2b = sql
1370: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
1380: 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  , 0, &dummy);.  
1390: 70 45 32 62 2d 3e 73 74 61 74 69 63 54 6f 6b 65  pE2b->staticToke
13a0: 6e 20 3d 20 31 3b 0a 20 20 70 45 31 63 20 3d 20  n = 1;.  pE1c = 
13b0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f  sqliteExpr(TK_DO
13c0: 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30  T, pE1b, pE1a, 0
13d0: 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69  );.  pE2c = sqli
13e0: 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  teExpr(TK_DOT, p
13f0: 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20  E2b, pE2a, 0);. 
1400: 20 70 45 20 3d 20 73 71 6c 69 74 65 45 78 70 72   pE = sqliteExpr
1410: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1420: 32 63 2c 20 30 29 3b 0a 20 20 70 45 2d 3e 69 73  2c, 0);.  pE->is
1430: 4a 6f 69 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20  JoinExpr = 1;.  
1440: 69 66 28 20 2a 70 70 45 78 70 72 20 29 7b 0a 20  if( *ppExpr ){. 
1450: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
1460: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
1470: 2a 70 70 45 78 70 72 2c 20 70 45 2c 20 30 29 3b  *ppExpr, pE, 0);
1480: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
1490: 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a  pExpr = pE;.  }.
14a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
14b0: 20 45 78 70 72 2e 69 73 4a 6f 69 6e 45 78 70 72   Expr.isJoinExpr
14c0: 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 74 65 72   flag on all ter
14d0: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
14e0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
14f0: 2a 20 54 68 65 20 45 78 70 72 2e 69 73 4a 6f 69  * The Expr.isJoi
1500: 6e 45 78 70 72 20 66 6c 61 67 20 69 73 20 75 73  nExpr flag is us
1510: 65 64 20 61 74 20 6f 6e 20 74 65 72 6d 73 20 6f  ed at on terms o
1520: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1530: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
1540: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
1550: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
1560: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
1570: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
1580: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
1590: 6e 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  n and not a part
15a0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
15b0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
15c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
15d0: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
15e0: 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  pr *p){.  while(
15f0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 4a   p ){.    p->isJ
1600: 6f 69 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 20  oinExpr = 1;.   
1610: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
1620: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20  pLeft);.    p = 
1630: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1640: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1650: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1660: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1670: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1680: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1690: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
16a0: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
16b0: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
16c0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
16d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
16e0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
16f0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
1700: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1710: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1720: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
1730: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
1740: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
1750: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1760: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72  eProcessJoin(Par
1770: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1780: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
1790: 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69  t *pSrc;.  int i
17a0: 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  , j;.  pSrc = p-
17b0: 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
17c0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
17d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
17e0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
17f0: 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e  *pTerm = &pSrc->
1800: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
1810: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1820: 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61  Other = &pSrc->a
1830: 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [i+1];..    if( 
1840: 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c  pTerm->pTab==0 |
1850: 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d  | pOther->pTab==
1860: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1870: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1880: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1890: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
18a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
18b0: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
18c0: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
18d0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
18e0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
18f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65    */.    if( pTe
1900: 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rm->jointype & J
1910: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
1920: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
1930: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1940: 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70  >pOn || pTerm->p
1950: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
1960: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1970: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
1980: 67 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  g, "a NATURAL jo
1990: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
19a0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
19b0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
19c0: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
19d0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
19e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
19f0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1a00: 20 20 70 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e    pTab = pTerm->
1a10: 70 54 61 62 3b 0a 20 20 20 20 20 20 66 6f 72 28  pTab;.      for(
1a20: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1a30: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1a40: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
1a50: 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70  (pOther->pTab, p
1a60: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1a70: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1a80: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
1a90: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  (pTab->aCol[j].z
1aa0: 4e 61 6d 65 2c 20 70 54 61 62 2c 20 70 4f 74 68  Name, pTab, pOth
1ab0: 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57  er->pTab, &p->pW
1ac0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
1ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ae0: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
1af0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1b00: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
1b10: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
1b20: 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
1b30: 3e 70 4f 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70  >pOn && pTerm->p
1b40: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
1b50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
1b60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
1b70: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
1b80: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
1b90: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
1ba0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
1bb0: 6f 69 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  oin", 0);.      
1bc0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
1bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1be0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
1bf0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
1c00: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1c10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
1c20: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
1c30: 20 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65 72   ** and AND oper
1c40: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
1c50: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e 20   if( pTerm->pOn 
1c60: 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
1c70: 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e 29  Expr(pTerm->pOn)
1c80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
1c90: 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Where==0 ){.    
1ca0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
1cb0: 70 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20 20  pTerm->pOn;.    
1cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cd0: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
1ce0: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
1cf0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65 72 6d  p->pWhere, pTerm
1d00: 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ->pOn, 0);.     
1d10: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
1d20: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
1d30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
1d40: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
1d50: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
1d60: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
1d70: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
1d80: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
1d90: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
1da0: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
1db0: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
1dc0: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
1dd0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
1de0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
1df0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
1e00: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
1e10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
1e20: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
1e30: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
1e40: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
1e50: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
1e60: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
1e70: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
1e80: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
1e90: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1ea0: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
1eb0: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
1ec0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1ed0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
1ee0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  IdList *pList;. 
1ef0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1f00: 20 20 61 73 73 65 72 74 28 20 69 3c 70 53 72 63    assert( i<pSrc
1f10: 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20 20 20  ->nSrc-1 );.    
1f20: 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72 6d 2d    pList = pTerm-
1f30: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
1f40: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
1f50: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
1f60: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
1f70: 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61 62 2c  dex(pTerm->pTab,
1f80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
1f90: 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20 20 20  me)<0 ||.       
1fa0: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
1fb0: 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70  (pOther->pTab, p
1fc0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
1fd0: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
1fe0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1ff0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
2000: 67 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  g, "cannot join 
2010: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 22 2c 0a  using column ",.
2020: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 69 73              pLis
2030: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 22  t->a[j].zName, "
2040: 20 2d 20 63 6f 6c 75 6d 6e 20 6e 6f 74 20 70 72   - column not pr
2050: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
2060: 62 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20  bles", 0);.     
2070: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
2080: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  r++;.          r
2090: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
20a0: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68   }.        addWh
20b0: 65 72 65 54 65 72 6d 28 70 4c 69 73 74 2d 3e 61  ereTerm(pList->a
20c0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 65 72 6d  [j].zName, pTerm
20d0: 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65 72 2d 3e  ->pTab, pOther->
20e0: 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72 65  pTab, &p->pWhere
20f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2100: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2120: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
2130: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
2140: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
2150: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
2160: 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65  d sqliteSelectDe
2170: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
2180: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2190: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78  turn;.  sqliteEx
21a0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
21b0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
21c0: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
21d0: 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74  ->pSrc);.  sqlit
21e0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  eExprDelete(p->p
21f0: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
2200: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2210: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73  ->pGroupBy);.  s
2220: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
2230: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
2240: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
2250: 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ete(p->pOrderBy)
2260: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
2270: 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
2280: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2290: 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73  p->zSelect);.  s
22a0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
22b0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
22c0: 65 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  e aggregate info
22d0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
22e0: 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
22f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2300: 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
2310: 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20  InfoReset(Parse 
2320: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
2330: 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61  teFree(pParse->a
2340: 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Agg);.  pParse->
2350: 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  aAgg = 0;.  pPar
2360: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
2370: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
2380: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
2390: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
23a0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
23b0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
23c0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
23d0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
23e0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
23f0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
2400: 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  orter(Parse *pPa
2410: 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78  rse, Vdbe *v, Ex
2420: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2430: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f 72 74  ){.  char *zSort
2440: 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Order;.  int i;.
2450: 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20 73    zSortOrder = s
2460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f 72  qliteMalloc( pOr
2470: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
2480: 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72 74 4f   );.  if( zSortO
2490: 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rder==0 ) return
24a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
24b0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
24c0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 72  i++){.    int or
24d0: 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  der = pOrderBy->
24e0: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
24f0: 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20      int type;.  
2500: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 66 28    int c;.    if(
2510: 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54 45   (order & SQLITE
2520: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53  _SO_TYPEMASK)==S
2530: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b  QLITE_SO_TEXT ){
2540: 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51  .      type = SQ
2550: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
2560: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 72 64    }else if( (ord
2570: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
2580: 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  YPEMASK)==SQLITE
2590: 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20  _SO_NUM ){.     
25a0: 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53   type = SQLITE_S
25b0: 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  O_NUM;.    }else
25c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
25d0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
25e0: 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  ){.      type = 
25f0: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
2600: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2610: 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  xpr);.    }else{
2620: 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51  .      type = SQ
2630: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
2640: 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72 64 65   }.    if( (orde
2650: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 49  r & SQLITE_SO_DI
2660: 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53  RMASK)==SQLITE_S
2670: 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 63  O_ASC ){.      c
2680: 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f   = type==SQLITE_
2690: 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20 3a 20  SO_TEXT ? 'A' : 
26a0: 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  '+';.    }else{.
26b0: 20 20 20 20 20 20 63 20 3d 20 74 79 70 65 3d 3d        c = type==
26c0: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f  SQLITE_SO_TEXT ?
26d0: 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20   'D' : '-';.    
26e0: 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72  }.    zSortOrder
26f0: 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c  [i] = c;.    sql
2700: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
2710: 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2720: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  i].pExpr);.  }. 
2730: 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64   zSortOrder[pOrd
2740: 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30  erBy->nExpr] = 0
2750: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
2760: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
2770: 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d  keKey, pOrderBy-
2780: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71  >nExpr, 0);.  sq
2790: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
27a0: 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f 72 64  (v, -1, zSortOrd
27b0: 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f 72 74  er, strlen(zSort
27c0: 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c 69 74  Order));.  sqlit
27d0: 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64 65 72  eFree(zSortOrder
27e0: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  );.  sqliteVdbeA
27f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50  ddOp(v, OP_SortP
2800: 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  ut, 0, 0);.}../*
2810: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2820: 20 61 64 64 73 20 61 20 50 33 20 61 72 67 75 6d   adds a P3 argum
2830: 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ent to the last 
2840: 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61 74  VDBE opcode that
2850: 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64   was.** inserted
2860: 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d 65 6e  . The P3 argumen
2870: 74 20 61 64 64 65 64 20 69 73 20 61 20 73 74 72  t added is a str
2880: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
2890: 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b 65   the .** OP_Make
28a0: 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49 64  Key or OP_MakeId
28b0: 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20 54  xKey opcodes.  T
28c0: 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73  he string consis
28d0: 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  ts of.** charact
28e0: 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20 64  ers 't' or 'n' d
28f0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
2900: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 76  her or not the v
2910: 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64 73  arious.** fields
2920: 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20 62   of the key to b
2930: 65 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f 75  e generated shou
2940: 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ld be treated as
2950: 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20 61   numeric.** or a
2960: 73 20 74 65 78 74 2e 20 20 53 65 65 20 74 68 65  s text.  See the
2970: 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64 20   OP_MakeKey and 
2980: 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70  OP_MakeIdxKey op
2990: 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74  code.** document
29a0: 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ation for additi
29b0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
29c0: 20 61 62 6f 75 74 20 74 68 65 20 50 33 20 73 74   about the P3 st
29d0: 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c 73  ring..** See als
29e0: 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 49  o the sqliteAddI
29f0: 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74  dxKeyType() rout
2a00: 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
2a10: 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 56 64  iteAddKeyType(Vd
2a20: 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74 20  be *v, ExprList 
2a30: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  *pEList){.  int 
2a40: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74  nColumn = pEList
2a50: 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61 72 20  ->nExpr;.  char 
2a60: 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d  *zType = sqliteM
2a70: 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b 31  alloc( nColumn+1
2a80: 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   );.  int i;.  i
2a90: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65  f( zType==0 ) re
2aa0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
2ab0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
2ac0: 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d  {.    zType[i] =
2ad0: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
2ae0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
2af0: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  pr)==SQLITE_SO_N
2b00: 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27 3b 0a  UM ? 'n' : 't';.
2b10: 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d 20 3d    }.  zType[i] =
2b20: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
2b30: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
2b40: 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  zType, nColumn);
2b50: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
2b60: 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ype);.}../*.** T
2b70: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
2b80: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
2b90: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
2ba0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
2bb0: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
2bc0: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
2bd0: 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20  and nColumn are 
2be0: 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20  both zero, then 
2bf0: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
2c00: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
2c10: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
2c20: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
2c30: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
2c40: 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20  If nColumn>0.** 
2c50: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
2c60: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
2c70: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
2c80: 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74  ed only to get t
2c90: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20  he.** datatypes 
2ca0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
2cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2cc0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
2cd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cf0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2d00: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d20: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
2d30: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
2d40: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
2d50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
2d60: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2d70: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
2d80: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
2d90: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
2da0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
2db0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
2dc0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
2dd0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2df0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
2e00: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
2e10: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2e20: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
2e30: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
2e40: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
2e50: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
2e60: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
2e70: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
2e80: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
2e90: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
2ea0: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
2eb0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
2ec0: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
2ed0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
2ee0: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
2ef0: 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65      /* An argume
2f00: 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73  nt to the dispos
2f10: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
2f20: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
2f30: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2f40: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
2f50: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
2f60: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
2f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
2f80: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
2f90: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
2fa0: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
2fb0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2fc0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2fd0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
2ff0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
3000: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
3010: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
3020: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
3030: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
3040: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
3050: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
3060: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
3070: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
3080: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
3090: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66  .    if( p->nOff
30a0: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  set>0 ){.      i
30b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
30c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
30d0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
30e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30f0: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66  MemIncr, p->nOff
3100: 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  set, addr+2);.  
3110: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3120: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3130: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
3140: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
3150: 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  nLimit>=0 ){.   
3160: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3170: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
3180: 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 69 42 72  , p->nLimit, iBr
3190: 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  eak);.    }.  }.
31a0: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
31b0: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
31c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ..  */.  if( nCo
31d0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
31e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
31f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
3200: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3210: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
3220: 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, i);.    }.  
3230: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75  }else{.    nColu
3240: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
3250: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
3260: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
3270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
3280: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
3290: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
32a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
32b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32c0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
32d0: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
32e0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
32f0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
3300: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
3310: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
3320: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
3330: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
3340: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
3350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74  .  */.  if( dist
3360: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
3370: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
3380: 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c  pr>0 ){.#if NULL
3390: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
33a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
33b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  ddOp(v, OP_IsNul
33c0: 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l, -pEList->nExp
33d0: 72 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72  r, sqliteVdbeCur
33e0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
33f0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
3400: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3410: 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74  _MakeKey, pEList
3420: 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  ->nExpr, 1);.   
3430: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
3440: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
3450: 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79  ) sqliteAddKeyTy
3460: 70 65 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a 20  pe(v, pEList);. 
3470: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3480: 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63  Op(v, OP_Distinc
3490: 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c  t, distinct, sql
34a0: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
34b0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71  dr(v)+3);.    sq
34c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
34d0: 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d   OP_Pop, pEList-
34e0: 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20  >nExpr+1, 0);.  
34f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3500: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3510: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
3520: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3530: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
3540: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3550: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3560: 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69  PutStrKey, disti
3570: 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  nct, 0);.  }..  
3580: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
3590: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
35a0: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
35b0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
35c0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
35d0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
35e0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
35f0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
3600: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
3610: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3620: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3630: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
3640: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
3650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3660: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3670: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
3680: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3690: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
36a0: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
36b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   }..    /* Store
36d0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
36e0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
36f0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
3700: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
3710: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
3720: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
3730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3740: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3750: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
3760: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3770: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3780: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3790: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
37a0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
37b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
37d0: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
37e0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
37f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3800: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
3810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3820: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3830: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
3840: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
3850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3860: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
3870: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
3880: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
3890: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
38a0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
38b0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
38c0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
38d0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
38e0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
38f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
3900: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
3910: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
3920: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
3930: 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
3940: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3950: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3960: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3970: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3980: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3990: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
39a0: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
39b0: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
39c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
39d0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
39e0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
39f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3a00: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
3a10: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
3a20: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
3a30: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
3a40: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
3a50: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
3a60: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
3a70: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
3a80: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
3a90: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
3aa0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
3ab0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
3ac0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
3ad0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c   {.      int lbl
3ae0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
3af0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
3b00: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
3b10: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
3b20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3b30: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20 6c  OP_IsNull, -1, l
3b40: 62 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  bl);.      if( p
3b50: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3b60: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3b70: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3b80: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3b90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3ba0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3bb0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
3bc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3bd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3be0: 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d  PutStrKey, iParm
3bf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3c00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
3c10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
3c20: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
3c30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
3c40: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
3c50: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
3c60: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
3c70: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
3c80: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
3c90: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
3ca0: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
3cb0: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
3cc0: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
3cd0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
3ce0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3cf0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
3d00: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
3d10: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
3d20: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3d30: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3d40: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3d50: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3d60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3d70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3d80: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
3d90: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 1);.        s
3da0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3db0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
3dc0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  reak);.      }. 
3dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3de0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  }..    /* Send t
3df0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
3e00: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
3e10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3e20: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a  e SRT_Callback:.
3e30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72      case SRT_Sor
3e40: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ter: {.      if(
3e50: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3e60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3e70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d  ddOp(v, OP_SortM
3e80: 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c  akeRec, nColumn,
3e90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73   0);.        pus
3ea0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3eb0: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3ec0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3ed0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
3ee0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
3ef0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ck );.        sq
3f00: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f10: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43   OP_Callback, nC
3f20: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
3f30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3f40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3f50: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
3f60: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
3f70: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
3f80: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
3f90: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
3fa0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
3fb0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
3fc0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
3fd0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
3fe0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
3ff0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
4000: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
4010: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
4020: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
4030: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4040: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4050: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4060: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4070: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4080: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4090: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
40a0: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
40b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
40c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
40d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
40e0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
40f0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
4100: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
4110: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
4120: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
4130: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
4140: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
4150: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4160: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4170: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4180: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4190: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
41a0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
41b0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
41c0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
41d0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
41e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
41f0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
4200: 28 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  (.  Select *p,  
4210: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
4220: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
4230: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
4240: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
4250: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
4260: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
4270: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  umn,     /* Numb
4280: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
4290: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65   data */.  int e
42a0: 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57  Dest,       /* W
42b0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
42c0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
42d0: 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20    int iParm     
42e0: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70     /* Optional p
42f0: 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61  arameter associa
4300: 74 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a  ted with eDest *
4310: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d  /.){.  int end =
4320: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
4330: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
4340: 64 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  ddr;.  if( eDest
4350: 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72  ==SRT_Sorter ) r
4360: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56  eturn;.  sqliteV
4370: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4380: 6f 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64  ort, 0, 0);.  ad
4390: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
43a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e  ddOp(v, OP_SortN
43b0: 65 78 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20  ext, 0, end);.  
43c0: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
43d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
43e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
43f0: 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65  mIncr, p->nOffse
4400: 74 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20  t, addr+4);.    
4410: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4420: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
4430: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
4440: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
4450: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  , 0, addr);.  }.
4460: 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e    if( p->nLimit>
4470: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4490: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4c 69 6d  MemIncr, p->nLim
44a0: 69 74 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20  it, end);.  }.  
44b0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
44c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
44d0: 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20  llback: {.      
44e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
44f0: 76 2c 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61  v, OP_SortCallba
4500: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4510: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4520: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
4530: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4540: 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20   SRT_TempTable: 
4550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
4560: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4570: 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30  wRecno, iParm, 0
4580: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
45a0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
45b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
45c0: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
45d0: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
45e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
45f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
4600: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
4610: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
4620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
4640: 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56  ull, -1, sqliteV
4650: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4660: 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+3);.      sqli
4670: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4680: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
4690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
46a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
46b0: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
46c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
46d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
46e0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
46f0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4700: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
4710: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4720: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
4730: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 1);.      sql
4740: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4750: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 29  OP_Goto, 0, end)
4760: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4770: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
4780: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
4790: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
47a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
47b0: 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  }.  sqliteVdbeAd
47c0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
47d0: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
47e0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
47f0: 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71  el(v, end);.  sq
4800: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4810: 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30   OP_SortReset, 0
4820: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  , 0);.}../*.** G
4830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4840: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
4850: 56 44 42 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f  VDBE how many co
4860: 6c 75 6d 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61  lumns there.** a
4870: 72 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  re in the result
4880: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 66 6f   and the name fo
4890: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20  r each column.  
48a0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
48b0: 0a 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 70  .** is used to p
48c0: 72 6f 76 69 64 65 20 22 61 72 67 63 22 20 61 6e  rovide "argc" an
48d0: 64 20 22 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75  d "azCol[]" valu
48e0: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
48f0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
4900: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
4910: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
4920: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4930: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
4940: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
4950: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45           /* VDBE
4960: 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
4970: 6e 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65  nding to first e
4980: 6e 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74  ntry in pTabList
4990: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
49a0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
49b0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
49c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
49d0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
49e0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
49f0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
4a00: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4a10: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
4a20: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
4a30: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
4a40: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  || v==0 || sqlit
4a50: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
4a60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
4a70: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
4a80: 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 73  = 1;.  if( pPars
4a90: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
4aa0: 51 4c 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65  QLITE_ReportType
4ab0: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  s ){.    sqliteV
4ac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4ad0: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c 69  olumnCount, pELi
4ae0: 73 74 2d 3e 6e 45 78 70 72 2a 32 2c 20 30 29 3b  st->nExpr*2, 0);
4af0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4b00: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4b10: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
4b20: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
4b30: 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  0);.  }.  for(i=
4b40: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
4b50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
4b60: 70 72 20 2a 70 3b 0a 20 20 20 20 63 68 61 72 20  pr *p;.    char 
4b70: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  *zType = 0;.    
4b80: 69 6e 74 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65  int showFullName
4b90: 73 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  s;.    if( pELis
4ba0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
4bb0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
4bc0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
4bd0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
4be0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4bf0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
4c00: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
4c10: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
4c20: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
4c30: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
4c40: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4c50: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 45 4c     }.    p = pEL
4c60: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
4c70: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
4c80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 68  continue;.    sh
4c90: 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 70  owFullNames = (p
4ca0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
4cb0: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
4cc0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 20 20  lNames)!=0;.    
4cd0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
4ce0: 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74  LUMN && pTabList
4cf0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
4d00: 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74  *pTab = pTabList
4d10: 2d 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20  ->a[p->iTable - 
4d20: 62 61 73 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20  base].pTab;.    
4d30: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
4d40: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
4d50: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
4d60: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
4d70: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
4d80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4d90: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
4da0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
4db0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
4dc0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
4dd0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
4de0: 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20  _ROWID_";.      
4df0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
4e00: 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ER";.      }else
4e10: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
4e20: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
4e30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
4e40: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
4e50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
4e60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4e70: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
4e80: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20  p->span.z[0] && 
4e90: 21 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29  !showFullNames )
4ea0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
4eb0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
4ec0: 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e  ddOp(v,OP_Column
4ed0: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
4ee0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
4ef0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
4f00: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
4f10: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n.n);.        sq
4f20: 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73  liteVdbeCompress
4f30: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a  Space(v, addr);.
4f40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4f50: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
4f60: 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65   || showFullName
4f70: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
4f80: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
4f90: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
4fa0: 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ;. .        zTab
4fb0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70   = pTabList->a[p
4fc0: 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65 5d  ->iTable - base]
4fd0: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
4fe0: 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d   if( showFullNam
4ff0: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
5000: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
5010: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
5020: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  teSetString(&zNa
5030: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
5040: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
5050: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5060: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
5070: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
5080: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
5090: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
50a0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
50b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
50c0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
50d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
50e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
50f0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
5100: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
5110: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
5120: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43  angeP3(v, -1, zC
5130: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ol, 0);.      }.
5140: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
5150: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
5160: 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f 77  an.z[0] && !show
5170: 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  FullNames ){.   
5180: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
5190: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
51a0: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
51b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
51c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
51d0: 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  , -1, p->span.z,
51e0: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
51f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d     sqliteVdbeCom
5200: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
5210: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  dr);.    }else i
5220: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
5230: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
5240: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
5250: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5260: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
5270: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
5280: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5290: 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70 61 6e  3(v, -1, p->span
52a0: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
52b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
52c0: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
52d0: 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73   addr);.    }els
52e0: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  e{.      char zN
52f0: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61  ame[30];.      a
5300: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
5310: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c  _COLUMN || pTabL
5320: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
5330: 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22  sprintf(zName, "
5340: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
5350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
5360: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
5370: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
5380: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5390: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
53a0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
53b0: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
53c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
53d0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
53e0: 52 65 70 6f 72 74 54 79 70 65 73 20 29 7b 0a 20  ReportTypes ){. 
53f0: 20 20 20 20 20 69 66 28 20 7a 54 79 70 65 3d 3d       if( zType==
5400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
5410: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
5420: 70 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45  p)==SQLITE_SO_TE
5430: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
5440: 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a  zType = "TEXT";.
5450: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5460: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
5470: 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20   "NUMERIC";.    
5480: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5490: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
54a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
54b0: 4e 61 6d 65 2c 20 69 20 2b 20 70 45 4c 69 73 74  Name, i + pEList
54c0: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
54d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
54e0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79  ngeP3(v, -1, zTy
54f0: 70 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  pe, P3_STATIC);.
5500: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
5510: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
5520: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
5530: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
5540: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
5550: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5560: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
5570: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
5580: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
5590: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
55a0: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
55b0: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
55c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
55d0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
55e0: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
55f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5600: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
5610: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
5620: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
5630: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
5640: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
5650: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5660: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
5670: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
5680: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
5690: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
56a0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
56b0: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
56c0: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
56d0: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
56e0: 2a 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74  *sqliteResultSet
56f0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
5700: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
5710: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
5720: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
5730: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
5740: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
5750: 4c 69 73 74 3b 0a 20 20 73 74 61 74 69 63 20 69  List;.  static i
5760: 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  nt fillInColumnL
5770: 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  ist(Parse*, Sele
5780: 63 74 2a 29 3b 0a 0a 20 20 69 66 28 20 66 69 6c  ct*);..  if( fil
5790: 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
57a0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
57b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
57c0: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
57d0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
57e0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
57f0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
5800: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5810: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pTab->zName = z
5820: 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  TabName ? sqlite
5830: 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29  StrDup(zTabName)
5840: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
5850: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
5860: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
5870: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
5880: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
5890: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
58a0: 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d  ->aCol = sqliteM
58b0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54  alloc( sizeof(pT
58c0: 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61  ab->aCol[0])*pTa
58d0: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72  b->nCol );.  for
58e0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
58f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  ol; i++){.    Ex
5900: 70 72 20 2a 70 3b 0a 20 20 20 20 69 66 28 20 70  pr *p;.    if( p
5910: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
5920: 65 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  e ){.      pTab-
5930: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  >aCol[i].zName =
5940: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 45   sqliteStrDup(pE
5950: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
5960: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
5970: 20 28 70 3d 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   (p=pEList->a[i]
5980: 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 20  .pExpr)->span.z 
5990: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
59a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
59b0: 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61 62 2d  etNString(&pTab-
59c0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
59d0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
59e0: 61 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65  an.n, 0);.    }e
59f0: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
5a00: 4b 5f 44 4f 54 20 26 26 20 70 2d 3e 70 52 69 67  K_DOT && p->pRig
5a10: 68 74 20 26 26 20 70 2d 3e 70 52 69 67 68 74 2d  ht && p->pRight-
5a20: 3e 74 6f 6b 65 6e 2e 7a 20 26 26 0a 20 20 20 20  >token.z &&.    
5a30: 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74         p->pRight
5a40: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
5a50: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
5a60: 53 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43  String(&pTab->aC
5a70: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  ol[i].zName, .  
5a80: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67           p->pRig
5a90: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e  ht->token.z, p->
5aa0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c  pRight->token.n,
5ab0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
5ac0: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
5ad0: 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  30];.      sprin
5ae0: 74 66 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e  tf(zBuf, "column
5af0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
5b00: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
5b10: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
5b20: 44 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d  Dup(zBuf);.    }
5b30: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
5b40: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
5b50: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
5b60: 20 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   For the given S
5b70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
5b80: 20 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73   do three things
5b90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
5ba0: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
5bb0: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
5bc0: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
5bd0: 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
5be0: 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 74 68        defines th
5bf0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
5c00: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
5c10: 63 61 6e 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  canned. .**.**  
5c20: 20 20 28 32 29 20 20 41 64 64 20 74 65 72 6d 73    (2)  Add terms
5c30: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
5c40: 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61  ause to accomoda
5c50: 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
5c60: 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
5c70: 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
5c80: 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
5c90: 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
5ca0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53  .**.**    (3)  S
5cb0: 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
5cc0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
5cd0: 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
5ce0: 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
5cf0: 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
5d00: 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
5d10: 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
5d20: 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
5d30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
5d40: 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
5d50: 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
5d60: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
5d70: 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
5d80: 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
5d90: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
5da0: 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
5db0: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
5dc0: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65  ccess.  If there
5dd0: 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c   are problems, l
5de0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
5df0: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
5e00: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
5e10: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
5e20: 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75  c int fillInColu
5e30: 6d 6e 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50  mnList(Parse *pP
5e40: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
5e50: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
5e60: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
5e70: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
5e80: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
5e90: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20  Table *pTab;..  
5ea0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
5eb0: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
5ec0: 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  1;.  pTabList = 
5ed0: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
5ee0: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
5ef0: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
5f00: 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ry table in the 
5f10: 74 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  table list..  */
5f20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
5f30: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
5f40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62  +){.    if( pTab
5f50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
5f60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
5f70: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e   routine has run
5f80: 20 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65   before!  No nee
5f90: 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f  d to continue */
5fa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
5fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5fc0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
5fd0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
5fe0: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
5ff0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
6000: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
6010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6020: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
6030: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
6040: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6050: 61 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29  a[i].zAlias==0 )
6060: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
6070: 46 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20  FakeName[60];.  
6080: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46        sprintf(zF
6090: 61 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  akeName, "sqlite
60a0: 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a  _subquery_%p_",.
60b0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
60c0: 2a 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  *)pTabList->a[i]
60d0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
60e0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
60f0: 6e 67 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ng(&pTabList->a[
6100: 69 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65  i].zAlias, zFake
6110: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
6120: 7d 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74  }.      pTabList
6130: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54  ->a[i].pTab = pT
6140: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
6150: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
6160: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  elect(pParse, pT
6170: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6180: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
61b0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
61c0: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
61d0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
61e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
61f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
6200: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
6210: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6220: 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
6230: 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
6240: 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
6250: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
6260: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6270: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
6280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 69 6e         sqliteFin
6290: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
62a0: 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  b, pTabList->a[i
62b0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
62c0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
62d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
62e0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
62f0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
6300: 68 20 74 61 62 6c 65 3a 20 22 2c 20 0a 20 20 20  h table: ", .   
6310: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
6320: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29  ->a[i].zName, 0)
6330: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
6340: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
6350: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6360: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
6370: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
6380: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
6390: 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  eViewGetColumnNa
63a0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
63b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
63c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
63d0: 20 7d 0a 20 20 20 20 20 20 20 20 70 54 61 62 4c   }.        pTabL
63e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
63f0: 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  t = sqliteSelect
6400: 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63  Dup(pTab->pSelec
6410: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
6420: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
6430: 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
6440: 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
6450: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
6460: 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
6470: 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73  if( sqliteProces
6480: 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
6490: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
64a0: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
64b0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
64c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
64d0: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
64e0: 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
64f0: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
6500: 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
6510: 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
6520: 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
6530: 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
6540: 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
6550: 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
6560: 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
6570: 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
6580: 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
6590: 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
65a0: 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
65b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
65c0: 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
65d0: 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
65e0: 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
65f0: 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
6600: 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
6610: 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
6620: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
6630: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
6640: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
6650: 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
6660: 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
6670: 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
6680: 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
6690: 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
66a0: 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
66b0: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
66c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
66d0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
66e0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
66f0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
6700: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
6710: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
6720: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
6730: 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
6740: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
6750: 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
6760: 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
6770: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
6780: 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
6790: 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20    rc = 0;.  if( 
67a0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
67b0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
67c0: 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
67d0: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
67e0: 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
67f0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
6800: 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
6810: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
6820: 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
6830: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
6840: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
6850: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
6860: 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
6870: 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
6880: 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
6890: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
68a0: 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
68b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
68c0: 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b  w = 0;.    for(k
68d0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
68e0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
68f0: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
6900: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
6910: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
6920: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
6930: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
6940: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
6950: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
6960: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
6970: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
6980: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
6990: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
69a0: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
69b0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
69c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
69d0: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
69e0: 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70  (pNew, a[k].pExp
69f0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
6a00: 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
6a10: 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
6a20: 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
6a30: 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
6a40: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a  ;.        a[k].z
6a50: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
6a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
6a70: 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
6a80: 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
6a90: 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
6aa0: 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
6ab0: 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
6ac0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
6ad0: 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
6ae0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
6af0: 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
6b00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65   */.        Toke
6b10: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20  n *pName;       
6b20: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
6b30: 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
6b40: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
6b50: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
6b60: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
6b70: 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45       pName = &pE
6b80: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
6b90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6ba0: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d           pName =
6bb0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
6bc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6bd0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
6be0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
6bf0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
6c00: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
6c10: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
6c20: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
6c30: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
6c40: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
6c50: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
6c60: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
6c70: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
6c80: 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
6c90: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
6ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6cb0: 69 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54  if( pName && (zT
6cc0: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
6cd0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
6d00: 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61  pName->z, zTabNa
6d10: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30  me, pName->n)!=0
6d20: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
6d30: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e       zTabName[pN
6d40: 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20  ame->n]!=0) ){. 
6d50: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
6d60: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
6d70: 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
6d80: 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
6d90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6da0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
6db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
6dc0: 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74  r *pExpr, *pLeft
6dd0: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
6de0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
6df0: 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
6e00: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
6e10: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
6e20: 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  & (pTabList->a[i
6e30: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
6e40: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
6e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e60: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61   columnIndex(pTa
6e70: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54  bList->a[i-1].pT
6e80: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
6e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
6ea0: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
6eb0: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
6ec0: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
6ed0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
6ee0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
6ef0: 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
6f00: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6f10: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6f20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
6f30: 28 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 49  ( i>0 && sqliteI
6f40: 64 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c  dListIndex(pTabL
6f50: 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69  ist->a[i-1].pUsi
6f60: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
6f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
6f80: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
6f90: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
6fa0: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
6fb0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
6fc0: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
6fd0: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
6fe0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
6ff0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
7000: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7020: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
7030: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20  liteExpr(TK_ID, 
7040: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
7050: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
7060: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7070: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
7080: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65  >token.z = zName
7090: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
70a0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  ight->token.n = 
70b0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
70c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
70d0: 54 61 62 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TabName ){.     
70e0: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
70f0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
7100: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
7110: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7120: 4c 65 66 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Left==0 ) break;
7130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7140: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Left->token.z = 
7150: 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zTabName;.      
7160: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
7170: 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  oken.n = strlen(
7180: 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
7190: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
71a0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44   sqliteExpr(TK_D
71b0: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
71c0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
71d0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
71e0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
71f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7200: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7210: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
7220: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7230: 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74  >span = pExpr->t
7240: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
7250: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7260: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70  pNew = sqliteExp
7270: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
7280: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
7290: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
72a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
72b0: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
72c0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
72d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
72e0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
72f0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
7300: 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  g, "no such tabl
7310: 65 3a 20 22 2c 20 2d 31 2c 20 0a 20 20 20 20 20  e: ", -1, .     
7320: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e           pName->
7330: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
7340: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7360: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
7370: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
7380: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
7390: 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
73a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
73b0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
73c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
73d0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c  .    sqliteExprL
73e0: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
73f0: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
7400: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
7410: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7420: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7430: 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69  recursively unli
7440: 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70  nks the Select.p
7450: 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69  Src.a[].pTab poi
7460: 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65  nters.** in a se
7470: 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20  lect structure. 
7480: 20 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68   It just sets th
7490: 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55  e pointers to NU
74a0: 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  LL.  This.** rou
74b0: 74 69 6e 65 20 69 73 20 72 65 63 75 72 73 69 76  tine is recursiv
74c0: 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74  e in the sense t
74d0: 68 61 74 20 69 66 20 74 68 65 20 53 65 6c 65 63  hat if the Selec
74e0: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65  t.pSrc.a[].pSele
74f0: 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73  ct.** pointer is
7500: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20   not NULL, this 
7510: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7520: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
7530: 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a   that pointer..*
7540: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7550: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  e is called on t
7560: 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
7570: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
7580: 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72   a.** VIEW in or
7590: 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20  der to undo any 
75a0: 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c  bindings to tabl
75b0: 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  es.  This is nec
75c0: 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73  essary.** becaus
75d0: 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d  e those tables m
75e0: 69 67 68 74 20 62 65 20 44 52 4f 50 65 64 20 62  ight be DROPed b
75f0: 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 53  y a subsequent S
7600: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76  QL command..*/.v
7610: 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74  oid sqliteSelect
7620: 55 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70  Unbind(Select *p
7630: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  ){.  int i;.  Sr
7640: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
7650: 3e 70 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a  >pSrc;.  Table *
7660: 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pTab;.  if( p==0
7670: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7680: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
7690: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rc; i++){.    if
76a0: 28 20 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  ( (pTab = pSrc->
76b0: 61 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b  a[i].pTab)!=0 ){
76c0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
76d0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
76e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
76f0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61  leteTable(0, pTa
7700: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
7710: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
7720: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
7730: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63  t);.        pSrc
7740: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
7750: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7760: 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61    pSrc->a[i].pTa
7770: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
7780: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pSrc->a[i].pSel
7790: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
77a0: 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e  qliteSelectUnbin
77b0: 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  d(pSrc->a[i].pSe
77c0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
77d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
77e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
77f0: 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65  ssociates entrie
7800: 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s in an ORDER BY
7810: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7820: 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   with.** columns
7830: 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46   in a result.  F
7840: 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59  or each ORDER BY
7850: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
7860: 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68   opcode of.** th
7870: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
7880: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
7890: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
78a0: 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f   iColumn value o
78b0: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
78c0: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
78d0: 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e  d in with column
78e0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
78f0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
7900: 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
7910: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
7920: 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61  with iTable para
7930: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  meter..**.** If 
7940: 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20  there are prior 
7950: 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20  SELECT clauses, 
7960: 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73  they are process
7970: 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74  ed first.  A mat
7980: 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c  ch.** in an earl
7990: 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73  ier SELECT takes
79a0: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
79b0: 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e   a later SELECT.
79c0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79  .**.** Any entry
79d0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
79e0: 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20  atch is flagged 
79f0: 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  as an error.  Th
7a00: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
7a10: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
7a20: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
7a30: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
7a40: 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
7a50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
7a60: 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c   /* A place to l
7a70: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
7a80: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
7a90: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
7aa0: 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73   /* Match to res
7ab0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ult columns of t
7ac0: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
7ad0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
7ae0: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
7af0: 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74  RDER BY values t
7b00: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
7b10: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
7b20: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
7b30: 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74       /* Insert t
7b40: 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61  his value in iTa
7b50: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
7b60: 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20  tComplete       
7b70: 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20   /* If TRUE all 
7b80: 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d  ORDER BYs must m
7b90: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
7ba0: 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74   nErr = 0;.  int
7bb0: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
7bc0: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
7bd0: 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20  ( pSelect==0 || 
7be0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
7bf0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75  turn 1;.  if( mu
7c00: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
7c10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
7c20: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
7c30: 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  +){ pOrderBy->a[
7c40: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20  i].done = 0; }. 
7c50: 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43   }.  if( fillInC
7c60: 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65  olumnList(pParse
7c70: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
7c80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
7c90: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
7ca0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
7cb0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
7cc0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53  olumn(pParse, pS
7cd0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70  elect->pPrior, p
7ce0: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
7cf0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
7d00: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
7d10: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
7d20: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  ect->pEList;.  f
7d30: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
7d40: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
7d50: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
7d60: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
7d70: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43  Expr;.    int iC
7d80: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  ol = -1;.    if(
7d90: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7da0: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
7db0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
7dc0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
7dd0: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
7de0: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
7df0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
7e00: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  pr ){.        ch
7e10: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
7e20: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
7e30: 75 66 2c 22 4f 52 44 45 52 20 42 59 20 70 6f 73  uf,"ORDER BY pos
7e40: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
7e50: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
7e60: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
7e70: 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
7e80: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
7e90: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
7ea0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
7eb0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 20   zBuf, 0);.     
7ec0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7ed0: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
7ee0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
7ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7f00: 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  iCol--;.    }.  
7f10: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c    for(j=0; iCol<
7f20: 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  0 && j<pEList->n
7f30: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
7f40: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
7f50: 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d  j].zName && (pE-
7f60: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45  >op==TK_ID || pE
7f70: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29  ->op==TK_STRING)
7f80: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
7f90: 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c   *zName, *zLabel
7fa0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
7fb0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  = pEList->a[j].z
7fc0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Name;.        as
7fd0: 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e  sert( pE->token.
7fe0: 7a 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61  z );.        zLa
7ff0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  bel = sqliteStrN
8000: 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c  Dup(pE->token.z,
8010: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20   pE->token.n);. 
8020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71         sqliteDeq
8030: 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  uote(zLabel);.  
8040: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8050: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a  StrICmp(zName, z
8060: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20  Label)==0 ){ .  
8070: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
8080: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8090: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
80a0: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
80b0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
80c0: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f   && sqliteExprCo
80d0: 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74  mpare(pE, pEList
80e0: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[j].pExpr) ){
80f0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  .        iCol = 
8100: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  j;.      }.    }
8110: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
8120: 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70   ){.      pE->op
8130: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
8140: 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20      pE->iColumn 
8150: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45  = iCol;.      pE
8160: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
8170: 65 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  e;.      pOrderB
8180: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31  y->a[i].done = 1
8190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
81a0: 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f  iCol<0 && mustCo
81b0: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
81c0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
81d0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
81e0: 66 2c 22 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20  f,"%d",i+1);.   
81f0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
8200: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
8210: 4d 73 67 2c 20 22 4f 52 44 45 52 20 42 59 20 74  Msg, "ORDER BY t
8220: 65 72 6d 20 6e 75 6d 62 65 72 20 22 2c 20 7a 42  erm number ", zB
8230: 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 64  uf, .        " d
8240: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
8250: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
8260: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
8270: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8280: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
8290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
82a0: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
82b0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
82c0: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
82d0: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
82e0: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
82f0: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
8300: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
8310: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
8320: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
8330: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
8340: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
8350: 71 6c 69 74 65 47 65 74 56 64 62 65 28 50 61 72  qliteGetVdbe(Par
8360: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
8370: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
8380: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
8390: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
83a0: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
83b0: 6c 69 74 65 56 64 62 65 43 72 65 61 74 65 28 70  liteVdbeCreate(p
83c0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
83d0: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 20 20    return v;.}.  
83e0: 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
83f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8400: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
8410: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
8420: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
8430: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
8440: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
8450: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
8460: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
8470: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
8480: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
8490: 75 65 72 69 65 73 2e 20 20 54 68 65 20 72 65 73  ueries.  The res
84a0: 75 6c 74 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  ults should.** b
84b0: 65 20 73 74 6f 72 65 64 20 69 6e 20 65 44 65 73  e stored in eDes
84c0: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
84d0: 20 69 50 61 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69   iParm..*/.stati
84e0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
84f0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
8500: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
8510: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
8520: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8530: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63           /* Succ
8540: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
8550: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
8560: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
8570: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
8580: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
8590: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
85a0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
85b0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
85c0: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
85d0: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 62 61  VDBE */.  int ba
85e0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
85f0: 20 42 61 73 65 6c 69 6e 65 20 76 61 6c 75 65 20   Baseline value 
8600: 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  for pParse->nTab
8610: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
8620: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
8630: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8640: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
8650: 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20 2a  .  Only the .  *
8660: 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69 6e  * last SELECT in
8670: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
8680: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
8690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
86a0: 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  0 || p->pPrior==
86b0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
86c0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
86d0: 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  or;.  if( pPrior
86e0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
86f0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
8700: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8710: 73 67 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  sg,"ORDER BY cla
8720: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
8730: 61 66 74 65 72 20 22 2c 0a 20 20 20 20 20 20 73  after ",.      s
8740: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
8750: 70 29 2c 20 22 20 6e 6f 74 20 62 65 66 6f 72 65  p), " not before
8760: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
8770: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
8780: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
8790: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
87a0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
87b0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
87c0: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
87d0: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
87e0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
87f0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
8800: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
8810: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
8820: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
8830: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
8840: 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
8850: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  if( eDest==SRT_T
8860: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
8870: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8880: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
8890: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65  iParm, 0);.    e
88a0: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
88b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
88c0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
88d0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
88e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
88f0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20  ts..  */.  base 
8900: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
8910: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
8920: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
8930: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
8940: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
8950: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8960: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
8970: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
8980: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
8990: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
89a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
89b0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
89c0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  r = 0;.        r
89d0: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
89e0: 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
89f0: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
8a00: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  0);.        p->p
8a10: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
8a20: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
8a30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8a50: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
8a60: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
8a70: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
8a80: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
8a90: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
8aa0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
8ab0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
8ac0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
8ad0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
8ae0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
8af0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
8b00: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
8b10: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
8b20: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  t op;          /
8b30: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
8b40: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
8b50: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
8b60: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
8b70: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
8b80: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
8b90: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
8ba0: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
8bb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
8bc0: 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44  rBy;  /* The ORD
8bd0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
8be0: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
8bf0: 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f  T */..      prio
8c00: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
8c10: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
8c20: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
8c30: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
8c40: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
8c50: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
8c60: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
8c70: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
8c80: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
8c90: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
8ca0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
8cb0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
8cc0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
8cd0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
8ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
8cf0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
8d00: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
8d10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
8d20: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
8d30: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
8d40: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
8d50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8d60: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
8d70: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
8d80: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
8d90: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
8da0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
8db0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
8dc0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
8dd0: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
8de0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8df0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8e00: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
8e10: 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ALL ){.         
8e20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8e30: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
8e40: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
8e50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
8e60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
8e70: 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54  eyAsData, unionT
8e80: 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ab, 1);.        
8e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8ea0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8eb0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
8ec0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
8ed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8ee0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
8ef0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
8f00: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
8f10: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
8f20: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
8f30: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
8f40: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
8f50: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nTab, 0, 0, 0);.
8f60: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
8f70: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
8f80: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
8f90: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
8fa0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
8fb0: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
8fc0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
8fd0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
8fe0: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
8ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9000: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
9010: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
9020: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
9030: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
9040: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
9050: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
9060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9070: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
9080: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
9090: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
90a0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
90b0: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
90c0: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
90d0: 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e  se, p, op, union
90e0: 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Tab, 0, 0, 0);. 
90f0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
9100: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
9110: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
9120: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 69 66 28  derBy;.      if(
9130: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9140: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
9150: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
9160: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
9170: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
9180: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
9190: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
91a0: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
91b0: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
91c0: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
91d0: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
91e0: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
91f0: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
9200: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
9210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9220: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
9230: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
9240: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
9250: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
9260: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
9270: 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 30 2c 20  se, p->base, 0, 
9280: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
9290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
92a0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62  reak = sqliteVdb
92b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
92c0: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
92d0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
92e0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
92f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9300: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
9310: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
9320: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
9330: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
9340: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
9350: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
9360: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
9370: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
9380: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
9390: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
93c0: 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69  By, -1, eDest, i
93d0: 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61      iCont, iBrea
9400: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
9410: 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rc ) return 1;. 
9420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9430: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
9440: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
9450: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9460: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
9470: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
9480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
9490: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
94a0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
94b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
94c0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
94d0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
94e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
94f0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
9500: 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
9510: 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  ail(p, v, p->pEL
9520: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
9530: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t, iParm);.     
9540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9560: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
9570: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
9580: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
9590: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
95a0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
95b0: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
95c0: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
95d0: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
95e0: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
95f0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
9600: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
9610: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
9620: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
9630: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
9640: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
9650: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
9660: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
9670: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
9680: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
9690: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
96a0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
96b0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
96c0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
96d0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70  olumn(pParse,p,p
96e0: 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  ->pOrderBy,tab1,
96f0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  1) ){.        re
9700: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
9710: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9720: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
9730: 54 65 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a  Temp, tab1, 1);.
9740: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9750: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
9760: 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b  sData, tab1, 1);
9770: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
9780: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
9790: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
97a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
97b0: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
97c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
97d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
97e0: 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  rior, SRT_Union,
97f0: 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b   tab1, 0, 0, 0);
9800: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
9810: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
9820: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
9830: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
9840: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
9850: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
9860: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  /.      sqliteVd
9870: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
9880: 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29  enTemp, tab2, 1)
9890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
98a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
98b0: 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31  yAsData, tab2, 1
98c0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
98d0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  or = 0;.      rc
98e0: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
98f0: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
9900: 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30  nion, tab2, 0, 0
9910: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
9920: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
9930: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
9940: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
9950: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
9960: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
9970: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
9980: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
9990: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
99a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
99b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
99c0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  t );.      if( e
99d0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
99e0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65  ck ){.        ge
99f0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
9a00: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
9a10: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
9a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9a30: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56  iBreak = sqliteV
9a40: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9a50: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
9a60: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
9a70: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
9a80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9a90: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
9aa0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
9ab0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
9ac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
9ad0: 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30 29  ullKey, tab1, 0)
9ae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9af0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
9b00: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
9b10: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ont);.      rc =
9b20: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
9b30: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
9b40: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
9b50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
9b80: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
9b90: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
9bc0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69  iBreak);.      i
9bd0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31  f( rc ) return 1
9be0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9bf0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
9c00: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
9c10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9c20: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
9c30: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
9c40: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
9c50: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
9c60: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
9c70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9c80: 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
9c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9ca0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
9cb0: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
9cc0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
9cd0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67  rBy ){.        g
9ce0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
9cf0: 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
9d00: 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
9d10: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
9d20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9d30: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
9d40: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
9d50: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
9d60: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
9d70: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
9d80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
9d90: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9da0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9db0: 72 4d 73 67 2c 20 22 53 45 4c 45 43 54 73 20 74  rMsg, "SELECTs t
9dc0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
9dd0: 69 67 68 74 20 6f 66 20 22 2c 0a 20 20 20 20 20  ight of ",.     
9de0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
9df0: 3e 6f 70 29 2c 20 22 20 64 6f 20 6e 6f 74 20 68  >op), " do not h
9e00: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
9e10: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
9e20: 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a 20 20 20 20  lumns", 0);.    
9e30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9e40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9e50: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
9e60: 20 3d 20 62 61 73 65 3b 0a 20 20 72 65 74 75 72   = base;.  retur
9e70: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
9e80: 63 75 72 73 69 76 65 6c 79 20 73 63 61 6e 20 74  cursively scan t
9e90: 68 72 6f 75 67 68 20 61 6e 20 65 78 70 72 65 73  hrough an expres
9ea0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 46 6f 72 20  sion tree.  For 
9eb0: 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 0a  every reference.
9ec0: 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
9ed0: 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
9ee0: 46 72 6f 6d 2c 20 63 68 61 6e 67 65 20 74 68 61  From, change tha
9ef0: 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  t reference to t
9f00: 68 65 0a 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  he.** same colum
9f10: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
9f20: 72 20 69 54 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  r iTo..*/.static
9f30: 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c   void changeTabl
9f40: 65 73 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  es(Expr *pExpr, 
9f50: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
9f60: 54 6f 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  To){.  if( pExpr
9f70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9f80: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
9f90: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
9fa0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 46 72 6f 6d  r->iTable==iFrom
9fb0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
9fc0: 54 61 62 6c 65 20 3d 20 69 54 6f 3b 0a 20 20 7d  Table = iTo;.  }
9fd0: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
9fe0: 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c   void changeTabl
9ff0: 65 73 49 6e 4c 69 73 74 28 45 78 70 72 4c 69 73  esInList(ExprLis
a000: 74 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 20  t*, int, int);. 
a010: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28     changeTables(
a020: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 46  pExpr->pLeft, iF
a030: 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63  rom, iTo);.    c
a040: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70  hangeTables(pExp
a050: 72 2d 3e 70 52 69 67 68 74 2c 20 69 46 72 6f 6d  r->pRight, iFrom
a060: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e  , iTo);.    chan
a070: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 70  geTablesInList(p
a080: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 46 72  Expr->pList, iFr
a090: 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 7d 0a 7d 0a  om, iTo);.  }.}.
a0a0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
a0b0: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 45  geTablesInList(E
a0c0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
a0d0: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
a0e0: 54 6f 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  To){.  if( pList
a0f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
a100: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
a110: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
a120: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
a130: 62 6c 65 73 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  bles(pList->a[i]
a140: 2e 70 45 78 70 72 2c 20 69 46 72 6f 6d 2c 20 69  .pExpr, iFrom, i
a150: 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  To);.    }.  }.}
a160: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
a170: 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
a180: 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
a190: 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
a1a0: 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
a1b0: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
a1c0: 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
a1d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 72   copy of the cor
a1e0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 6e  responding.** en
a1f0: 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
a200: 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
a210: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
a220: 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
a230: 63 68 61 6e 67 65 64 2e 29 20 20 57 68 65 6e 20  changed.)  When 
a240: 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
a250: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
a260: 6e 20 70 45 4c 69 73 74 2c 20 63 68 61 6e 67 65  n pEList, change
a270: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74  .** references t
a280: 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
a290: 6c 65 20 69 53 75 62 20 69 6e 74 6f 20 72 65 66  le iSub into ref
a2a0: 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
a2b0: 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54   iTable..**.** T
a2c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
a2d0: 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
a2e0: 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
a2f0: 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
a300: 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
a310: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
a320: 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
a330: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
a340: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
a350: 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
a360: 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
a370: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
a380: 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
a390: 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
a3a0: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
a3b0: 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
a3c0: 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
a3d0: 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
a3e0: 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
a3f0: 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
a400: 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
a410: 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
a420: 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
a430: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
a440: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
a450: 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72  d substExpr(Expr
a460: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61   *pExpr, int iTa
a470: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
a480: 45 4c 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29  EList, int iSub)
a490: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
a4a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
a4b0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
a4c0: 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
a4d0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
a4e0: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
a4f0: 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  >=0 ){.    Expr 
a500: 2a 70 4e 65 77 3b 0a 20 20 20 20 61 73 73 65 72  *pNew;.    asser
a510: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
a520: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
a530: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
a540: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
a550: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
a560: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
a570: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  && pExpr->pList=
a580: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  =0 );.    pNew =
a590: 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
a5a0: 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
a5b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
a5c0: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 70 45 78  ew!=0 );.    pEx
a5d0: 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
a5e0: 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  p;.    pExpr->pL
a5f0: 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  eft = sqliteExpr
a600: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
a610: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
a620: 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ght = sqliteExpr
a630: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
a640: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  );.    pExpr->pL
a650: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
a660: 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ListDup(pNew->pL
a670: 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ist);.    pExpr-
a680: 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e  >iTable = pNew->
a690: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 45 78 70  iTable;.    pExp
a6a0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65  r->iColumn = pNe
a6b0: 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  w->iColumn;.    
a6c0: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
a6d0: 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 70 45  ew->iAgg;.    pE
a6e0: 78 70 72 2d 3e 74 6f 6b 65 6e 20 3d 20 70 4e 65  xpr->token = pNe
a6f0: 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  w->token;.    if
a700: 28 20 69 53 75 62 21 3d 69 54 61 62 6c 65 20 29  ( iSub!=iTable )
a710: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
a720: 62 6c 65 73 28 70 45 78 70 72 2c 20 69 53 75 62  bles(pExpr, iSub
a730: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d  , iTable);.    }
a740: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
a750: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
a760: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
a770: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 2c  *,int,ExprList*,
a780: 69 6e 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  int);.    substE
a790: 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
a7a0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
a7b0: 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62  , iSub);.    sub
a7c0: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52  stExpr(pExpr->pR
a7d0: 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
a7e0: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20  List, iSub);.   
a7f0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
a800: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
a810: 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75  ble, pEList, iSu
a820: 62 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  b);.  }.}.static
a830: 20 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72   void .substExpr
a840: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
a850: 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65  List, int iTable
a860: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
a870: 73 74 2c 20 69 6e 74 20 69 53 75 62 29 7b 0a 20  st, int iSub){. 
a880: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
a890: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
a8a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
a8b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
a8c0: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
a8d0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
a8e0: 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
a8f0: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a  t, iSub);.  }.}.
a900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a910: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
a920: 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
a930: 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
a940: 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
a950: 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
a960: 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
a970: 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
a980: 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
a990: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
a9a0: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
a9b0: 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
a9c0: 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
a9d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
a9e0: 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
a9f0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
aa00: 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
aa10: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
aa20: 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
aa30: 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
aa40: 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
aa50: 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
aa60: 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
aa70: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
aa80: 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
aa90: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
aaa0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
aab0: 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
aac0: 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
aad0: 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
aae0: 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
aaf0: 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
ab00: 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
ab10: 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
ab20: 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
ab30: 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
ab40: 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
ab50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
ab60: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
ab70: 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
ab80: 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
ab90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
aba0: 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
abb0: 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
abc0: 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
abd0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
abe0: 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
abf0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
ac00: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
ac10: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
ac20: 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
ac30: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
ac40: 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
ac50: 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
ac60: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
ac70: 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
ac80: 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
ac90: 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
aca0: 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
acb0: 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
acc0: 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
acd0: 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
ace0: 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
acf0: 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
ad00: 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
ad10: 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
ad20: 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
ad30: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
ad40: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
ad50: 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
ad60: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ad70: 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
ad80: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
ad90: 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
ada0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
adb0: 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
adc0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
add0: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
ade0: 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
adf0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  bquery is not a 
ae00: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34  join..**.**   (4
ae10: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ae20: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
ae30: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
ae40: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
ae50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
ae60: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
ae70: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
ae80: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
ae90: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
aea0: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
aeb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
aec0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
aed0: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
aee0: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
aef0: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
af00: 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
af10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
af20: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
af30: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
af40: 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
af50: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
af60: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
af70: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
af80: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
af90: 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
afa0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
afb0: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
afc0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
afd0: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
afe0: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
aff0: 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
b000: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
b010: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
b020: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
b030: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
b040: 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
b050: 49 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  IT..**.** In thi
b060: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
b070: 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
b080: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b090: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
b0a0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
b0b0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
b0c0: 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
b0d0: 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
b0e0: 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
b0f0: 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
b100: 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
b110: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
b120: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
b130: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
b140: 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
b150: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
b160: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
b170: 70 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a  p and return 0..
b180: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
b190: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
b1a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
b1b0: 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
b1c0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
b1d0: 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
b1e0: 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
b1f0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
b200: 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
b210: 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
b220: 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 69  utine runs..*/.i
b230: 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
b240: 72 79 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ry(Select *p, in
b250: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 73 41  t iFrom, int isA
b260: 67 67 2c 20 69 6e 74 20 73 75 62 71 75 65 72 79  gg, int subquery
b270: 49 73 41 67 67 29 7b 0a 20 20 53 65 6c 65 63 74  IsAgg){.  Select
b280: 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
b290: 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
b2a0: 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
b2b0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
b2c0: 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
b2d0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
b2e0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
b2f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
b300: 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
b310: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
b320: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
b330: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
b340: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
b350: 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
b360: 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
b370: 20 69 3b 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   i;.  int iParen
b380: 74 2c 20 69 53 75 62 3b 0a 20 20 45 78 70 72 20  t, iSub;.  Expr 
b390: 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43  *pWhere;..  /* C
b3a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
b3b0: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
b3c0: 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
b3d0: 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
b3e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b3f0: 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
b400: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
b410: 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
b420: 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
b430: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
b440: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d   = pSrc->a[iFrom
b450: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ].pSelect;.  ass
b460: 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
b470: 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
b480: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
b490: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
b4a0: 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
b4b0: 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
b4c0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53  eturn 0;.  pSubS
b4d0: 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
b4e0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
b4f0: 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  rc );.  if( pSub
b500: 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
b510: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
b520: 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
b530: 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74   || pSub->nLimit
b540: 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e  >=0) &&  (pSrc->
b550: 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
b560: 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
b570: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  0;.  }.  if( (p-
b580: 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
b590: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20  ->nLimit>=0) && 
b5a0: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
b5b0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
b5c0: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
b5d0: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
b5e0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
b5f0: 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65  ermitted for the
b600: 0a 20 20 2a 2a 20 69 2d 74 68 20 65 6e 74 72 79  .  ** i-th entry
b610: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
b620: 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72  use in the outer
b630: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69   query..  */.  i
b640: 50 61 72 65 6e 74 20 3d 20 70 2d 3e 62 61 73 65  Parent = p->base
b650: 20 2b 20 69 46 72 6f 6d 3b 0a 20 20 69 53 75 62   + iFrom;.  iSub
b660: 20 3d 20 70 53 75 62 2d 3e 62 61 73 65 3b 0a 20   = pSub->base;. 
b670: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
b680: 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
b690: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c  t, pSub->pEList,
b6a0: 20 69 53 75 62 29 3b 0a 20 20 70 4c 69 73 74 20   iSub);.  pList 
b6b0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  = p->pEList;.  f
b6c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
b6d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
b6e0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
b6f0: 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ].zName==0 ){.  
b700: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
b710: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
b720: 78 70 72 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  xpr;.      pList
b730: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
b740: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
b750: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
b760: 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
b770: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
b780: 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
b790: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
b7a0: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
b7b0: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
b7c0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
b7d0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
b7e0: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
b7f0: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 20 20  t, iSub);.  }.  
b800: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
b810: 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
b820: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
b830: 2c 20 69 53 75 62 29 3b 0a 20 20 69 66 28 20 70  , iSub);.  if( p
b840: 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
b850: 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
b860: 74 65 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  teExprDup(pSub->
b870: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28  pWhere);.    if(
b880: 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29   iParent!=iSub )
b890: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
b8a0: 62 6c 65 73 28 70 57 68 65 72 65 2c 20 69 53 75  bles(pWhere, iSu
b8b0: 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20  b, iParent);.   
b8c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b8d0: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
b8e0: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
b8f0: 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
b900: 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
b910: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
b920: 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
b930: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
b940: 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
b950: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
b960: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
b970: 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a  >pEList, iSub);.
b980: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 48      if( pSub->pH
b990: 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 45  aving ){.      E
b9a0: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 73  xpr *pHaving = s
b9b0: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 53 75  qliteExprDup(pSu
b9c0: 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  b->pHaving);.   
b9d0: 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d     if( iParent!=
b9e0: 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  iSub ){.        
b9f0: 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 48 61  changeTables(pHa
ba00: 76 69 6e 67 2c 20 69 53 75 62 2c 20 69 50 61 72  ving, iSub, iPar
ba10: 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ent);.      }.  
ba20: 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
ba30: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ng ){.        p-
ba40: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
ba50: 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d  eExpr(TK_AND, p-
ba60: 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76 69 6e  >pHaving, pHavin
ba70: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g, 0);.      }el
ba80: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  se{.        p->p
ba90: 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67  Having = pHaving
baa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bab0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
bac0: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
bad0: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
bae0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
baf0: 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  p(pSub->pGroupBy
bb00: 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  );.    if( iPare
bb10: 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20 20  nt!=iSub ){.    
bb20: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e    changeTablesIn
bb30: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
bb40: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
bb50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
bb60: 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30  if( p->pWhere==0
bb70: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72   ){.    p->pWher
bb80: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d 65  e = pWhere;.  }e
bb90: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
bba0: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50  pr(p->pWhere, iP
bbb0: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
bbc0: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
bbd0: 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20  if( pWhere ){.  
bbe0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
bbf0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e  sqliteExpr(TK_AN
bc00: 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  D, p->pWhere, pW
bc10: 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  here, 0);.    }.
bc20: 20 20 7d 0a 20 20 70 2d 3e 69 73 44 69 73 74 69    }.  p->isDisti
bc30: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
bc40: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
bc50: 69 73 74 69 6e 63 74 3b 0a 20 20 69 66 28 20 70  istinct;.  if( p
bc60: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29  Sub->nLimit>=0 )
bc70: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69  {.    if( p->nLi
bc80: 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  mit<0 ){.      p
bc90: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
bca0: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c  >nLimit;.    }el
bcb0: 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  se if( p->nLimit
bcc0: 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53  +p->nOffset > pS
bcd0: 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d  ub->nLimit+pSub-
bce0: 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >nOffset ){.    
bcf0: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53    p->nLimit = pS
bd00: 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75  ub->nLimit + pSu
bd10: 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e  b->nOffset - p->
bd20: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20  nOffset;.    }. 
bd30: 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20   }.  p->nOffset 
bd40: 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  += pSub->nOffset
bd50: 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b  ;.  if( pSrc->a[
bd60: 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70  iFrom].pTab && p
bd70: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54  Src->a[iFrom].pT
bd80: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
bd90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  ){.    sqliteDel
bda0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63  eteTable(0, pSrc
bdb0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29  ->a[iFrom].pTab)
bdc0: 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 61 5b  ;.  }.  pSrc->a[
bdd0: 69 46 72 6f 6d 5d 2e 70 54 61 62 20 3d 20 70 53  iFrom].pTab = pS
bde0: 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  ubSrc->a[0].pTab
bdf0: 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30  ;.  pSubSrc->a[0
be00: 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 70 53  ].pTab = 0;.  pS
be10: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65  rc->a[iFrom].pSe
be20: 6c 65 63 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  lect = pSubSrc->
be30: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
be40: 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  pSubSrc->a[0].pS
be50: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c  elect = 0;.  sql
be60: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
be70: 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
be80: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
be90: 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
bea0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
beb0: 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
bec0: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
bed0: 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
bee0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
bef0: 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
bf00: 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
bf10: 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
bf20: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
bf30: 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
bf40: 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
bf50: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
bf60: 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
bf70: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
bf80: 45 43 54 20 72 65 74 75 72 6e 20 31 2e 20 20 49  ECT return 1.  I
bf90: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
bfa0: 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  .** simple min()
bfb0: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c   or max() query,
bfc0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a   then return 0;.
bfd0: 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d  **.** A simply m
bfe0: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
bff0: 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ery looks like t
c000: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
c010: 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d  LECT min(a) FROM
c020: 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45   table;.**    SE
c030: 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d  LECT max(a) FROM
c040: 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68   table;.**.** Th
c050: 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65  e query may have
c060: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
c070: 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d  able in its FROM
c080: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72   argument.  Ther
c090: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47  e.** can be no G
c0a0: 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
c0b0: 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73  G or WHERE claus
c0c0: 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  es.  The result 
c0d0: 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74  set must.** be t
c0e0: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
c0f0: 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f  ) of a single co
c100: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
c110: 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a  e.  The column.*
c120: 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f  * in the min() o
c130: 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
c140: 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64   must be indexed
c150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ..**.** The para
c160: 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72  meters to this r
c170: 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73  outine are the s
c180: 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74  ame as for sqlit
c190: 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  eSelect()..** Se
c1a0: 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
c1b0: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
c1c0: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
c1d0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
c1e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c1f0: 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
c200: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c210: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
c220: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
c230: 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
c240: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
c250: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
c260: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
c270: 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
c280: 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a  ;.  int openOp;.
c290: 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
c2a0: 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72  int cont;.  Expr
c2b0: 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20 20 73 74  List eList;.  st
c2c0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c2d0: 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20  em eListItem;.. 
c2e0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
c2f0: 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69   if this query i
c300: 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
c310: 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
c320: 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65    Return.  ** ze
c330: 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74  ro if it is  not
c340: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
c350: 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70  pGroupBy || p->p
c360: 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68  Having || p->pWh
c370: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ere ) return 0;.
c380: 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e    if( p->pSrc->n
c390: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
c3a0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  0;.  if( p->pELi
c3b0: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
c3c0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
c3d0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
c3e0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
c3f0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
c400: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
c410: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
c420: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  pr->pList==0 || 
c430: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
c440: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
c450: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
c460: 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
c470: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
c480: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70  iteStrNICmp(pExp
c490: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
c4a0: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
c4b0: 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
c4c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
c4d0: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78  liteStrNICmp(pEx
c4e0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
c4f0: 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
c500: 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b  eekOp = OP_Last;
c510: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
c520: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45  turn 0;.  }.  pE
c530: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  xpr = pExpr->pLi
c540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c550: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
c560: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
c570: 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20  urn 0;.  iCol = 
c580: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
c590: 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
c5a0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
c5b0: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  /* If we get to 
c5c0: 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  here, it means t
c5d0: 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74  he query is of t
c5e0: 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e  he correct form.
c5f0: 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
c600: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
c610: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61   an index and ma
c620: 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  ke pIdx point to
c630: 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70   the.  ** approp
c640: 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66  riate index.  If
c650: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
c660: 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54  x() is on an INT
c670: 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a  EGER PRIMARY.  *
c680: 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f  * key column, no
c690: 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73   index is necess
c6a0: 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20  ary so set pIdx 
c6b0: 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a  to NULL.  If no.
c6c0: 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65    ** usable inde
c6d0: 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75  x is found, retu
c6e0: 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
c6f0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70   iCol<0 ){.    p
c700: 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
c710: 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  {.    for(pIdx=p
c720: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
c730: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
c740: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
c750: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
c760: 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
c770: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
c780: 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61  [0]==iCol ) brea
c790: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
c7a0: 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
c7b0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
c7c0: 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
c7d0: 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
c7e0: 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
c7f0: 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
c800: 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
c810: 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
c820: 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
c830: 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
c840: 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  cell..  */.  v =
c850: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
c860: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
c870: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
c880: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
c890: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
c8a0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
c8b0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62  mes(pParse, p->b
c8c0: 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d  ase, p->pSrc, p-
c8d0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
c8e0: 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63   /* Generating c
c8f0: 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ode to find the 
c900: 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20  min or the max. 
c910: 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77   Basically all w
c920: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
c930: 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69  o is find the fi
c940: 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20  rst or the last 
c950: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f  entry in the cho
c960: 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20  sen index.  If. 
c970: 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   ** the min() or
c980: 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65   max() is on the
c990: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c9a0: 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20   KEY, then find 
c9b0: 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f  the first.  ** o
c9c0: 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  r last entry in 
c9d0: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
c9e0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
c9f0: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
ca00: 65 64 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64  ed && (pParse->d
ca10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
ca20: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
ca30: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
ca40: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
ca50: 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d  yCookie, pParse-
ca60: 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  >db->schema_cook
ca70: 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  ie, 0);.    pPar
ca80: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
ca90: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6f 70  ed = 1;.  }.  op
caa0: 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73 54  enOp = pTab->isT
cab0: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78  emp ? OP_OpenAux
cac0: 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20 62 61   : OP_Open;.  ba
cad0: 73 65 20 3d 20 70 2d 3e 62 61 73 65 3b 0a 20 20  se = p->base;.  
cae0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
caf0: 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2c  v, openOp, base,
cb00: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
cb10: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
cb20: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
cb30: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
cb40: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
cb50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
cb60: 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
cb70: 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  p, base, 0);.  }
cb80: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
cb90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65  VdbeAddOp(v, ope
cba0: 6e 4f 70 2c 20 62 61 73 65 2b 31 2c 20 70 49 64  nOp, base+1, pId
cbb0: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71  x->tnum);.    sq
cbc0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
cbd0: 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
cbe0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
cbf0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
cc00: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
cc10: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
cc20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cc30: 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20  v, OP_IdxRecno, 
cc40: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
cc50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cc60: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
cc70: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
cc80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
cc90: 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c  OP_MoveTo, base,
cca0: 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
ccb0: 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
ccc0: 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
ccd0: 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
cce0: 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
ccf0: 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
cd00: 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
cd10: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 63 6f  pr = pExpr;.  co
cd20: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
cd30: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73  akeLabel(v);.  s
cd40: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
cd50: 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74  Parse, p, &eList
cd60: 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65  , 0, 0, 0, -1, e
cd70: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e  Dest, iParm, con
cd80: 74 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  t, cont);.  sqli
cd90: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
cda0: 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73  el(v, cont);.  s
cdb0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
cdc0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
cdd0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  , 0);.  return 1
cde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
cdf0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
ce00: 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
ce10: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
ce20: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
ce30: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
ce40: 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
ce50: 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76  ding on the.** v
ce60: 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e  alue of eDest an
ce70: 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  d iParm..**.**  
ce80: 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20     eDest Value  
ce90: 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20       Result.**  
cea0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
ceb0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
cee0: 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
cef0: 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
cf00: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
cf10: 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
cf20: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
cf30: 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
cf40: 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
cf50: 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
cf60: 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  l iParm.**.**   
cf70: 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
cf80: 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
cf90: 61 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62  as keys of a tab
cfa0: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
cfb0: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
cfc0: 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
cfd0: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
cfe0: 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
cff0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
d000: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
d010: 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
d020: 65 20 72 65 73 75 6c 74 73 20 66 6f 72 6d 20 74  e results form t
d030: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
d040: 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
d050: 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20      SRT_Table   
d060: 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
d070: 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
d080: 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
d090: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
d0a0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
d0b0: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
d0c0: 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
d0d0: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
d0e0: 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
d0f0: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
d100: 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
d110: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
d120: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d130: 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
d140: 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
d150: 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
d160: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
d170: 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
d180: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
d190: 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
d1a0: 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
d1b0: 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
d1c0: 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
d1d0: 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
d1e0: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
d1f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
d200: 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
d210: 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
d220: 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
d230: 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
d240: 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
d250: 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
d260: 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
d270: 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
d280: 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
d290: 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
d2a0: 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
d2b0: 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
d2c0: 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
d2d0: 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
d2e0: 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
d2f0: 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
d300: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
d310: 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  eSelect(.  Parse
d320: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d330: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
d340: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
d350: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
d360: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
d370: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
d380: 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
d390: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
d3a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20       /* One of: 
d3b0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d  SRT_Callback Mem
d3c0: 20 53 65 74 20 55 6e 69 6f 6e 20 45 78 63 65 70   Set Union Excep
d3d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
d3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d3f0: 20 53 61 76 65 20 72 65 73 75 6c 74 20 69 6e 20   Save result in 
d400: 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  this memory loca
d410: 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a  tion, if >=0 */.
d420: 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
d430: 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
d440: 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
d450: 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
d460: 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
d470: 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
d480: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
d490: 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
d4a0: 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
d4b0: 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
d4c0: 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g        /* True
d4d0: 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
d4e0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
d4f0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ions */.){.  int
d500: 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   i;.  WhereInfo 
d510: 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20  *pWInfo;.  Vdbe 
d520: 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20  *v;.  int isAgg 
d530: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
d540: 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
d550: 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
d560: 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
d570: 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
d580: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
d590: 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
d5a0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d5b0: 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
d5c0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
d5d0: 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
d5e0: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
d5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d600: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
d610: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
d620: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
d630: 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
d640: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
d650: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
d660: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
d670: 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
d680: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
d690: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
d6a0: 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
d6b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
d6c0: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
d6d0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
d6e0: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
d6f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
d700: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
d710: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
d720: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
d730: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
d740: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
d750: 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
d760: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61   set */.  int ba
d770: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
d780: 20 2f 2a 20 46 69 72 73 74 20 63 75 72 73 6f 72   /* First cursor
d790: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
d7a0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  se */.  int rc =
d7b0: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
d7c0: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
d7d0: 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
d7e0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  tion */..  if( s
d7f0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
d800: 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
d810: 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65  Err || p==0 ) re
d820: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  turn 1;..  /* If
d830: 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
d840: 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
d850: 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
d860: 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
d870: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
d880: 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
d890: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
d8a0: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
d8b0: 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   iParm);.  }..  
d8c0: 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
d8d0: 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
d8e0: 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
d8f0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
d900: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
d910: 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
d920: 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72  pWhere;.  pOrder
d930: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
d940: 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
d950: 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
d960: 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
d970: 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  ng;.  isDistinct
d980: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
d990: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
d9a0: 20 61 20 62 6c 6f 63 6b 20 6f 66 20 56 44 42 45   a block of VDBE
d9b0: 20 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 66 6f   cursors, one fo
d9c0: 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20  r each table in 
d9d0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
d9e0: 0a 20 20 2a 2a 20 54 68 65 20 57 48 45 52 45 20  .  ** The WHERE 
d9f0: 70 72 6f 63 65 73 73 69 6e 67 20 72 65 71 75 69  processing requi
da00: 72 65 73 20 74 68 61 74 20 74 68 65 20 63 75 72  res that the cur
da10: 73 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61 62  sors for the tab
da20: 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
da30: 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 65 20 63  FROM clause be c
da40: 6f 6e 73 65 63 75 74 69 76 65 2e 0a 20 20 2a 2f  onsecutive..  */
da50: 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73  .  base = p->bas
da60: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
da70: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
da80: 20 2b 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   += pTabList->nS
da90: 72 63 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rc;..  /* .  ** 
daa0: 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
dab0: 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
dac0: 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
dad0: 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
dae0: 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
daf0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
db00: 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
db10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
db20: 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
db30: 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  _end;..  /* Look
db40: 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
db50: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
db60: 74 20 61 6e 64 20 63 72 65 61 74 65 20 61 6e 20  t and create an 
db70: 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a  appropriate.  **
db80: 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 69 6e 20 70   columnlist in p
db90: 45 4c 69 73 74 20 69 66 20 74 68 65 72 65 20 69  EList if there i
dba0: 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 64 79  sn't one already
dbb0: 2e 20 20 28 54 68 65 20 70 61 72 73 65 72 20 6c  .  (The parser l
dbc0: 65 61 76 65 73 0a 20 20 2a 2a 20 61 20 4e 55 4c  eaves.  ** a NUL
dbd0: 4c 20 69 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69  L in the p->pELi
dbe0: 73 74 20 69 66 20 74 68 65 20 53 51 4c 20 73 61  st if the SQL sa
dbf0: 69 64 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  id "SELECT * FRO
dc00: 4d 20 2e 2e 2e 22 29 0a 20 20 2a 2f 0a 20 20 69  M ...").  */.  i
dc10: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
dc20: 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29  ist(pParse, p) )
dc30: 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
dc40: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68  t_end;.  }.  pWh
dc50: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
dc60: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
dc70: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
dc80: 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ist==0 ) goto se
dc90: 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
dca0: 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
dcb0: 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
dcc0: 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
dcd0: 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
dce0: 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
dcf0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44  ..  */.  if( (eD
dd00: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
dd10: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
dd20: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
dd30: 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
dd40: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
dd50: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c  e->zErrMsg, "onl
dd60: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
dd70: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
dd80: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
dd90: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
dda0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 2c   an expression",
ddb0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
ddc0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
ddd0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
dde0: 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  }..  /* ORDER BY
ddf0: 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
de00: 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
de10: 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
de20: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
de30: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20  ase SRT_Union:. 
de40: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
de50: 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  pt:.    case SRT
de60: 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20  _Discard:.      
de70: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
de80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
de90: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72  efault:.      br
dea0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  eak;.  }..  /* A
deb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
dec0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c   should have all
ded0: 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63  ocated all the c
dee0: 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20  ursors that we. 
def0: 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64   ** need to hand
df00: 6c 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64  le subquerys and
df10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
df20: 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  s.  .  **.  ** R
df30: 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d  esolve the colum
df40: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61  n names and do a
df50: 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b   semantics check
df60: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72   on all the expr
df70: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
df80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
df90: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
dfa0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
dfb0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
dfc0: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
dfd0: 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  ist, 0, pEList->
dfe0: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
dff0: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
e000: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
e010: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
e020: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69  eck(pParse, pELi
e030: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
e040: 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20  1, &isAgg) ){.  
e050: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
e060: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  end;.    }.  }. 
e070: 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20   if( pWhere ){. 
e080: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
e090: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
e0a0: 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69  se, base, pTabLi
e0b0: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65  st, pEList, pWhe
e0c0: 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  re) ){.      got
e0d0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
e0e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
e0f0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
e100: 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  se, pWhere, 0, 0
e110: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
e120: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e130: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 64  }.  }.  if( pOrd
e140: 65 72 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  erBy ){.    for(
e150: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
e160: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
e170: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
e180: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
e190: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
e1a0: 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
e1b0: 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
e1c0: 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
e1d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
e1e0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
e1f0: 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20   &iCol)==0 ){.  
e200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
e210: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
e220: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
e230: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
e240: 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
e250: 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
e260: 72 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 30 29  r constants", 0)
e270: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
e280: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
e290: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
e2a0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
e2b0: 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30  else if( iCol<=0
e2c0: 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
e2d0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
e2e0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
e2f0: 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  00];.          s
e300: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 4f 52 44  printf(zBuf,"ORD
e310: 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d  ER BY column num
e320: 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61  ber %d out of ra
e330: 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
e340: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
e350: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
e360: 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d  ", iCol, pEList-
e370: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
e380: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
e390: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
e3a0: 4d 73 67 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  Msg, zBuf, 0);. 
e3b0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
e3c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
e3d0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
e3e0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
e3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
e400: 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20  Delete(pE);.    
e410: 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42      pE = pOrderB
e420: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  y->a[i].pExpr = 
e430: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45  sqliteExprDup(pE
e440: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
e450: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
e460: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e470: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
e480: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61  Parse, base, pTa
e490: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
e4a0: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
e4b0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
e4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e4d0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
e4e0: 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
e4f0: 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
e500: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
e510: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
e520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75  .  }.  if( pGrou
e530: 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  pBy ){.    for(i
e540: 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
e550: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e560: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47     Expr *pE = pG
e570: 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
e580: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
e590: 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61  liteExprIsConsta
e5a0: 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
e5b0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
e5c0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
e5d0: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sg, .           
e5e0: 20 20 22 47 52 4f 55 50 20 42 59 20 65 78 70 72    "GROUP BY expr
e5f0: 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6e  essions should n
e600: 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c  ot be constant",
e610: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
e620: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
e630: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
e640: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
e650: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
e660: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
e670: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
e680: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  ist, pEList, pE)
e690: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
e6a0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
e6b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
e6c0: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
e6d0: 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67  Parse, pE, isAgg
e6e0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
e6f0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
e700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e710: 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
e720: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f   ){.    if( pGro
e730: 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
e740: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
e750: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
e760: 67 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  g, "a GROUP BY c
e770: 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
e780: 64 20 22 0a 20 20 20 20 20 20 20 20 20 22 62 65  d ".         "be
e790: 66 6f 72 65 20 48 41 56 49 4e 47 22 2c 20 30 29  fore HAVING", 0)
e7a0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
e7b0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
e7c0: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
e7d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
e7e0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
e7f0: 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
e800: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
e810: 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
e820: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
e830: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
e840: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
e850: 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
e860: 6e 67 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  ng, isAgg, 0) ){
e870: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
e880: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
e890: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
e8a0: 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
e8b0: 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
e8c0: 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
e8d0: 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
e8e0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
e8f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
e900: 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
e910: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
e920: 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
e930: 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
e940: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
e950: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
e960: 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
e970: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
e980: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e990: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
e9a0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
e9b0: 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
e9c0: 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
e9d0: 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 69 6e 20  ill be using in 
e9e0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  the callback.  T
e9f0: 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
ea00: 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
ea10: 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
ea20: 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20  to a table or a 
ea30: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a  memory cell..  *
ea40: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
ea50: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
ea60: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
ea70: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
ea80: 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  ->base, pTabList
ea90: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
eaa0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
eab0: 69 74 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  iter.  */.  if( 
eac0: 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a  p->nLimit<=0 ){.
ead0: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
eae0: 2d 31 3b 0a 20 20 20 20 70 2d 3e 6e 4f 66 66 73  -1;.    p->nOffs
eaf0: 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  et = 0;.  }else{
eb00: 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
eb10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
eb20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
eb30: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
eb40: 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30  r, -p->nLimit, 0
eb50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
eb60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
eb70: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b  Store, iMem, 1);
eb80: 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d  .    p->nLimit =
eb90: 20 69 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 70   iMem;.    if( p
eba0: 2d 3e 6e 4f 66 66 73 65 74 3c 3d 30 20 29 7b 0a  ->nOffset<=0 ){.
ebb0: 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
ebc0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
ebd0: 0a 20 20 20 20 20 20 69 4d 65 6d 20 3d 20 70 50  .      iMem = pP
ebe0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
ebf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ec00: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
ec10: 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20  r, -p->nOffset, 
ec20: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ec30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ec40: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
ec50: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66  1);.      p->nOf
ec60: 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 20  fset = iMem;.   
ec70: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e   }.  }..  /* Gen
ec80: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
ec90: 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
eca0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
ecb0: 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  e.  */.  for(i=0
ecc0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
ecd0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rc; i++){.    if
ece0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
ecf0: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  .pSelect==0 ) co
ed00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69  ntinue;.    sqli
ed10: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
ed20: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
ed30: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d  pSelect, SRT_Tem
ed40: 70 54 61 62 6c 65 2c 20 62 61 73 65 2b 69 2c 0a  pTable, base+i,.
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 70 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a   p, i, &isAgg);.
ed70: 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
ed80: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65  ->pSrc;.    pWhe
ed90: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
eda0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
edb0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
edc0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
edd0: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
ede0: 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20   }.    pGroupBy 
edf0: 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
ee00: 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e     pHaving = p->
ee10: 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44  pHaving;.    isD
ee20: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
ee30: 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20  istinct;.  }..  
ee40: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
ee50: 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62  if this is a sub
ee60: 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62  query that can b
ee70: 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e  e "flattened" in
ee80: 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20  to its parent.. 
ee90: 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e   ** If flattenin
eea0: 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74  g is a possiblit
eeb0: 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74  y, do so and ret
eec0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
eed0: 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50    .  */.  if( pP
eee0: 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74  arent && pParent
eef0: 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61  Agg &&.      fla
ef00: 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
ef10: 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
ef20: 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
ef30: 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
ef40: 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
ef50: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Agg = 1;.    ret
ef60: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
ef70: 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
ef80: 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
ef90: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
efa0: 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
efb0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
efc0: 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
efd0: 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
efe0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
eff0: 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d  _OpenTemp, iParm
f000: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
f010: 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
f020: 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  f aggregate expr
f030: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
f040: 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
f050: 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29  nfoReset(pParse)
f060: 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  ;.  if( isAgg ){
f070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f080: 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a  rse->nAgg==0 );.
f090: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f0a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
f0b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
f0c0: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
f0d0: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
f0e0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
f0f0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
f100: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
f110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f120: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
f130: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
f140: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
f150: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
f160: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
f170: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
f180: 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f  tes(pParse, pGro
f190: 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
f1a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
f1b0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
f1c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f1d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f1e0: 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74  pHaving && sqlit
f1f0: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
f200: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
f210: 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20  Having) ){.     
f220: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
f230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f240: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
f260: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
f270: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
f280: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
f290: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
f2a0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
f2b0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
f2c0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
f2d0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
f2e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f2f0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
f300: 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20  the aggregator. 
f310: 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
f320: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
f330: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
f340: 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65  Reset, 0, pParse
f350: 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72  ->nAgg);.    for
f360: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
f370: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
f380: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
f390: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75  ;.      if( (pFu
f3a0: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  nc = pParse->aAg
f3b0: 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26  g[i].pFunc)!=0 &
f3c0: 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69  & pFunc->xFinali
f3d0: 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
f3e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f3f0: 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20  (v, OP_AggInit, 
f400: 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 73  0, i);.        s
f410: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
f420: 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  3(v, -1, (char*)
f430: 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45  pFunc, P3_POINTE
f440: 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  R);.      }.    
f450: 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  }.    if( pGroup
f460: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
f470: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f480: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
f490: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f4a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f4b0: 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b  AggFocus, 0, 0);
f4c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f4d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
f4e0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e  memory cell to N
f4f0: 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ULL.  */.  if( e
f500: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b  Dest==SRT_Mem ){
f510: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f520: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
f530: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
f540: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f550: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
f560: 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
f570: 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  /* Open a tempor
f580: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65  ary table to use
f590: 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
f5a0: 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
f5b0: 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
f5c0: 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
f5d0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
f5e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f5f0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
f600: 70 2c 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b  p, distinct, 1);
f610: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
f620: 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
f630: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65  ..  /* Begin the
f640: 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
f650: 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
f660: 71 6c 69 74 65 57 68 65 72 65 42 65 67 69 6e 28  qliteWhereBegin(
f670: 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c  pParse, p->base,
f680: 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
f690: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20     pGroupBy ? 0 
f6c0: 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  : &pOrderBy);.  
f6d0: 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
f6e0: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
f6f0: 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  ..  /* Use the s
f700: 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
f710: 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  op if we are not
f720: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
f730: 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20  ** aggregates.  
f740: 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
f750: 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  ){.    if( selec
f760: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
f770: 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
f780: 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
f790: 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f     iParm, pWInfo
f7c0: 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
f7d0: 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a  nfo->iBreak) ){.
f7e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
f7f0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
f800: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
f810: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
f820: 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20  ggregates, then 
f830: 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 61  do the special a
f840: 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72  ggregate.  ** pr
f850: 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f  ocessing.  .  */
f860: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28  .  else{.    if(
f870: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
f880: 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20     int lbl1;.   
f890: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
f8a0: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
f8b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
f8c0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
f8d0: 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
f8e0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
f8f0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
f900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
f910: 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79  akeKey, pGroupBy
f920: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
f930: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64     if( pParse->d
f940: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
f950: 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79  4 ) sqliteAddKey
f960: 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42 79  Type(v, pGroupBy
f970: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
f980: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
f990: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
f9a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f9b0: 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
f9c0: 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f   lbl1);.      fo
f9d0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
f9e0: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
f9f0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
fa00: 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
fa10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
fa20: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
fa30: 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  e(pParse, pParse
fa40: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29  ->aAgg[i].pExpr)
fa50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fa60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fa70: 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20  AggSet, 0, i);. 
fa80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
fa90: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
faa0: 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
fab0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
fac0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
fad0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
fae0: 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74  r *pE;.      int
faf0: 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   j;.      if( !p
fb00: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
fb10: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
fb20: 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61 72  .      pE = pPar
fb30: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
fb40: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
fb50: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
fb60: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
fb70: 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20    if( pE->pList 
fb80: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
fb90: 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d  =0; j<pE->pList-
fba0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
fbb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
fbc0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fbd0: 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  E->pList->a[j].p
fbe0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
fbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fc00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fc10: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
fc20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
fc30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
fc40: 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d  _AggFunc, 0, pE-
fc50: 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69  >pList ? pE->pLi
fc60: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
fc70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
fc80: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
fc90: 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unc!=0 );.      
fca0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
fcb0: 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78  aAgg[i].pFunc->x
fcc0: 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
fcd0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
fce0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
fcf0: 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  *)pParse->aAgg[i
fd00: 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e  ].pFunc, P3_POIN
fd10: 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TER);.    }.  }.
fd20: 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61  .  /* End the da
fd30: 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
fd40: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57  ..  */.  sqliteW
fd50: 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
fd60: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
fd70: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
fd80: 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20  egates, we need 
fd90: 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f  to set up a seco
fda0: 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65  nd loop.  ** ove
fdb0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67  r all of the agg
fdc0: 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e  regate values an
fdd0: 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a  d process them..
fde0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
fdf0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61   ){.    int enda
fe00: 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  gg = sqliteVdbeM
fe10: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
fe20: 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20   int startagg;. 
fe30: 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71     startagg = sq
fe40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fe50: 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
fe60: 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61  endagg);.    pPa
fe70: 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b  rse->useAgg = 1;
fe80: 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
fe90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fea0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
feb0: 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
fec0: 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
fed0: 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
fee0: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
fef0: 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
ff00: 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
ff10: 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
ff40: 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20  , endagg) ){.   
ff50: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
ff60: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
ff70: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ff80: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61   OP_Goto, 0, sta
ff90: 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69  rtagg);.    sqli
ffa0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
ffb0: 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
ffc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ffd0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
ffe0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
fff0: 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20  ->useAgg = 0;.  
10000 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
10010 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
10020 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
10030 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
10040 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
10050 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
10060 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
10070 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
10080 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
10090 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
100a0 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74  ail(p, v, pEList
100b0 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
100c0 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20  iParm);.  }...  
100d0 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20  /* Issue a null 
100e0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74  callback if that
100f0 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73 65   is what the use
10100 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  r wants..  */.  
10110 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
10120 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
10130 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30  NullCallback)!=0
10140 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   && eDest==SRT_C
10150 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  allback ){.    s
10160 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10170 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  , OP_NullCallbac
10180 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  k, pEList->nExpr
10190 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
101a0 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
101b0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
101c0 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
101d0 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
101e0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
101f0 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
10200 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
10210 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
10220 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
10230 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
10240 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
10250 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
10260 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
10270 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
10280 5f 65 6e 64 3a 0a 20 20 70 50 61 72 73 65 2d 3e  _end:.  pParse->
10290 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20 73  nTab = base;.  s
102a0 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
102b0 66 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  foReset(pParse);
102c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.