/ Hex Artifact Content
Login

Artifact 92ffd8b5ef96c801f469b658a13bcaa22b1bac13:


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 30  select.c,v 1.100
0200: 20 32 30 30 32 2f 30 36 2f 32 36 20 30 32 3a 34   2002/06/26 02:4
0210: 35 3a 30 34 20 64 72 68 20 45 78 70 20 24 0a 2a  5:04 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 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 32 61 20 3d 20  ummy);.  pE2a = 
1260: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
1270: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1280: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1290: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b1->zName;.  dum
12a0: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
12b0: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d  mmy.z);.  pE1b =
12c0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
12d0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
12e0: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
12f0: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
1300: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
1310: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
1320: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
1330: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1340: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1350: 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  teExpr(TK_DOT, p
1360: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1370: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78   pE2c = sqliteEx
1380: 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  pr(TK_DOT, pE2b,
1390: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
13a0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
13b0: 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20  EQ, pE1c, pE2c, 
13c0: 30 29 3b 0a 20 20 70 45 2d 3e 69 73 4a 6f 69 6e  0);.  pE->isJoin
13d0: 45 78 70 72 20 3d 20 31 3b 0a 20 20 69 66 28 20  Expr = 1;.  if( 
13e0: 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a  *ppExpr ){.    *
13f0: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45  ppExpr = sqliteE
1400: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45  xpr(TK_AND, *ppE
1410: 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d  xpr, pE, 0);.  }
1420: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 45 78 70  else{.    *ppExp
1430: 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r = pE;.  }.}../
1440: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
1450: 72 2e 69 73 4a 6f 69 6e 45 78 70 72 20 66 6c 61  r.isJoinExpr fla
1460: 67 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  g on all terms o
1470: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
1480: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
1490: 65 20 45 78 70 72 2e 69 73 4a 6f 69 6e 45 78 70  e Expr.isJoinExp
14a0: 72 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 61  r flag is used a
14b0: 74 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  t on terms of an
14c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
14d0: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
14e0: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
14f0: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
1500: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
1510: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
1520: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 61 6e  n restriction an
1530: 64 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20  d not a part of 
1540: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
1550: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
1560: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1570: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
1580: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  p){.  while( p )
1590: 7b 0a 20 20 20 20 70 2d 3e 69 73 4a 6f 69 6e 45  {.    p->isJoinE
15a0: 78 70 72 20 3d 20 31 3b 0a 20 20 20 20 73 65 74  xpr = 1;.    set
15b0: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
15c0: 74 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  t);.    p = p->p
15d0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
15e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15f0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1600: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1610: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1620: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1630: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1640: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1650: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1660: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1670: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
1680: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
1690: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
16a0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
16b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
16c0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
16d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
16e0: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
16f0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
1700: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
1710: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1720: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
1730: 53 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Src;.  int i, j;
1740: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1750: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
1760: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
1770: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
1780: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  rcList_item *pTe
1790: 72 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d  rm = &pSrc->a[i]
17a0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
17b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 74 68 65  List_item *pOthe
17c0: 72 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 2b 31  r = &pSrc->a[i+1
17d0: 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 65 72  ];..    if( pTer
17e0: 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 70 4f  m->pTab==0 || pO
17f0: 74 68 65 72 2d 3e 70 54 61 62 3d 3d 30 20 29 20  ther->pTab==0 ) 
1800: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
1810: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
1820: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
1830: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
1840: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
1850: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
1860: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
1870: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
1880: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
1890: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
18a0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
18b0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 54  TURAL ){.      T
18c0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
18d0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
18e0: 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e   || pTerm->pUsin
18f0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1900: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
1910: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
1920: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
1930: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
1940: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
1950: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
1960: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
1970: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
1980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
19a0: 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54 61 62  ab = pTerm->pTab
19b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
19c0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
19d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19e0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74   columnIndex(pOt
19f0: 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61 62 2d  her->pTab, pTab-
1a00: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3e  >aCol[j].zName)>
1a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a20: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 54 61  addWhereTerm(pTa
1a30: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1a40: 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72 2d 3e  , pTab, pOther->
1a50: 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72 65  pTab, &p->pWhere
1a60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a70: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1a80: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
1a90: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1aa0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1ab0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
1ac0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e    if( pTerm->pOn
1ad0: 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e   && pTerm->pUsin
1ae0: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
1af0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
1b00: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 63 61  se->zErrMsg, "ca
1b10: 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f  nnot have both O
1b20: 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20  N and USING ".  
1b30: 20 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69        "clauses i
1b40: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22  n the same join"
1b50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
1b60: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
1b70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1b80: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
1b90: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
1ba0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
1bb0: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
1bc0: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
1bd0: 61 6e 64 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  and AND operator
1be0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bf0: 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20   pTerm->pOn ){. 
1c00: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
1c10: 28 70 54 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  (pTerm->pOn);.  
1c20: 20 20 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72      if( p->pWher
1c30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1c40: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 54 65 72  p->pWhere = pTer
1c50: 6d 2d 3e 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65  m->pOn;.      }e
1c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
1c70: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45  pWhere = sqliteE
1c80: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70  xpr(TK_AND, p->p
1c90: 57 68 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f  Where, pTerm->pO
1ca0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n, 0);.      }. 
1cb0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20       pTerm->pOn 
1cc0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1cd0: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
1ce0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
1cf0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
1d00: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
1d10: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
1d20: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
1d30: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
1d40: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
1d50: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
1d60: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
1d70: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
1d80: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
1d90: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
1da0: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
1db0: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
1dc0: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
1dd0: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
1de0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
1df0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
1e00: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
1e10: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
1e20: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
1e30: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
1e40: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
1e50: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
1e60: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 55 73 69   if( pTerm->pUsi
1e70: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
1e80: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20  st *pList;.     
1e90: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
1ea0: 73 65 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53  sert( i<pSrc->nS
1eb0: 72 63 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 4c  rc-1 );.      pL
1ec0: 69 73 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73  ist = pTerm->pUs
1ed0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
1ee0: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
1ef0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1f00: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
1f10: 70 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69  pTerm->pTab, pLi
1f20: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c  st->a[j].zName)<
1f30: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0 ||.           
1f40: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74   columnIndex(pOt
1f50: 68 65 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74  her->pTab, pList
1f60: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20  ->a[j].zName)<0 
1f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1f80: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
1f90: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
1fa0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
1fb0: 67 20 63 6f 6c 75 6d 6e 20 22 2c 0a 20 20 20 20  g column ",.    
1fc0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1fd0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 22 20 2d 20 63  [j].zName, " - c
1fe0: 6f 6c 75 6d 6e 20 6e 6f 74 20 70 72 65 73 65 6e  olumn not presen
1ff0: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
2000: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
2010: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
2020: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2030: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2040: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
2050: 65 72 6d 28 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  erm(pList->a[j].
2060: 7a 4e 61 6d 65 2c 20 70 54 65 72 6d 2d 3e 70 54  zName, pTerm->pT
2070: 61 62 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62  ab, pOther->pTab
2080: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
2090: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20b0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
20c0: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
20d0: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
20e0: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
20f0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
2100: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
2110: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
2120: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2130: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69  ;.  sqliteExprLi
2140: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69  stDelete(p->pELi
2150: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72 63  st);.  sqliteSrc
2160: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  ListDelete(p->pS
2170: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  rc);.  sqliteExp
2180: 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68 65 72  rDelete(p->pWher
2190: 65 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  e);.  sqliteExpr
21a0: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 47  ListDelete(p->pG
21b0: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
21c0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  eExprDelete(p->p
21d0: 48 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  Having);.  sqlit
21e0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
21f0: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
2200: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
2210: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
2220: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
2230: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
2240: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
2250: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67  ** Delete the ag
2260: 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
2270: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ion from the par
2280: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
2290: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
22a0: 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
22b0: 52 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61  Reset(Parse *pPa
22c0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  rse){.  sqliteFr
22d0: 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29  ee(pParse->aAgg)
22e0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67  ;.  pParse->aAgg
22f0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
2300: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
2310: 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a  se->useAgg = 0;.
2320: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2330: 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68  code into "v" th
2340: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65  at will push the
2350: 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74   record on the t
2360: 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61  op of the.** sta
2370: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ck into the sort
2380: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
2390: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
23a0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
23b0: 20 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69   Vdbe *v, ExprLi
23c0: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
23d0: 20 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65   char *zSortOrde
23e0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a 53  r;.  int i;.  zS
23f0: 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74  ortOrder = sqlit
2400: 65 4d 61 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42  eMalloc( pOrderB
2410: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a  y->nExpr + 1 );.
2420: 20 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72    if( zSortOrder
2430: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2440: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
2450: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
2460: 7b 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72  {.    zSortOrder
2470: 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
2480: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3f  a[i].sortOrder ?
2490: 20 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20   '-' : '+';.    
24a0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
24b0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
24c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
24d0: 7d 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70  }.  zSortOrder[p
24e0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20  OrderBy->nExpr] 
24f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  = 0;.  sqliteVdb
2500: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2510: 74 4d 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72  tMakeKey, pOrder
2520: 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  By->nExpr, 0);. 
2530: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
2540: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74  eP3(v, -1, zSort
2550: 4f 72 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53  Order, strlen(zS
2560: 6f 72 74 4f 72 64 65 72 29 29 3b 0a 20 20 73 71  ortOrder));.  sq
2570: 6c 69 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72  liteFree(zSortOr
2580: 64 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  der);.  sqliteVd
2590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
25a0: 72 74 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  rtPut, 0, 0);.}.
25b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25c0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
25d0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
25e0: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
25f0: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
2600: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 54 68  SELECT..**.** Th
2610: 65 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  e pEList is used
2620: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2630: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 65 61 63  e values for eac
2640: 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a  h column in the.
2650: 2a 2a 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 20  ** result row.  
2660: 45 78 63 65 70 74 20 20 69 66 20 70 45 4c 69 73  Except  if pELis
2670: 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 77 65  t==NULL, then we
2680: 20 6a 75 73 74 20 72 65 61 64 20 6e 43 6f 6c 75   just read nColu
2690: 6d 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 66  mn.** elements f
26a0: 72 6f 6d 20 74 68 65 20 73 72 63 54 61 62 20 74  rom the srcTab t
26b0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
26c0: 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  int selectInnerL
26d0: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
26e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
26f0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2700: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2710: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2720: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
2730: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
2740: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
2750: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
2760: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
2770: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
2780: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
2790: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
27a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
27b0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
27c0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
27d0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   nColumn,       
27e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27f0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2800: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f   source table */
2810: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2820: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66  derBy,     /* If
2830: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20   not NULL, sort 
2840: 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68  results using th
2850: 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  is key */.  int 
2860: 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  distinct,       
2870: 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d      /* If >=0, m
2880: 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73  ake sure results
2890: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
28a0: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
28b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
28c0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
28d0: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
28e0: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
28f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61           /* An a
2900: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64  rgument to the d
2910: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
2920: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
2930: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
2940: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
2950: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
2960: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
2970: 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
2980: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
2990: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
29a0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29   inner loop */.)
29b0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
29c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
29d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 76 3d 3d 30  nt i;.  if( v==0
29e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
29f0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2a00: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
2a10: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
2a20: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
2a30: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
2a40: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
2a50: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
2a60: 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
2a70: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2a80: 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74    if( p->nOffset
2a90: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
2aa0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
2ab0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
2ad0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
2ae0: 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74  Incr, p->nOffset
2af0: 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20  , addr+2);.     
2b00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2b10: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
2b20: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
2b30: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69  }.    if( p->nLi
2b40: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit>=0 ){.      
2b50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2b60: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70  v, OP_MemIncr, p
2b70: 2d 3e 6e 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->nLimit, iBreak
2b80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2b90: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
2ba0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
2bb0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
2bc0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2bd0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
2be0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
2bf0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
2c00: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
2c10: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2c20: 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45      nColumn = pE
2c30: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
2c40: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
2c50: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
2c60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2c70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2c80: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
2c90: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i);.    }.  }.. 
2ca0: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
2cb0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
2cc0: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
2cd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
2ce0: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
2cf0: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
2d00: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
2d10: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
2d20: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
2d30: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
2d40: 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e 3d    if( distinct>=
2d50: 30 20 26 26 20 70 45 4c 69 73 74 20 26 26 20 70  0 && pEList && p
2d60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
2d70: 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59  {.#if NULL_ALWAY
2d80: 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 73  S_DISTINCT.    s
2d90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2da0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70 45  , OP_IsNull, -pE
2db0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71 6c  List->nExpr, sql
2dc0: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
2dd0: 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69 66  dr(v)+7);.#endif
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
2df0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b  ddOp(v, OP_MakeK
2e00: 65 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ey, pEList->nExp
2e10: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
2e20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2e30: 5f 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69  _Distinct, disti
2e40: 6e 63 74 2c 20 73 71 6c 69 74 65 56 64 62 65 43  nct, sqliteVdbeC
2e50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
2e60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
2e70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
2e80: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31   pEList->nExpr+1
2e90: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2ea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2eb0: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
2ec0: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ue);.    sqliteV
2ed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
2ee0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
2ef0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2f00: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
2f10: 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b  y, distinct, 0);
2f20: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
2f30: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
2f40: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
2f50: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
2f60: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
2f70: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
2f80: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
2f90: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
2fa0: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
2fb0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   {.      sqliteV
2fc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2fd0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
2fe0: 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  mn, NULL_ALWAYS_
2ff0: 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20  DISTINCT);.     
3000: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3010: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
3020: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
3030: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3040: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61  P_PutStrKey, iPa
3050: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
3060: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3070: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
3080: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
3090: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
30a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
30b0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
30c0: 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ase SRT_TempTabl
30d0: 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e: {.      sqlit
30e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
30f0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
3100: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
3110: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3120: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3130: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3140: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3150: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3160: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3170: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
3180: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
3190: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
31a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
31b0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
31c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
31d0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
31e0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
31f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3200: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3210: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
3220: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
3230: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
3240: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
3250: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
3260: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
3270: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
3280: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
3290: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
32a0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
32b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
32c0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
32d0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
32e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
32f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
3300: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3310: 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44  n, NULL_ALWAYS_D
3320: 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20  ISTINCT);.      
3330: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3340: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
3350: 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a  iParm, addr+3);.
3360: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3370: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65  AddOp(v, OP_Dele
3380: 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  te, iParm, 0);. 
3390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
33a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  }..    /* If we 
33b0: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
33c0: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
33d0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
33e0: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
33f0: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
3400: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
3410: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
3420: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
3430: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
3440: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
3450: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
3460: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3470: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
3480: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
3490: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
34a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
34b0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20 73  OP_IsNull, -1, s
34c0: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
34d0: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
34e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
34f0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
3500: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
3510: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3520: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
3530: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
3540: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
3550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
3560: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3570: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3580: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3590: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
35a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
35b0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
35c0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
35d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
35e0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
35f0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
3600: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
3610: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
3620: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
3630: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
3640: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
3650: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3660: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
3670: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
3680: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3690: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
36a0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
36b0: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
36c0: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
36d0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
36e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
36f0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
3700: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
3710: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3720: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
3730: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eak);.      }.  
3740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3750: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
3760: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
3770: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
3780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3790: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20   SRT_Callback:. 
37a0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74     case SRT_Sort
37b0: 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  er: {.      if( 
37c0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
37d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
37e0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
37f0: 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  keRec, nColumn, 
3800: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  0);.        push
3810: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
3820: 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, v, pOrderBy);
3830: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3840: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
3850: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
3860: 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  k );.        sql
3870: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3880: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
3890: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
38a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
38b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
38c0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
38d0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
38e0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
38f0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
3900: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
3910: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
3920: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
3930: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
3940: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
3950: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
3960: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
3970: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
3980: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
3990: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
39a0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
39b0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
39c0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
39d0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
39e0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
39f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3a00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3a10: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
3a20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3a30: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3a40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
3a50: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
3a60: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
3a70: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
3a80: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
3a90: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
3aa0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
3ab0: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
3ac0: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
3ad0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
3ae0: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
3af0: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
3b00: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
3b10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
3b20: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
3b30: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
3b40: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
3b50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
3b60: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
3b70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
3b80: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
3b90: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
3ba0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3bb0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
3bc0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
3bd0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
3be0: 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  mn,     /* Numbe
3bf0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
3c00: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44  data */.  int eD
3c10: 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  est,       /* Wr
3c20: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
3c30: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
3c40: 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20   int iParm      
3c50: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61    /* Optional pa
3c60: 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74  rameter associat
3c70: 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f  ed with eDest */
3c80: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20  .){.  int end = 
3c90: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
3ca0: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
3cb0: 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  dr;.  if( eDest=
3cc0: 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65  =SRT_Sorter ) re
3cd0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64  turn;.  sqliteVd
3ce0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
3cf0: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64  rt, 0, 0);.  add
3d00: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
3d10: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65  dOp(v, OP_SortNe
3d20: 78 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69  xt, 0, end);.  i
3d30: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  f( p->nOffset>0 
3d40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
3d50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
3d60: 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74  Incr, p->nOffset
3d70: 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73  , addr+4);.    s
3d80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3d90: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
3da0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3db0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3dc0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20   0, addr);.  }. 
3dd0: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d   if( p->nLimit>=
3de0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
3df0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3e00: 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4c 69 6d 69  emIncr, p->nLimi
3e10: 74 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  t, end);.  }.  s
3e20: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
3e30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
3e40: 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73  lback: {.      s
3e50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3e60: 2c 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63  , OP_SortCallbac
3e70: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
3e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3e90: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
3ea0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
3eb0: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b  SRT_TempTable: {
3ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3ed0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
3ee0: 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29  Recno, iParm, 0)
3ef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3f00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3f10: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
3f20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3f30: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
3f40: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
3f50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3f60: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
3f70: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
3f80: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
3f90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3fa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
3fb0: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64  ll, -1, sqliteVd
3fc0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3fd0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
3fe0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3ff0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4000: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4010: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
4020: 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  trKey, iParm, 0)
4030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4040: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
4050: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
4060: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4070: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4080: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4090: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
40a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
40b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
40c0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 29 3b  P_Goto, 0, end);
40d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
40e0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
40f0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
4100: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
4110: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4120: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
4130: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4140: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
4150: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
4160: 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c  l(v, end);.  sql
4170: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4180: 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c  OP_SortReset, 0,
4190: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
41a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
41b0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
41c0: 44 42 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c  DBE how many col
41d0: 75 6d 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61 72  umns there.** ar
41e0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
41f0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 66 6f 72  and the name for
4200: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54   each column.  T
4210: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  his information.
4220: 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ** is used to pr
4230: 6f 76 69 64 65 20 22 61 72 67 63 22 20 61 6e 64  ovide "argc" and
4240: 20 22 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65   "azCol[]" value
4250: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
4260: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
4270: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
4280: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
4290: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
42a0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
42b0: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
42c0: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
42d0: 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
42e0: 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e  ding to first en
42f0: 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20  try in pTabList 
4300: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
4310: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
4320: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
4330: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
4340: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
4350: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
4360: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
4370: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4380: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
4390: 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
43a0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
43b0: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
43c0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
43d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
43e0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
43f0: 20 31 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   1;.  sqliteVdbe
4400: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
4410: 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c 69 73 74 2d  mnCount, pEList-
4420: 3e 6e 45 78 70 72 2a 32 2b 31 2c 20 30 29 3b 0a  >nExpr*2+1, 0);.
4430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
4440: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
4450: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
4460: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d     char *zType =
4470: 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 68 6f 77   0;.    int show
4480: 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 69  FullNames;.    i
4490: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
44a0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
44b0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
44c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
44d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
44e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
44f0: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
4500: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4510: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
4520: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
4530: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
4540: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4550: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
4560: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
4570: 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   p==0 ) continue
4580: 3b 0a 20 20 20 20 73 68 6f 77 46 75 6c 6c 4e 61  ;.    showFullNa
4590: 6d 65 73 20 3d 20 28 70 50 61 72 73 65 2d 3e 64  mes = (pParse->d
45a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
45b0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
45c0: 3d 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73  =0;.    if( p->s
45d0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
45e0: 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f 77 46 75  .z[0] && !showFu
45f0: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
4600: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
4610: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50  teVdbeAddOp(v,OP
4620: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
4630: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4640: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
4650: 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  -1, p->span.z, p
4660: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
4670: 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72   sqliteVdbeCompr
4680: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
4690: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
46a0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
46b0: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
46c0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
46d0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
46e0: 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73  [p->iTable - bas
46f0: 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e].pTab;.      c
4700: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
4710: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
4720: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66  Column;.      if
4730: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
4740: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
4750: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
4760: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
4770: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
4780: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
4790: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
47a0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f       zCol = "_RO
47b0: 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7a  WID_";.        z
47c0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
47d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
47e0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
47f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
4800: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 54  Name;.        zT
4810: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
4820: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
4830: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4840: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
4850: 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65   || showFullName
4860: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
4870: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
4880: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
4890: 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ;. .        zTab
48a0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70   = pTabList->a[p
48b0: 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65 5d  ->iTable - base]
48c0: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
48d0: 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d   if( showFullNam
48e0: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
48f0: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
4900: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
4910: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  teSetString(&zNa
4920: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
4930: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
4940: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4950: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
4960: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
4970: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4980: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
4990: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
49a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
49b0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
49c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
49d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
49e0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
49f0: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
4a00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
4a10: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43  angeP3(v, -1, zC
4a20: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ol, 0);.      }.
4a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
4a40: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
4a50: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
4a60: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
4a70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50  teVdbeAddOp(v,OP
4a80: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20  _ColumnName, i, 
4a90: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4aa0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
4ab0: 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  -1, p->span.z, p
4ac0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
4ad0: 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72   sqliteVdbeCompr
4ae0: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
4af0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4b00: 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33      char zName[3
4b10: 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0];.      assert
4b20: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
4b30: 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  MN || pTabList==
4b40: 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  0 );.      sprin
4b50: 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  tf(zName, "colum
4b60: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
4b70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4b80: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
4b90: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
4ba0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
4bb0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65  eP3(v, -1, zName
4bc0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
4bd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4be0: 7a 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zType==0 ){.    
4bf0: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
4c00: 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Type(p)==SQLITE_
4c10: 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  SO_TEXT ){.     
4c20: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
4c30: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
4c40: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
4c50: 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20 20  "NUMERIC";.     
4c60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
4c70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4c80: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
4c90: 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   + pEList->nExpr
4ca0: 20 2b 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71   + 1, 0);.    sq
4cb0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
4cc0: 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50  (v, -1, zType, P
4cd0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d  3_STATIC);.  }.}
4ce0: 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  ../*.** Name of 
4cf0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
4d00: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
4d10: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
4d20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
4d30: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
4d40: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
4d50: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
4d60: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
4d70: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
4d80: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
4d90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
4da0: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
4db0: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
4dc0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
4dd0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
4de0: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
4df0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4e00: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
4e10: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
4e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
4e30: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
4e40: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
4e50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
4e60: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
4e70: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
4e80: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
4e90: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
4ea0: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
4eb0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 52 65 73 75  able *sqliteResu
4ec0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
4ed0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
4ee0: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
4ef0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
4f00: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
4f10: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
4f20: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 61  t *pEList;.  sta
4f30: 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f  tic int fillInCo
4f40: 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a 2c  lumnList(Parse*,
4f50: 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 20 20 69 66   Select*);..  if
4f60: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
4f70: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
4f80: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
4f90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
4fa0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4fb0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
4fc0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
4fd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4fe0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d    }.  pTab->zNam
4ff0: 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73  e = zTabName ? s
5000: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62  qliteStrDup(zTab
5010: 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c  Name) : 0;.  pEL
5020: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
5030: 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e  EList;.  pTab->n
5040: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
5050: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
5060: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
5070: 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73 71   pTab->aCol = sq
5080: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5090: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
50a0: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
50b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
50c0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
50d0: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
50e0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
50f0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
5100: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
5110: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
5120: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  up(pEList->a[i].
5130: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
5140: 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73 74 2d  e if( (p=pEList-
5150: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
5160: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
5170: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
5180: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
5190: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
51a0: 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20  ame, p->span.z, 
51b0: 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a 20  p->span.n, 0);. 
51c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
51d0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 2d  op==TK_DOT && p-
51e0: 3e 70 52 69 67 68 74 20 26 26 20 70 2d 3e 70 52  >pRight && p->pR
51f0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  ight->token.z &&
5200: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  .           p->p
5210: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
5220: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
5230: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54 61  eSetNString(&pTa
5240: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
5250: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  , .           p-
5260: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
5270: 2c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  , p->pRight->tok
5280: 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65  en.n, 0);.    }e
5290: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
52a0: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
52b0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 63  sprintf(zBuf, "c
52c0: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
52d0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
52e0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
52f0: 74 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b 0a  teStrDup(zBuf);.
5300: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
5310: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
5320: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
5330: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67 69  /*.** For the gi
5340: 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ven SELECT state
5350: 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20 74  ment, do three t
5360: 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  hings..**.**    
5370: 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (1)  Fill in the
5380: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
5390: 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
53a0: 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
53b0: 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
53c0: 65 73 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  es the set of ta
53d0: 62 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64  bles that should
53e0: 20 62 65 20 73 63 61 6e 6e 65 64 2e 20 0a 2a 2a   be scanned. .**
53f0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 64 64 20  .**    (2)  Add 
5400: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
5410: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
5420: 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
5430: 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
5440: 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
5450: 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
5460: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
5470: 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
5480: 33 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  3)  Scan the lis
5490: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
54a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
54b0: 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
54c0: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
54d0: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
54e0: 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
54f0: 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
5500: 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
5510: 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
5520: 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
5530: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
5540: 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
5550: 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
5560: 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
5570: 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
5580: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
5590: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
55a0: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
55b0: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
55c0: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
55d0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
55e0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
55f0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
5600: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73  nColumnList(Pars
5610: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
5620: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  t *p){.  int i, 
5630: 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c  j, k, rc;.  SrcL
5640: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
5650: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5660: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
5670: 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  ;..  if( p==0 ||
5680: 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29 20 72 65   p->pSrc==0 ) re
5690: 74 75 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69  turn 1;.  pTabLi
56a0: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
56b0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
56c0: 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  st;..  /* Look u
56d0: 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 69 6e  p every table in
56e0: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 2e   the table list.
56f0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
5700: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
5710: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
5720: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
5730: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pTab ){.      /*
5740: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
5750: 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20 20 4e  s run before!  N
5760: 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e  o need to contin
5770: 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ue */.      retu
5780: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
5790: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
57a0: 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
57b0: 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
57c0: 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
57d0: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
57e0: 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
57f0: 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  rt( pTabList->a[
5800: 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  i].pSelect!=0 );
5810: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c  .      if( pTabL
5820: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
5830: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
5840: 68 61 72 20 7a 46 61 6b 65 4e 61 6d 65 5b 36 30  har zFakeName[60
5850: 5d 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e  ];.        sprin
5860: 74 66 28 7a 46 61 6b 65 4e 61 6d 65 2c 20 22 73  tf(zFakeName, "s
5870: 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25  qlite_subquery_%
5880: 70 5f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  p_",.           
5890: 28 76 6f 69 64 2a 29 70 54 61 62 4c 69 73 74 2d  (void*)pTabList-
58a0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
58c0: 74 53 74 72 69 6e 67 28 26 70 54 61 62 4c 69 73  tString(&pTabLis
58d0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20  t->a[i].zAlias, 
58e0: 7a 46 61 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a 20  zFakeName, 0);. 
58f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
5900: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
5910: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
5920: 20 20 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53     sqliteResultS
5930: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
5940: 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  e, pTabList->a[i
5950: 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ].zAlias,.      
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
5990: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
59a0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
59b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
59c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59d0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
59e0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
59f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
5a00: 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
5a10: 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
5a20: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
5a30: 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
5a40: 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61 62  a[i].pTab = pTab
5a50: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
5a60: 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  teFindTable(pPar
5a70: 73 65 2d 3e 64 62 2c 20 70 54 61 62 4c 69 73 74  se->db, pTabList
5a80: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
5a90: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
5aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5ab0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
5ac0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
5ad0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
5ae0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61   .           pTa
5af0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
5b00: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  e, 0);.        p
5b10: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5b20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5b30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5b40: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
5b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5b60: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
5b70: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
5b80: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
5b90: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5bb0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
5bc0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
5bd0: 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70  electDup(pTab->p
5be0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
5bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5c00: 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
5c10: 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
5c20: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
5c30: 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
5c40: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50  */.  if( sqliteP
5c50: 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
5c60: 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31  e, p) ) return 1
5c70: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  ;..  /* For ever
5c80: 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
5c90: 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
5ca0: 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
5cb0: 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
5cc0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
5cd0: 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
5ce0: 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
5cf0: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
5d00: 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
5d10: 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
5d20: 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
5d30: 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
5d40: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
5d50: 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
5d60: 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
5d70: 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
5d80: 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
5d90: 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
5da0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
5db0: 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
5dc0: 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
5dd0: 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
5de0: 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
5df0: 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
5e00: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
5e10: 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
5e20: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
5e30: 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
5e40: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
5e50: 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
5e60: 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
5e70: 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
5e80: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
5e90: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
5ea0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; k++){.    Expr
5eb0: 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pE = pEList->a
5ec0: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
5ed0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
5ee0: 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  L ) break;.    i
5ef0: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
5f00: 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20  T && pE->pRight 
5f10: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
5f20: 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20  p==TK_ALL.      
5f30: 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20     && pE->pLeft 
5f40: 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
5f50: 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b  ==TK_ID ) break;
5f60: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20  .  }.  rc = 0;. 
5f70: 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
5f80: 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
5f90: 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
5fa0: 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
5fb0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
5fc0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
5fd0: 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
5fe0: 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
5ff0: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
6000: 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
6010: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
6020: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
6030: 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
6040: 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
6050: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
6060: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
6070: 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
6080: 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
6090: 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
60a0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
60b0: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
60c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
60d0: 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
60e0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
60f0: 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20  K_ALL &&.       
6100: 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f      (pE->op!=TK_
6110: 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
6120: 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67  t==0 || pE->pRig
6130: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
6140: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
6150: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
6160: 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
6170: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
6180: 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
6190: 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
61a0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
61b0: 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d  ppend(pNew, a[k]
61c0: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
61d0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
61e0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
61f0: 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
6200: 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
6210: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  r = 0;.        a
6220: 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
6230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6240: 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
6250: 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
6260: 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
6270: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
6280: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
6290: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
62a0: 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
62b0: 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
62c0: 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
62d0: 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
62e0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
62f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
6300: 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
6310: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
6320: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
6330: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a  && pE->pLeft ){.
6340: 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20            pName 
6350: 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  = &pE->pLeft->to
6360: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ken;.        }el
6370: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
6380: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
6390: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
63a0: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
63b0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
63c0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
63d0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
63e0: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  i].pTab;.       
63f0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
6400: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
6410: 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  i].zAlias;.     
6420: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
6430: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
6440: 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  [0]==0 ){ .     
6450: 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
6460: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
6470: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6480: 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26       if( pName &
6490: 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  & (zTabName==0 |
64a0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
64b0: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e        sqliteStrN
64d0: 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a  ICmp(pName->z, z
64e0: 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  TabName, pName->
64f0: 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  n)!=0 ||.       
6500: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
6510: 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29  me[pName->n]!=0)
6520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6530: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6550: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
6560: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
6570: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
6580: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6590: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
65a0: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
65c0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
65d0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
65f0: 69 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73 74  i>0 && (pTabList
6600: 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
6610: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
6620: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
6630: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65        columnInde
6640: 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d  x(pTabList->a[i-
6650: 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  1].pTab, zName)>
6660: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6670: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
6680: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
6690: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
66a0: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
66b0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
66c0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
66d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
66e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
66f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6700: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 73 71     if( i>0 && sq
6710: 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28  liteIdListIndex(
6720: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
6730: 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  .pUsing, zName)>
6740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6750: 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
6760: 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
6770: 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
6780: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
6790: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
67a0: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
67b0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
67c0: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
67d0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
67f0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
6800: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
6810: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
6820: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
6830: 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b  Right==0 ) break
6840: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
6850: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  ight->token.z = 
6860: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
6870: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
6880: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  .n = strlen(zNam
6890: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
68a0: 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 29 7b 0a  if( zTabName ){.
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
68c0: 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  eft = sqliteExpr
68d0: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
68e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
68f0: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 20 62  if( pLeft==0 ) b
6900: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
6910: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
6920: 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a 20  .z = zTabName;. 
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
6940: 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74  ft->token.n = st
6950: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b 0a  rlen(zTabName);.
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
6970: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
6980: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
6990: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
69a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
69b0: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
69d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
69e0: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
69f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
6a00: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
6a10: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
6a20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6a30: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
6a40: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
6a50: 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29  (pNew, pExpr, 0)
6a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a80: 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
6a90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6aa0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  pName ){.       
6ab0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
6ac0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
6ad0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
6ae0: 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31 2c 20 0a   table: ", -1, .
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
6b00: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
6b10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6b30: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
6b40: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
6b50: 4d 73 67 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  Msg, "no tables 
6b60: 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
6b70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6b80: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
6b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6ba0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6bb0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
6bc0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
6bd0: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
6be0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6bf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6c00: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
6c10: 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c   unlinks the Sel
6c20: 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61  ect.pSrc.a[].pTa
6c30: 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e  b pointers.** in
6c40: 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63 74   a select struct
6c50: 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65  ure.  It just se
6c60: 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ts the pointers 
6c70: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a  to NULL.  This.*
6c80: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63  * routine is rec
6c90: 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73 65  ursive in the se
6ca0: 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65 20  nse that if the 
6cb0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
6cc0: 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74  pSelect.** point
6cd0: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
6ce0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6cf0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
6d00: 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74  ly on that point
6d10: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
6d20: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6d30: 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73   on the Select s
6d40: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
6d50: 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20  fines a.** VIEW 
6d60: 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f  in order to undo
6d70: 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f   any bindings to
6d80: 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69   tables.  This i
6d90: 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62  s necessary.** b
6da0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61 62  ecause those tab
6db0: 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f  les might be DRO
6dc0: 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71 75  Ped by a subsequ
6dd0: 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e  ent SQL command.
6de0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
6df0: 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65  electUnbind(Sele
6e00: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
6e10: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
6e20: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61   = p->pSrc;.  Ta
6e30: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
6e40: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
6e50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
6e60: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
6e70: 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70     if( (pTab = p
6e80: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21  Src->a[i].pTab)!
6e90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
6ea0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
6eb0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
6ec0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
6ed0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  , pTab);.       
6ee0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
6ef0: 65 74 65 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  ete(pSrc->a[i].p
6f00: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
6f10: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pSrc->a[i].pSel
6f20: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ect = 0;.      }
6f30: 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
6f40: 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ].pTab = 0;.    
6f50: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
6f60: 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  .pSelect ){.    
6f70: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
6f80: 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b 69  Unbind(pSrc->a[i
6f90: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
6fa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
6fb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6fc0: 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65  ine associates e
6fd0: 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44  ntries in an ORD
6fe0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
6ff0: 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f   list with.** co
7000: 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c  lumns in a resul
7010: 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44  t.  For each ORD
7020: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
7030: 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a  , the opcode of.
7040: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
7050: 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64   node is changed
7060: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e   to TK_COLUMN an
7070: 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61  d the iColumn va
7080: 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  lue of.** the to
7090: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
70a0: 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63  filled in with c
70b0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
70c0: 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76   the iTable.** v
70d0: 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d  alue of the top-
70e0: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69  level node is fi
70f0: 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65  lled with iTable
7100: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
7110: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70  * If there are p
7120: 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75  rior SELECT clau
7130: 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72  ses, they are pr
7140: 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20  ocessed first.  
7150: 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e  A match.** in an
7160: 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20   earlier SELECT 
7170: 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65  takes precedence
7180: 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45   over a later SE
7190: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  LECT..**.** Any 
71a0: 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20  entry that does 
71b0: 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61  not match is fla
71c0: 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  gged as an error
71d0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
71e0: 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65   of errors is re
71f0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
7200: 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72  c int matchOrder
7210: 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  byToColumn(.  Pa
7220: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7230: 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65        /* A place
7240: 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20   to leave error 
7250: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65  messages */.  Se
7260: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
7270: 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
7280: 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  o result columns
7290: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
72a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
72b0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
72c0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c  The ORDER BY val
72d0: 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61  ues to match aga
72e0: 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  inst columns */.
72f0: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
7310: 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69  ert this value i
7320: 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  n iTable */.  in
7330: 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20  t mustComplete  
7340: 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45        /* If TRUE
7350: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d   all ORDER BYs m
7360: 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a  ust match */.){.
7370: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
7380: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
7390: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
73a0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d  .  if( pSelect==
73b0: 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 || pOrderBy==0
73c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
73d0: 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  f( mustComplete 
73e0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
73f0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
7400: 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42  r; i++){ pOrderB
7410: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
7420: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  ; }.  }.  if( fi
7430: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
7440: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
7450: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
7460: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
7470: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
7480: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
7490: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
74a0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
74b0: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
74c0: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
74d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
74e0: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
74f0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
7500: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7510: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
7520: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
7530: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
7540: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
7550: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  nt iCol = -1;.  
7560: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
7570: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
7580: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
7590: 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65  liteExprIsIntege
75a0: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
75b0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d        if( iCol<=
75c0: 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
75d0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
75e0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
75f0: 5d 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e  ];.        sprin
7600: 74 66 28 7a 42 75 66 2c 22 4f 52 44 45 52 20 42  tf(zBuf,"ORDER B
7610: 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68  Y position %d sh
7620: 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20  ould be between 
7630: 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  1 and %d",.     
7640: 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69        iCol, pELi
7650: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
7660: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
7670: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
7680: 72 4d 73 67 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  rMsg, zBuf, 0);.
7690: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
76a0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
76b0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
76c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
76d0: 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20       iCol--;.   
76e0: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
76f0: 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69  iCol<0 && j<pELi
7700: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
7710: 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
7720: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26  t->a[j].zName &&
7730: 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20   (pE->op==TK_ID 
7740: 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  || pE->op==TK_ST
7750: 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20  RING) ){.       
7760: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a   char *zName, *z
7770: 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a  Label;.        z
7780: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
7790: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
77a0: 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74     assert( pE->t
77b0: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
77c0: 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74    zLabel = sqlit
77d0: 65 53 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b  eStrNDup(pE->tok
77e0: 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e  en.z, pE->token.
77f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
7800: 74 65 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c  teDequote(zLabel
7810: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
7820: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4e 61  qliteStrICmp(zNa
7830: 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29  me, zLabel)==0 )
7840: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  { .          iCo
7850: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d  l = j;.        }
7860: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
7870: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ree(zLabel);.   
7880: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
7890: 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 45  Col<0 && sqliteE
78a0: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
78b0: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
78c0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  r) ){.        iC
78d0: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  ol = j;.      }.
78e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
78f0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
7900: 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  E->op = TK_COLUM
7910: 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f  N;.      pE->iCo
7920: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
7930: 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20     pE->iTable = 
7940: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f  iTable;.      pO
7950: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
7960: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 1;.    }.   
7970: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d   if( iCol<0 && m
7980: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
7990: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33       char zBuf[3
79a0: 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  0];.      sprint
79b0: 66 28 7a 42 75 66 2c 22 25 64 22 2c 69 2b 31 29  f(zBuf,"%d",i+1)
79c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
79d0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
79e0: 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52 44 45 52  >zErrMsg, "ORDER
79f0: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
7a00: 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20 20 20  ", zBuf, .      
7a10: 20 20 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74    " does not mat
7a20: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
7a30: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20  lumn", 0);.     
7a40: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7a50: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
7a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7a70: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
7a80: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
7a90: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
7aa0: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
7ab0: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
7ac0: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
7ad0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
7ae0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7af0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
7b00: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
7b10: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
7b20: 62 65 20 2a 73 71 6c 69 74 65 47 65 74 56 64 62  be *sqliteGetVdb
7b30: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
7b40: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
7b50: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
7b60: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
7b70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7b80: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72 65   = sqliteVdbeCre
7b90: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
7ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
7bb0: 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  .}.    ../*.** T
7bc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7bd0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
7be0: 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73   a query that is
7bf0: 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f   really the unio
7c00: 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63  n.** or intersec
7c10: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d  tion of two or m
7c20: 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
7c30: 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20  ries..**.** "p" 
7c40: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
7c50: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
7c60: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 54 68  two queries.  Th
7c70: 65 20 72 65 73 75 6c 74 73 20 73 68 6f 75 6c 64  e results should
7c80: 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
7c90: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
7ca0: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2f 0a  meter iParm..*/.
7cb0: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
7cc0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
7cd0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
7ce0: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
7cf0: 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63  iParm){.  int rc
7d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d10: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
7d20: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
7d30: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
7d40: 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74  ior;     /* Anot
7d50: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
7d60: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
7d70: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
7d90: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
7da0: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
7db0: 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  nt base;        
7dc0: 20 20 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76     /* Baseline v
7dd0: 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d  alue for pParse-
7de0: 3e 6e 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  >nTab */..  /* M
7df0: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
7e00: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
7e10: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
7e20: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65  LECTs.  Only the
7e30: 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45   .  ** last SELE
7e40: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
7e50: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
7e60: 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  ER BY..  */.  if
7e70: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
7e80: 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
7e90: 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  1;.  pPrior = p-
7ea0: 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70  >pPrior;.  if( p
7eb0: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
7ec0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
7ed0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7ee0: 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42  zErrMsg,"ORDER B
7ef0: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
7f00: 63 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20  come after ",.  
7f10: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
7f20: 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62  (p->op), " not b
7f30: 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20  efore", 0);.    
7f40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7f50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7f60: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
7f70: 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69  e we have a vali
7f80: 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20  d query engine. 
7f90: 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20   If not, create 
7fa0: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
7fb0: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
7fc0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
7fd0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
7fe0: 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   1;..  /* Create
7ff0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
8000: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
8010: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
8020: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
8030: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
8040: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
8050: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
8060: 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  emp, iParm, 0);.
8070: 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f      eDest = SRT_
8080: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
8090: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
80a0: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
80b0: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
80c0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
80d0: 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  base = pParse->n
80e0: 54 61 62 3b 0a 20 20 73 77 69 74 63 68 28 20 70  Tab;.  switch( p
80f0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
8100: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
8110: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
8120: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
8130: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
8140: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
8150: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
8160: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
8170: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8180: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   rc;.        p->
8190: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
81a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
81b0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
81c0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
81d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
81e0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
81f0: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ior;.        if(
8200: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
8210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
8230: 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
8240: 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
8250: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
8260: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
8270: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
8280: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
8290: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
82a0: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
82b0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
82c0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
82d0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
82e0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
82f0: 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
8300: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
8310: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
8320: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
8330: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
8340: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
8350: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
8360: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
8370: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
8380: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
8390: 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68  pOrderBy;  /* Th
83a0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
83b0: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
83c0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20  SELECT */..     
83d0: 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70   priorOp = p->op
83e0: 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54  ==TK_ALL ? SRT_T
83f0: 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e  able : SRT_Union
8400: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
8410: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d  t==priorOp && p-
8420: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  >pOrderBy==0 ){.
8430: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
8440: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
8450: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
8460: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
8470: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
8480: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
8490: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
84a0: 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20  nTab = iParm;.  
84b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84c0: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
84d0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
84e0: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
84f0: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
8500: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
8510: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
8520: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8530: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
8540: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8550: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
8560: 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20  OrderBy .       
8570: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
8580: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
8590: 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
85a0: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b   unionTab, 1) ){
85b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
85c0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
85d0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
85e0: 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
85f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8600: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
8610: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
8620: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
8630: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8640: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75   OP_KeyAsData, u
8650: 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20  nionTab, 1);.   
8660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8670: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8680: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
8690: 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Temp, unionTab, 
86a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
86b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
86c0: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
86d0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
86e0: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
86f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8700: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
8710: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
8720: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
8730: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
8740: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
8750: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
8760: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
8770: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
8780: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
8790: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
87a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
87b0: 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78  PT:  op = SRT_Ex
87c0: 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  cept;   break;. 
87d0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
87e0: 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52  UNION:   op = SR
87f0: 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61  T_Union;    brea
8800: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
8810: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20   TK_ALL:     op 
8820: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
8830: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8840: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
8850: 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   0;.      pOrder
8860: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
8870: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
8880: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  rBy = 0;.      r
8890: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
88a0: 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20  (pParse, p, op, 
88b0: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
88c0: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
88d0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
88e0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
88f0: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
8900: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8910: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
8920: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
8930: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
8940: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
8950: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
8960: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
8970: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
8980: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
8990: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
89a0: 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69  !=priorOp || uni
89b0: 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a  onTab!=iParm ){.
89c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
89d0: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
89e0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
89f0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
8a00: 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73          if( eDes
8a10: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
8a20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
8a30: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
8a40: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
8a50: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
8a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8a70: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
8a80: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
8a90: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
8aa0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  t = sqliteVdbeMa
8ab0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
8ac0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8ad0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
8ae0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
8af0: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
8b00: 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  art = sqliteVdbe
8b10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
8b20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c          rc = sel
8b30: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
8b40: 72 73 65 2c 20 70 2c 20 30 2c 20 75 6e 69 6f 6e  rse, p, 0, union
8b50: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
8b60: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
8b90: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
8ba0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
8bd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
8be0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
8bf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
8c00: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
8c10: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
8c20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8c30: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
8c40: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
8c50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
8c60: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
8c70: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
8c80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8c90: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
8ca0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
8cb0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
8cc0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
8cd0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
8ce0: 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74  (p, v, p->pEList
8cf0: 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
8d00: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iParm);.        
8d10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8d20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8d30: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
8d40: 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
8d50: 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
8d60: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
8d70: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a 20 20  eak, iStart;..  
8d80: 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
8d90: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
8da0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
8db0: 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
8dc0: 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
8dd0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
8de0: 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
8df0: 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
8e00: 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
8e10: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
8e20: 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
8e30: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8e40: 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
8e50: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
8e60: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
8e70: 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
8e80: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ->pOrderBy && ma
8e90: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
8ea0: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70  mn(pParse,p,p->p
8eb0: 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20  OrderBy,tab1,1) 
8ec0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8ed0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
8ee0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8ef0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
8f00: 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20  p, tab1, 1);.   
8f10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8f20: 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61  Op(v, OP_KeyAsDa
8f30: 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a 20  ta, tab1, 1);.. 
8f40: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
8f50: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
8f60: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
8f70: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
8f80: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8f90: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
8fa0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
8fb0: 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  r, SRT_Union, ta
8fc0: 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  b1, 0, 0, 0);.  
8fd0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
8fe0: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
8ff0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
9000: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
9010: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
9020: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
9030: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9040: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
9050: 65 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20  emp, tab2, 1);. 
9060: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9070: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
9080: 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b 0a  Data, tab2, 1);.
9090: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
90a0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
90b0: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
90c0: 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f  rse, p, SRT_Unio
90d0: 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30  n, tab2, 0, 0, 0
90e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
90f0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
9100: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
9110: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
9120: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9130: 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
9140: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
9150: 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
9160: 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
9170: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
9180: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
9190: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
91a0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
91b0: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  ){.        gener
91c0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
91d0: 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20  Parse, p->base, 
91e0: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
91f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
9200: 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65  eak = sqliteVdbe
9210: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
9220: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
9230: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
9240: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
9250: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9260: 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
9270: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74  reak);.      iSt
9280: 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  art = sqliteVdbe
9290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c  AddOp(v, OP_Full
92a0: 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  Key, tab1, 0);. 
92b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
92c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
92d0: 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
92e0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
92f0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
9300: 61 72 73 65 2c 20 70 2c 20 30 2c 20 74 61 62 31  arse, p, 0, tab1
9310: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
9320: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
9350: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
9360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
9380: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
9390: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
93a0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  urn 1;.      sql
93b0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
93c0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
93d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
93e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
93f0: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
9400: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9410: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
9420: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
9430: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9440: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
9450: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
9460: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9470: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
9480: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
9490: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
94a0: 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
94b0: 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45  Tail(p, v, p->pE
94c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
94d0: 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20  st, iParm);.    
94e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
94f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
9500: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
9510: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
9520: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
9530: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
9540: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
9550: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  r ){.    sqliteS
9560: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
9570: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45 4c 45  ->zErrMsg, "SELE
9580: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
9590: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 22 2c 0a  and right of ",.
95a0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
95b0: 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 64 6f 20  me(p->op), " do 
95c0: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
95d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
95e0: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 30 29 3b  lt columns", 0);
95f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
9600: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
9610: 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  1;.  }.  pParse-
9620: 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20  >nTab = base;.  
9630: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9640: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 73  ** Recursively s
9650: 63 61 6e 20 74 68 72 6f 75 67 68 20 61 6e 20 65  can through an e
9660: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9670: 20 46 6f 72 20 65 76 65 72 79 20 72 65 66 65 72   For every refer
9680: 65 6e 63 65 0a 2a 2a 20 74 6f 20 61 20 63 6f 6c  ence.** to a col
9690: 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
96a0: 62 65 72 20 69 46 72 6f 6d 2c 20 63 68 61 6e 67  ber iFrom, chang
96b0: 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
96c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   to the.** same 
96d0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
96e0: 6e 75 6d 62 65 72 20 69 54 6f 2e 0a 2a 2f 0a 73  number iTo..*/.s
96f0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67  tatic void chang
9700: 65 54 61 62 6c 65 73 28 45 78 70 72 20 2a 70 45  eTables(Expr *pE
9710: 78 70 72 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  xpr, int iFrom, 
9720: 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66 28 20  int iTo){.  if( 
9730: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
9740: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
9750: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
9760: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
9770: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 70 45 78  iFrom ){.    pEx
9780: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 6f  pr->iTable = iTo
9790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
97a0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67  tatic void chang
97b0: 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 45 78  eTablesInList(Ex
97c0: 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 69 6e  prList*, int, in
97d0: 74 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61  t);.    changeTa
97e0: 62 6c 65 73 28 70 45 78 70 72 2d 3e 70 4c 65 66  bles(pExpr->pLef
97f0: 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a  t, iFrom, iTo);.
9800: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
9810: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
9820: 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20  iFrom, iTo);.   
9830: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c   changeTablesInL
9840: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
9850: 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20  , iFrom, iTo);. 
9860: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9870: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c   changeTablesInL
9880: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
9890: 69 73 74 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  ist, int iFrom, 
98a0: 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66 28 20  int iTo){.  if( 
98b0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74  pList ){.    int
98c0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
98d0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
98e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
98f0: 6e 67 65 54 61 62 6c 65 73 28 70 4c 69 73 74 2d  ngeTables(pList-
9900: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 46 72  >a[i].pExpr, iFr
9910: 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  om, iTo);.    }.
9920: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61    }.}../*.** Sca
9930: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
9940: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
9950: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
9960: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
9970: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
9980: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
9990: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
99a0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
99b0: 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
99c0: 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
99d0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
99e0: 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
99f0: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 20 20  ** unchanged.)  
9a00: 57 68 65 6e 20 6d 61 6b 69 6e 67 20 61 20 63 6f  When making a co
9a10: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
9a20: 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 2c 20 63  ion in pEList, c
9a30: 68 61 6e 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e  hange.** referen
9a40: 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
9a50: 6e 20 74 61 62 6c 65 20 69 53 75 62 20 69 6e 74  n table iSub int
9a60: 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
9a70: 74 61 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a  table iTable..**
9a80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9a90: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
9aa0: 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
9ab0: 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
9ac0: 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
9ad0: 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
9ae0: 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
9af0: 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
9b00: 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
9b10: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
9b20: 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
9b30: 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
9b40: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
9b50: 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
9b60: 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
9b70: 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
9b80: 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
9b90: 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
9ba0: 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
9bb0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
9bc0: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
9bd0: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
9be0: 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
9bf0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
9c00: 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
9c10: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
9c20: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
9c30: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
9c40: 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20  st *pEList, int 
9c50: 69 53 75 62 29 7b 0a 20 20 69 66 28 20 70 45 78  iSub){.  if( pEx
9c60: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
9c70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
9c80: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
9c90: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
9ca0: 62 6c 65 20 26 26 20 70 45 78 70 72 2d 3e 69 43  ble && pExpr->iC
9cb0: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
9cc0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
9cd0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
9ce0: 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
9cf0: 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
9d00: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
9d10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
9d20: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
9d30: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
9d40: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  List==0 );.    p
9d50: 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  New = pEList->a[
9d60: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
9d70: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
9d80: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
9d90: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
9da0: 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70  ew->op;.    pExp
9db0: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
9dc0: 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  eExprDup(pNew->p
9dd0: 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72  Left);.    pExpr
9de0: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
9df0: 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  eExprDup(pNew->p
9e00: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 45 78 70  Right);.    pExp
9e10: 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r->pList = sqlit
9e20: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65  eExprListDup(pNe
9e30: 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  w->pList);.    p
9e40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
9e50: 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
9e60: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
9e70: 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
9e80: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67  .    pExpr->iAgg
9e90: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
9ea0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 20     pExpr->token 
9eb0: 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20  = pNew->token;. 
9ec0: 20 20 20 69 66 28 20 69 53 75 62 21 3d 69 54 61     if( iSub!=iTa
9ed0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ble ){.      cha
9ee0: 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70 72 2c  ngeTables(pExpr,
9ef0: 20 69 53 75 62 2c 20 69 54 61 62 6c 65 29 3b 0a   iSub, iTable);.
9f00: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9f10: 20 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73     static void s
9f20: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
9f30: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
9f40: 69 73 74 2a 2c 69 6e 74 29 3b 0a 20 20 20 20 73  ist*,int);.    s
9f50: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
9f60: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
9f70: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
9f80: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
9f90: 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
9fa0: 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29  e, pEList, iSub)
9fb0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
9fc0: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
9fd0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
9fe0: 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 73  , iSub);.  }.}.s
9ff0: 74 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73  tatic void .subs
a000: 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
a010: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
a020: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
a030: 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20 69 53 75  *pEList, int iSu
a040: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
a050: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
a060: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
a070: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
a080: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74   i++){.    subst
a090: 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Expr(pList->a[i]
a0a0: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
a0b0: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
a0c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
a0d0: 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
a0e0: 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
a0f0: 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72  queries in order
a100: 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65   to speed.** exe
a110: 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75  cution.  It retu
a120: 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
a130: 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
a140: 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
a150: 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  .** occurs..**.*
a160: 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
a170: 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
a180: 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
a190: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
a1a0: 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
a1b0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
a1c0: 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
a1d0: 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
a1e0: 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
a1f0: 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
a200: 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
a210: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
a220: 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
a230: 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
a240: 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
a250: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
a260: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
a270: 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
a280: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
a290: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
a2a0: 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
a2b0: 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
a2c0: 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
a2d0: 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
a2e0: 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
a2f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
a300: 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
a310: 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
a320: 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
a330: 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
a340: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
a350: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a360: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
a370: 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
a380: 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
a390: 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
a3a0: 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
a3b0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
a3c0: 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
a3d0: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
a3e0: 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
a3f0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
a400: 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
a410: 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67   simpification g
a420: 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
a430: 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
a440: 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
a450: 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
a460: 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
a470: 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
a480: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
a490: 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
a4a0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
a4b0: 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
a4c0: 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
a4d0: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
a4e0: 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
a4f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
a500: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
a510: 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
a520: 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
a530: 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
a540: 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
a550: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
a560: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
a570: 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
a580: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
a590: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
a5a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ..**.**   (3)  T
a5b0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
a5c0: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
a5d0: 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
a5e0: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
a5f0: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
a600: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
a610: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
a620: 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
a630: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
a640: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
a650: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
a660: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
a670: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
a680: 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
a690: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
a6a0: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
a6b0: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
a6c0: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
a6d0: 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
a6e0: 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
a6f0: 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
a700: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
a710: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
a720: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
a730: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
a740: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
a750: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
a760: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
a770: 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
a780: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
a790: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
a7a0: 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
a7b0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
a7c0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
a7d0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
a7e0: 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
a7f0: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
a800: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
a810: 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 49  e LIMIT..**.** I
a820: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
a830: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
a840: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
a850: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
a860: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
a870: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
a880: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
a890: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
a8a0: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
a8b0: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
a8c0: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
a8d0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
a8e0: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
a8f0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
a900: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
a910: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
a920: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a930: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
a940: 6e 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  n 0..** If flatt
a950: 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
a960: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
a970: 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
a980: 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
a990: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
a9a0: 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
a9b0: 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
a9c0: 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
a9d0: 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
a9e0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
a9f0: 0a 2a 2f 0a 69 6e 74 20 66 6c 61 74 74 65 6e 53  .*/.int flattenS
aa00: 75 62 71 75 65 72 79 28 53 65 6c 65 63 74 20 2a  ubquery(Select *
aa10: 70 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  p, int iFrom, in
aa20: 74 20 69 73 41 67 67 2c 20 69 6e 74 20 73 75 62  t isAgg, int sub
aa30: 71 75 65 72 79 49 73 41 67 67 29 7b 0a 20 20 53  queryIsAgg){.  S
aa40: 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
aa50: 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
aa60: 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
aa70: 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ry" */.  SrcList
aa80: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
aa90: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
aaa0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
aab0: 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
aac0: 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
aad0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
aae0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
aaf0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
ab00: 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
ab10: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
ab20: 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
ab30: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
ab40: 50 61 72 65 6e 74 2c 20 69 53 75 62 3b 0a 20 20  Parent, iSub;.  
ab50: 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20  Expr *pWhere;.. 
ab60: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
ab70: 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
ab80: 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
ab90: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
aba0: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
abb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
abc0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
abd0: 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
abe0: 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
abf0: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
ac00: 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pSub = pSrc->a[
ac10: 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a  iFrom].pSelect;.
ac20: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
ac30: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
ac40: 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
ac50: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
ac60: 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
ac70: 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
ac80: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
ac90: 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
aca0: 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
acb0: 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28  pSubSrc );.  if(
acc0: 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 21 3d   pSubSrc->nSrc!=
acd0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
ace0: 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73  if( (pSub->isDis
acf0: 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e  tinct || pSub->n
ad00: 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70  Limit>=0) &&  (p
ad10: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
ad20: 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
ad30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
ad40: 28 20 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  ( (p->isDistinct
ad50: 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   || p->nLimit>=0
ad60: 29 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  ) && subqueryIsA
ad70: 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  gg ) return 0;..
ad80: 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
ad90: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
ada0: 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67  means flattening
adb0: 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f   is permitted fo
adc0: 72 20 74 68 65 0a 20 20 2a 2a 20 69 2d 74 68 20  r the.  ** i-th 
add0: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
ade0: 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
adf0: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
ae00: 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 2d  /.  iParent = p-
ae10: 3e 62 61 73 65 20 2b 20 69 46 72 6f 6d 3b 0a 20  >base + iFrom;. 
ae20: 20 69 53 75 62 20 3d 20 70 53 75 62 2d 3e 62 61   iSub = pSub->ba
ae30: 73 65 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  se;.  substExprL
ae40: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69  ist(p->pEList, i
ae50: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
ae60: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 70  List, iSub);.  p
ae70: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
ae80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ae90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
aea0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
aeb0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
aec0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
aed0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
aee0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
aef0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
af00: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
af10: 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
af20: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
af30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
af40: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
af50: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
af60: 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
af70: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20  , pSub->pEList, 
af80: 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74  iSub);.    subst
af90: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
afa0: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
afb0: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
afc0: 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69   }.  substExprLi
afd0: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
afe0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
aff0: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
b000: 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
b010: 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
b020: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
b030: 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
b040: 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d 69    if( iParent!=i
b050: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61  Sub ){.      cha
b060: 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65 72 65  ngeTables(pWhere
b070: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
b080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
b090: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
b0a0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
b0b0: 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
b0c0: 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
b0d0: 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
b0e0: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
b0f0: 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
b100: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
b110: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
b120: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
b130: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
b140: 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ub);.    if( pSu
b150: 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  b->pHaving ){.  
b160: 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e      Expr *pHavin
b170: 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  g = sqliteExprDu
b180: 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  p(pSub->pHaving)
b190: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 61 72  ;.      if( iPar
b1a0: 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20  ent!=iSub ){.   
b1b0: 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65       changeTable
b1c0: 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75 62 2c  s(pHaving, iSub,
b1d0: 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   iParent);.     
b1e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
b1f0: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
b200: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
b210: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e  sqliteExpr(TK_AN
b220: 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  D, p->pHaving, p
b230: 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20  Having, 0);.    
b240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b250: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48   p->pHaving = pH
b260: 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20  aving;.      }. 
b270: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b280: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
b290: 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
b2a0: 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  By = sqliteExprL
b2b0: 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
b2c0: 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66 28 20  oupBy);.    if( 
b2d0: 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29 7b  iParent!=iSub ){
b2e0: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62  .      changeTab
b2f0: 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 47 72  lesInList(p->pGr
b300: 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69 50 61  oupBy, iSub, iPa
b310: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
b320: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
b330: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
b340: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
b350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
b360: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
b370: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
b380: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
b390: 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65 20  .    if( pWhere 
b3a0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  ){.      p->pWhe
b3b0: 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  re = sqliteExpr(
b3c0: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72  TK_AND, p->pWher
b3d0: 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  e, pWhere, 0);. 
b3e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69 73     }.  }.  p->is
b3f0: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
b400: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
b410: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
b420: 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  if( pSub->nLimit
b430: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
b440: 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ->nLimit<0 ){.  
b450: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
b460: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20  pSub->nLimit;.  
b470: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
b480: 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74  Limit+p->nOffset
b490: 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b   > pSub->nLimit+
b4a0: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b  pSub->nOffset ){
b4b0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
b4c0: 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20   = pSub->nLimit 
b4d0: 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  + pSub->nOffset 
b4e0: 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  - p->nOffset;.  
b4f0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66    }.  }.  p->nOf
b500: 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f  fset += pSub->nO
b510: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 70 53 72  ffset;.  if( pSr
b520: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
b530: 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f   && pSrc->a[iFro
b540: 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m].pTab->isTrans
b550: 69 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ient ){.    sqli
b560: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
b570: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
b580: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 53 72  pTab);.  }.  pSr
b590: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62  c->a[iFrom].pTab
b5a0: 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d   = pSubSrc->a[0]
b5b0: 2e 70 54 61 62 3b 0a 20 20 70 53 75 62 53 72 63  .pTab;.  pSubSrc
b5c0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 30 3b  ->a[0].pTab = 0;
b5d0: 0a 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  .  pSrc->a[iFrom
b5e0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ].pSelect = pSub
b5f0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
b600: 74 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b  t;.  pSubSrc->a[
b610: 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  0].pSelect = 0;.
b620: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
b630: 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65  lete(pSub);.  re
b640: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
b650: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
b660: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
b670: 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
b680: 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
b690: 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
b6a0: 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
b6b0: 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
b6c0: 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
b6d0: 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
b6e0: 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
b6f0: 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
b700: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
b710: 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
b720: 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
b730: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
b740: 73 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 20  s SELECT return 
b750: 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
b760: 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
b770: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
b780: 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
b790: 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
b7a0: 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
b7b0: 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
b7c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
b7d0: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
b7e0: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
b7f0: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
b800: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
b810: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
b820: 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
b830: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
b840: 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
b850: 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
b860: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
b870: 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
b880: 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
b890: 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
b8a0: 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
b8b0: 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
b8c0: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
b8d0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
b8e0: 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
b8f0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
b900: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
b910: 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
b920: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
b930: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
b940: 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
b950: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e 0a  sqliteSelect()..
b960: 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
b970: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
b980: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
b990: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
b9a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b9b0: 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
b9c0: 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
b9d0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
b9e0: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
b9f0: 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
ba00: 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
ba10: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
ba20: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
ba30: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
ba40: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6f 70 65  be *v;.  int ope
ba50: 6e 4f 70 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f  nOp;.  int seekO
ba60: 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20  p;.  int cont;. 
ba70: 20 45 78 70 72 4c 69 73 74 20 65 4c 69 73 74 3b   ExprList eList;
ba80: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
ba90: 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
baa0: 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  m;..  /* Check t
bab0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75  o see if this qu
bac0: 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ery is a simple 
bad0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
bae0: 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20  uery.  Return.  
baf0: 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73  ** zero if it is
bb00: 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66    not..  */.  if
bb10: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c  ( p->pGroupBy ||
bb20: 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70   p->pHaving || p
bb30: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
bb40: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  n 0;.  if( p->pS
bb50: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
bb60: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
bb70: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
bb80: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
bb90: 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
bba0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
bbb0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
bbc0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
bbd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
bbe0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
bbf0: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 || pExpr->pLis
bc00: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
bc10: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
bc20: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
bc30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
bc40: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
bc50: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
bc60: 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
bc70: 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52     seekOp = OP_R
bc80: 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ewind;.  }else i
bc90: 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
bca0: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
bcb0: 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
bcc0: 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
bcd0: 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
bce0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
bcf0: 0a 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72  .  pExpr = pExpr
bd00: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
bd10: 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
bd20: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
bd30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
bd40: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
bd50: 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d  umn;.  pTab = p-
bd60: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
bd70: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
bd80: 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65  t to here, it me
bd90: 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73  ans the query is
bda0: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
bdb0: 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b  form..  ** Check
bdc0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
bdd0: 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61   have an index a
bde0: 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69  nd make pIdx poi
bdf0: 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61  nt to the.  ** a
be00: 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
be10: 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20  .  If the min() 
be20: 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61  or max() is on a
be30: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
be40: 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d  Y.  ** key colum
be50: 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e  n, no index is n
be60: 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20  ecessary so set 
be70: 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49  pIdx to NULL.  I
be80: 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65  f no.  ** usable
be90: 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c   index is found,
bea0: 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
beb0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
bec0: 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
bed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
bee0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
bef0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
bf00: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
bf10: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
bf20: 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20  Column>=1 );.   
bf30: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
bf40: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29  olumn[0]==iCol )
bf50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bf60: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
bf70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
bf80: 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
bf90: 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
bfa0: 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
bfb0: 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  e callback.  Thi
bfc0: 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
bfd0: 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
bfe0: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
bff0: 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65   a table or a me
c000: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a  mory cell..  */.
c010: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
c020: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
c030: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
c040: 20 30 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d   0;.  if( eDest=
c050: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
c060: 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
c070: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
c080: 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72   p->base, p->pSr
c090: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  c, p->pEList);. 
c0a0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
c0b0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
c0c0: 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
c0d0: 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
c0e0: 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
c0f0: 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
c100: 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
c110: 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
c120: 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
c130: 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
c140: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
c150: 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
c160: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
c170: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
c180: 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
c190: 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
c1a0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
c1b0: 21 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56  !pParse->schemaV
c1c0: 65 72 69 66 69 65 64 20 26 26 20 28 70 50 61 72  erified && (pPar
c1d0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
c1e0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
c1f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c200: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c210: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50  VerifyCookie, pP
c220: 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61  arse->db->schema
c230: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
c240: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
c250: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  erified = 1;.  }
c260: 0a 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62  .  openOp = pTab
c270: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
c280: 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b  enAux : OP_Open;
c290: 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73  .  base = p->bas
c2a0: 65 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  e;.  sqliteVdbeA
c2b0: 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20  ddOp(v, openOp, 
c2c0: 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  base, pTab->tnum
c2d0: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43  );.  sqliteVdbeC
c2e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
c2f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
c300: 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 70 49  TATIC);.  if( pI
c310: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
c320: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c330: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
c340: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
c350: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c360: 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2b 31  , openOp, base+1
c370: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20  , pIdx->tnum);. 
c380: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c390: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64  ngeP3(v, -1, pId
c3a0: 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  x->zName, P3_STA
c3b0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
c3c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
c3d0: 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  kOp, base+1, 0);
c3e0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
c3f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 65  ddOp(v, OP_IdxRe
c400: 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b  cno, base+1, 0);
c410: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
c420: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
c430: 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20  , base+1, 0);.  
c440: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c450: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20  p(v, OP_MoveTo, 
c460: 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  base, 0);.  }.  
c470: 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b  eList.nExpr = 1;
c480: 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74  .  memset(&eList
c490: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
c4a0: 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65  eListItem));.  e
c4b0: 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49  List.a = &eListI
c4c0: 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30  tem;.  eList.a[0
c4d0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
c4e0: 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  .  cont = sqlite
c4f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
c500: 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
c510: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26  oop(pParse, p, &
c520: 65 4c 69 73 74 2c 20 62 61 73 65 2c 20 31 2c 20  eList, base, 1, 
c530: 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
c540: 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29  arm, cont, cont)
c550: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65  ;.  sqliteVdbeRe
c560: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f  solveLabel(v, co
c570: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
c580: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
c590: 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
c5a0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
c5b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
c5c0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
c5d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
c5e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
c5f0: 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
c600: 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
c610: 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
c620: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
c630: 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
c640: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
c650: 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
c660: 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
c670: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
c680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6a0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
c6b0: 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
c6c0: 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
c6d0: 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
c6e0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
c6f0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
c700: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
c710: 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
c720: 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
c730: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
c740: 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
c750: 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
c760: 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  of a table with 
c770: 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a  cursor iParm.**.
c780: 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
c790: 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
c7a0: 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
c7b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
c7c0: 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  le iParm.**.**  
c7d0: 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
c7e0: 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
c7f0: 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f  s form the tempo
c800: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
c810: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
c820: 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
c830: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
c840: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
c850: 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  rm.**.** This ro
c860: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
c870: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
c880: 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
c890: 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
c8a0: 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
c8b0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
c8c0: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
c8d0: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
c8e0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
c8f0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
c900: 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
c910: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
c920: 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
c930: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c940: 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
c950: 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
c960: 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
c970: 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
c980: 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
c990: 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
c9a0: 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
c9b0: 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
c9c0: 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
c9d0: 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
c9e0: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
c9f0: 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
ca00: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
ca10: 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
ca20: 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
ca30: 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
ca40: 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
ca50: 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
ca60: 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
ca70: 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
ca80: 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
ca90: 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
caa0: 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
cab0: 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
cac0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
cad0: 6e 74 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28  nt sqliteSelect(
cae0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
caf0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
cb00: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
cb10: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cb30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cb40: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
cb50: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb70: 4f 6e 65 20 6f 66 3a 20 53 52 54 5f 43 61 6c 6c  One of: SRT_Call
cb80: 62 61 63 6b 20 4d 65 6d 20 53 65 74 20 55 6e 69  back Mem Set Uni
cb90: 6f 6e 20 45 78 63 65 70 74 20 2a 2f 0a 20 20 69  on Except */.  i
cba0: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
cbb0: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 20 72 65        /* Save re
cbc0: 73 75 6c 74 20 69 6e 20 74 68 69 73 20 6d 65 6d  sult in this mem
cbd0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2c 20 69 66  ory location, if
cbe0: 20 3e 3d 30 20 2a 2f 0a 20 20 53 65 6c 65 63 74   >=0 */.  Select
cbf0: 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
cc00: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
cc10: 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  CT for which thi
cc20: 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79  s is a sub-query
cc30: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
cc40: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
cc50: 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74  Index in pParent
cc60: 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71  ->pSrc of this q
cc70: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  uery */.  int *p
cc80: 50 61 72 65 6e 74 41 67 67 20 20 20 20 20 20 20  ParentAgg       
cc90: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
cca0: 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61  ent uses aggrega
ccb0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
ccc0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
ccd0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
cce0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
ccf0: 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20  t isAgg = 0;    
cd00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
cd10: 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
cd20: 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
cd30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
cd40: 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
cd50: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
cd60: 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
cd70: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
cd80: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
cd90: 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
cda0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
cdb0: 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
cdc0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
cdd0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
cde0: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
cdf0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
ce00: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
ce10: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
ce20: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
ce30: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
ce40: 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
ce50: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
ce60: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
ce70: 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
ce80: 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
ce90: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
cea0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
ceb0: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
cec0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
ced0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
cee0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
cef0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
cf00: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
cf10: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
cf20: 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
cf30: 20 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20    int base;     
cf40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
cf50: 74 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62  t cursor availab
cf60: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20  le for use */.  
cf70: 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
cf80: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
cf90: 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
cfa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
cfb0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
cfc0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
cfd0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
cfe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
cff0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
d000: 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
d010: 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
d020: 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
d030: 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
d040: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
d050: 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
d060: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d070: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
d080: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d090: 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20  local copies of 
d0a0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66  the parameters f
d0b0: 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20  or this query.. 
d0c0: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   */.  pTabList =
d0d0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65   p->pSrc;.  pWhe
d0e0: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
d0f0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
d100: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f  pOrderBy;.  pGro
d110: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
d120: 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
d130: 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
d140: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
d150: 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20  Distinct;..  /* 
d160: 41 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  Allocate a block
d170: 20 6f 66 20 56 44 42 45 20 63 75 72 73 6f 72 73   of VDBE cursors
d180: 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 74  , one for each t
d190: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
d1a0: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 54 68   clause..  ** Th
d1b0: 65 20 57 48 45 52 45 20 70 72 6f 63 65 73 73 69  e WHERE processi
d1c0: 6e 67 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ng requires that
d1d0: 20 74 68 65 20 63 75 72 73 6f 72 73 20 66 6f 72   the cursors for
d1e0: 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
d1f0: 68 65 0a 20 20 2a 2a 20 46 52 4f 4d 20 63 6c 61  he.  ** FROM cla
d200: 75 73 65 20 62 65 20 63 6f 6e 73 65 63 75 74 69  use be consecuti
d210: 76 65 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20  ve..  */.  base 
d220: 3d 20 70 2d 3e 62 61 73 65 20 3d 20 70 50 61 72  = p->base = pPar
d230: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72  se->nTab;.  pPar
d240: 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 70 54 61 62  se->nTab += pTab
d250: 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f  List->nSrc;..  /
d260: 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
d270: 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
d280: 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
d290: 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
d2a0: 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
d2b0: 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
d2c0: 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
d2d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
d2e0: 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
d2f0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
d300: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
d310: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  y table in the t
d320: 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 63 72  able list and cr
d330: 65 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69  eate an appropri
d340: 61 74 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c  ate.  ** columnl
d350: 69 73 74 20 69 6e 20 70 45 4c 69 73 74 20 69 66  ist in pEList if
d360: 20 74 68 65 72 65 20 69 73 6e 27 74 20 6f 6e 65   there isn't one
d370: 20 61 6c 72 65 61 64 79 2e 20 20 28 54 68 65 20   already.  (The 
d380: 70 61 72 73 65 72 20 6c 65 61 76 65 73 0a 20 20  parser leaves.  
d390: 2a 2a 20 61 20 4e 55 4c 4c 20 69 6e 20 74 68 65  ** a NULL in the
d3a0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 66 20 74 68   p->pEList if th
d3b0: 65 20 53 51 4c 20 73 61 69 64 20 22 53 45 4c 45  e SQL said "SELE
d3c0: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a  CT * FROM ...").
d3d0: 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49    */.  if( fillI
d3e0: 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72  nColumnList(pPar
d3f0: 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f  se, p) ){.    go
d400: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
d410: 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d   }.  pWhere = p-
d420: 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69 73  >pWhere;.  pELis
d430: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
d440: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
d450: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
d460: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
d470: 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
d480: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
d490: 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
d4a0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
d4b0: 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
d4c0: 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54   if( (eDest==SRT
d4d0: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
d4e0: 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73  RT_Set) && pELis
d4f0: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20  t->nExpr>1 ){.  
d500: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
d510: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
d520: 73 67 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  sg, "only a sing
d530: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
d540: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
d550: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
d560: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
d570: 65 73 73 69 6f 6e 22 2c 20 30 29 3b 0a 20 20 20  ession", 0);.   
d580: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
d590: 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
d5a0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
d5b0: 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
d5c0: 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
d5d0: 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
d5e0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
d5f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
d600: 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
d610: 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
d620: 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
d630: 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  :.      pOrderBy
d640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
d650: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
d660: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
d670: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
d680: 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
d690: 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
d6a0: 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
d6b0: 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
d6c0: 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
d6d0: 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
d6e0: 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
d6f0: 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
d700: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d710: 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
d720: 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
d730: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
d740: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
d750: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
d760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
d770: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
d780: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
d790: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
d7a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d7b0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
d7c0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
d7d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
d7e0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
d7f0: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
d800: 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67  .pExpr, 1, &isAg
d810: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
d820: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
d830: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68   }.  }.  if( pWh
d840: 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ere ){.    if( s
d850: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
d860: 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
d870: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
d880: 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20  st, pWhere) ){. 
d890: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
d8a0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
d8b0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
d8c0: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65  eck(pParse, pWhe
d8d0: 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  re, 0, 0) ){.   
d8e0: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
d8f0: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
d900: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
d910: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d920: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
d930: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
d940: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
d950: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d960: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
d970: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
d980: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
d990: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
d9a0: 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
d9b0: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
d9c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d9d0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
d9e0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
d9f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
da00: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
da10: 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
da20: 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
da30: 6e 74 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  nts", 0);.      
da40: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
da50: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ++;.          go
da60: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
da70: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
da80: 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
da90: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
daa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
dab0: 20 7a 42 75 66 5b 32 30 30 30 5d 3b 0a 20 20 20   zBuf[2000];.   
dac0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
dad0: 42 75 66 2c 22 4f 52 44 45 52 20 42 59 20 63 6f  Buf,"ORDER BY co
dae0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
daf0: 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
db00: 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
db10: 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
db20: 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c  1 and %d", iCol,
db30: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
db40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
db50: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
db60: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 42 75  se->zErrMsg, zBu
db70: 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  f, 0);.         
db80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
db90: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
dba0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
dbb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
dbc0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
dbd0: 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  E);.        pE =
dbe0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
dbf0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78  pExpr = sqliteEx
dc00: 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
dc10: 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
dc20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dc30: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
dc40: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62  lveIds(pParse, b
dc50: 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  ase, pTabList, p
dc60: 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20  EList, pE) ){.  
dc70: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
dc80: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
dc90: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
dca0: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
dcb0: 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29   pE, isAgg, 0) )
dcc0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
dcd0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
dce0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
dcf0: 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
dd00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
dd10: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
dd20: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
dd30: 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  *pE = pGroupBy->
dd40: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
dd50: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
dd60: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
dd70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
dd80: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
dd90: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20  e->zErrMsg, .   
dda0: 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50            "GROUP
ddb0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20   BY expressions 
ddc0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f  should not be co
ddd0: 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20  nstant", 0);.   
dde0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
ddf0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
de00: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
de10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
de20: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
de30: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
de40: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
de50: 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
de60: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
de70: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
de80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
de90: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
dea0: 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
deb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
dec0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
ded0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
dee0: 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
def0: 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20  if( pGroupBy==0 
df00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
df10: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
df20: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52  ->zErrMsg, "a GR
df30: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
df40: 20 72 65 71 75 69 72 65 64 20 22 0a 20 20 20 20   required ".    
df50: 20 20 20 20 20 22 62 65 66 6f 72 65 20 48 41 56       "before HAV
df60: 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ING", 0);.      
df70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
df80: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
df90: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
dfa0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
dfb0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
dfc0: 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  , base, pTabList
dfd0: 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e  , pEList, pHavin
dfe0: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
dff0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
e000: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
e010: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
e020: 65 2c 20 70 48 61 76 69 6e 67 2c 20 69 73 41 67  e, pHaving, isAg
e030: 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67  g, 0) ){.      g
e040: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
e050: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e060: 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
e070: 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
e080: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
e090: 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
e0a0: 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
e0b0: 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
e0c0: 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
e0d0: 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
e0e0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
e0f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
e100: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
e110: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  nd;.  }..  /* Be
e120: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
e130: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
e140: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
e150: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
e160: 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
e170: 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end;..  /* Ident
e180: 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
e190: 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
e1a0: 73 69 6e 67 20 69 6e 20 74 68 65 20 63 61 6c 6c  sing in the call
e1b0: 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
e1c0: 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
e1d0: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
e1e0: 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
e1f0: 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
e200: 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ell..  */.  if( 
e210: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
e220: 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
e230: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
e240: 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20  Parse, p->base, 
e250: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
e260: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
e270: 20 74 68 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a   the limiter.  *
e280: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  /.  if( p->nLimi
e290: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  t<=0 ){.    p->n
e2a0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
e2b0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
e2c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
e2d0: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
e2e0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nMem++;.    sqli
e2f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e300: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
e310: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
e320: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e330: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
e340: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
e350: 6e 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  nLimit = iMem;. 
e360: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65     if( p->nOffse
e370: 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  t<=0 ){.      p-
e380: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
e390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
e3a0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
e3b0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  em++;.      sqli
e3c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e3d0: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
e3e0: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
e3f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e400: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
e410: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
e420: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 69    p->nOffset = i
e430: 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Mem;.    }.  }..
e440: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e450: 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
e460: 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
e470: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
e480: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
e490: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
e4a0: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  {.    if( pTabLi
e4b0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
e4c0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
e4d0: 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
e4e0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
e4f0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  t->a[i].pSelect,
e500: 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20   SRT_TempTable, 
e510: 62 61 73 65 2b 69 2c 0a 20 20 20 20 20 20 20 20  base+i,.        
e520: 20 20 20 20 20 20 20 20 20 70 2c 20 69 2c 20 26           p, i, &
e530: 69 73 41 67 67 29 3b 0a 20 20 20 20 70 54 61 62  isAgg);.    pTab
e540: 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
e550: 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
e560: 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20  pWhere;.    if( 
e570: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
e580: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  ack ){.      pOr
e590: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
e5a0: 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rBy;.    }.    p
e5b0: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
e5c0: 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69  oupBy;.    pHavi
e5d0: 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
e5e0: 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
e5f0: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
e600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
e610: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
e620: 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
e630: 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
e640: 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
e650: 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
e660: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
e670: 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
e680: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
e690: 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
e6a0: 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
e6b0: 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
e6c0: 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
e6d0: 75 65 72 79 28 70 50 61 72 65 6e 74 2c 20 70 61  uery(pParent, pa
e6e0: 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e  rentTab, *pParen
e6f0: 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a  tAgg, isAgg) ){.
e700: 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
e710: 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b  *pParentAgg = 1;
e720: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e730: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e740: 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
e750: 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
e760: 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
e770: 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
e780: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
e790: 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
e7a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e7b0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
e7c0: 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
e7d0: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e  }..  /* Do an an
e7e0: 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65 67  alysis of aggreg
e7f0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  ate expressions.
e800: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67  .  */.  sqliteAg
e810: 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
e820: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
e830: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  isAgg ){.    ass
e840: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67  ert( pParse->nAg
e850: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  g==0 );.    for(
e860: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
e870: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e880: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
e890: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
e8a0: 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
e8b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
e8c0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
e8d0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e8e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e8f0: 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
e900: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
e910: 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
e920: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
e930: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
e940: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
e950: 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
e960: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
e970: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
e980: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
e990: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
e9a0: 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
e9b0: 26 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  && sqliteExprAna
e9c0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
e9d0: 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20  Parse, pHaving) 
e9e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
e9f0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
ea00: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
ea10: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
ea20: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
ea30: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ea40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
ea50: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
ea60: 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64  tes(pParse, pOrd
ea70: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
ea80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
ea90: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
eaa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eab0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
eac0: 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
ead0: 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66  egator.  */.  if
eae0: 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
eaf0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
eb00: 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30  , OP_AggReset, 0
eb10: 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b  , pParse->nAgg);
eb20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
eb30: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
eb40: 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  +){.      FuncDe
eb50: 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  f *pFunc;.      
eb60: 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61  if( (pFunc = pPa
eb70: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
eb80: 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d  nc)!=0 && pFunc-
eb90: 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
eba0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
ebb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
ebc0: 67 67 49 6e 69 74 2c 20 30 2c 20 69 29 3b 0a 20  ggInit, 0, i);. 
ebd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
ebe0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
ebf0: 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50   (char*)pFunc, P
ec00: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
ec10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ec20: 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
ec30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ec40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
ec50: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
ec60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ec70: 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
ec80: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
ec90: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
eca0: 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
ecb0: 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
ecc0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
ecd0: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
ece0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ecf0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
ed00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
ed10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
ed20: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
ed30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
ed40: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
ed50: 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
ed60: 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
ed70: 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
ed80: 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74  inct ){.    dist
ed90: 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
eda0: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
edb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
edc0: 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69  _OpenTemp, disti
edd0: 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  nct, 1);.  }else
ede0: 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
edf0: 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42   -1;.  }..  /* B
ee00: 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
ee10: 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57  e scan.  */.  pW
ee20: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65  Info = sqliteWhe
ee30: 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
ee40: 70 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73  p->base, pTabLis
ee50: 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 26 70  t, pWhere, 0, &p
ee60: 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
ee70: 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
ee80: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
ee90: 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
eea0: 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69  ard inner loop i
eeb0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61  f we are not dea
eec0: 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61  ling with.  ** a
eed0: 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20  ggregates.  */. 
eee0: 20 69 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20   if( !isAgg ){. 
eef0: 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
ef00: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
ef10: 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
ef20: 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
ef30: 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ef50: 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43  Parm, pWInfo->iC
ef60: 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
ef70: 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20  >iBreak) ){.    
ef80: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
ef90: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
efa0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65   /* If we are de
efb0: 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65  aling with aggre
efc0: 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74  gates, then do t
efd0: 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65  he special aggre
efe0: 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73  gate.  ** proces
eff0: 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65  sing.  .  */.  e
f000: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72  lse{.    if( pGr
f010: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
f020: 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66  nt lbl1;.      f
f030: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
f040: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
f050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
f060: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f070: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
f080: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
f090: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f0a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b  ddOp(v, OP_MakeK
f0b0: 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ey, pGroupBy->nE
f0c0: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c  xpr, 0);.      l
f0d0: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
f0e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
f0f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f100: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63  dOp(v, OP_AggFoc
f110: 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20  us, 0, lbl1);.  
f120: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f130: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
f140: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
f150: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
f160: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
f170: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
f180: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f190: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
f1a0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
f1b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f1c0: 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c  v, OP_AggSet, 0,
f1d0: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
f1e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
f1f0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
f200: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
f210: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
f220: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
f230: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
f240: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
f250: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67  if( !pParse->aAg
f260: 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
f270: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
f280: 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
f290: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
f2a0: 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54  ssert( pE->op==T
f2b0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
f2c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
f2d0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
f2e0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e   for(j=0; j<pE->
f2f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  pList->nExpr; j+
f300: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
f310: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
f320: 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  rse, pE->pList->
f330: 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
f340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f350: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f360: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
f370: 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  er, i, 0);.     
f380: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f390: 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20  (v, OP_AggFunc, 
f3a0: 30 2c 20 70 45 2d 3e 70 4c 69 73 74 20 3f 20 70  0, pE->pList ? p
f3b0: 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  E->pList->nExpr 
f3c0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  : 0);.      asse
f3d0: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67  rt( pParse->aAgg
f3e0: 5b 69 5d 2e 70 46 75 6e 63 21 3d 30 20 29 3b 0a  [i].pFunc!=0 );.
f3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f400: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
f410: 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b  unc->xStep!=0 );
f420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f430: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
f440: 20 28 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e   (char*)pParse->
f450: 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2c 20 50  aAgg[i].pFunc, P
f460: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
f470: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20  }.  }..  /* End 
f480: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
f490: 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73  n loop..  */.  s
f4a0: 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70 57  qliteWhereEnd(pW
f4b0: 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Info);..  /* If 
f4c0: 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e  we are processin
f4d0: 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65  g aggregates, we
f4e0: 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20   need to set up 
f4f0: 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20  a second loop.  
f500: 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
f510: 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c  he aggregate val
f520: 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20  ues and process 
f530: 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  them..  */.  if(
f540: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e   isAgg ){.    in
f550: 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74  t endagg = sqlit
f560: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
f570: 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  );.    int start
f580: 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67  agg;.    startag
f590: 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  g = sqliteVdbeAd
f5a0: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78  dOp(v, OP_AggNex
f5b0: 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20  t, 0, endagg);. 
f5c0: 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67     pParse->useAg
f5d0: 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  g = 1;.    if( p
f5e0: 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
f5f0: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
f600: 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
f610: 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b  g, startagg, 1);
f620: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
f630: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
f640: 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
f650: 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
f660: 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
f670: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
f680: 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 73 74         iParm, st
f690: 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67 29 20  artagg, endagg) 
f6a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
f6b0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
f6c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f6d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
f6e0: 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20  0, startagg);.  
f6f0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
f700: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61  lveLabel(v, enda
f710: 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  gg);.    sqliteV
f720: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
f730: 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oop, 0, 0);.    
f740: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
f750: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
f760: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
f770: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
f780: 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
f790: 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
f7a0: 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
f7b0: 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
f7c0: 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
f7d0: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
f7e0: 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
f7f0: 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
f800: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
f810: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
f820: 7d 0a 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61  }...  /* Issue a
f830: 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69   null callback i
f840: 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74  f that is what t
f850: 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20  he user wants.. 
f860: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72 73   */.  if( (pPars
f870: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
f880: 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
f890: 63 6b 29 21 3d 30 20 26 26 20 65 44 65 73 74 3d  ck)!=0 && eDest=
f8a0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
f8b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f8c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43  ddOp(v, OP_NullC
f8d0: 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d  allback, pEList-
f8e0: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a  >nExpr, 0);.  }.
f8f0: 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
f900: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
f910: 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
f920: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
f930: 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
f940: 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
f950: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
f960: 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
f970: 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
f980: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
f990: 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
f9a0: 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
f9b0: 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
f9c0: 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
f9d0: 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 50  select_end:.  pP
f9e0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73  arse->nTab = bas
f9f0: 65 3b 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65  e;.  sqliteAggre
fa00: 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50  gateInfoReset(pP
fa10: 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  arse);.  return 
fa20: 72 63 3b 0a 7d 0a                                rc;.}.