/ Hex Artifact Content
Login

Artifact 7aa3c3784452ca8f154ae9b3b250ccedc1633354:


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 38  select.c,v 1.108
0200: 20 32 30 30 32 2f 30 38 2f 32 34 20 31 38 3a 32   2002/08/24 18:2
0210: 34 3a 35 34 20 64 72 68 20 45 78 70 20 24 0a 2a  4:54 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 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 64  trlen(zCol);.  d
1230: 75 6d 6d 79 2e 62 61 73 65 20 3d 20 31 3b 0a 20  ummy.base = 1;. 
1240: 20 64 75 6d 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a   dummy.dyn = 0;.
1250: 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 45    pE1a = sqliteE
1260: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1270: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61   &dummy);.  pE2a
1280: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
1290: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
12a0: 79 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20  y);.  dummy.z = 
12b0: 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab1->zName;.  
12c0: 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e  dummy.n = strlen
12d0: 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31  (dummy.z);.  pE1
12e0: 62 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  b = sqliteExpr(T
12f0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
1300: 6d 79 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d  my);.  dummy.z =
1310: 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab2->zName;. 
1320: 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65   dummy.n = strle
1330: 6e 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45  n(dummy.z);.  pE
1340: 32 62 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  2b = sqliteExpr(
1350: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
1360: 6d 6d 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73  mmy);.  pE1c = s
1370: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54  qliteExpr(TK_DOT
1380: 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29  , pE1b, pE1a, 0)
1390: 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74  ;.  pE2c = sqlit
13a0: 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45  eExpr(TK_DOT, pE
13b0: 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20  2b, pE2a, 0);.  
13c0: 70 45 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  pE = sqliteExpr(
13d0: 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32  TK_EQ, pE1c, pE2
13e0: 63 2c 20 30 29 3b 0a 20 20 70 45 2d 3e 69 73 4a  c, 0);.  pE->isJ
13f0: 6f 69 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 69  oinExpr = 1;.  i
1400: 66 28 20 2a 70 70 45 78 70 72 20 29 7b 0a 20 20  f( *ppExpr ){.  
1410: 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69    *ppExpr = sqli
1420: 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a  teExpr(TK_AND, *
1430: 70 70 45 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a  ppExpr, pE, 0);.
1440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
1450: 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d  Expr = pE;.  }.}
1460: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1470: 45 78 70 72 2e 69 73 4a 6f 69 6e 45 78 70 72 20  Expr.isJoinExpr 
1480: 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  flag on all term
1490: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
14a0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
14b0: 20 54 68 65 20 45 78 70 72 2e 69 73 4a 6f 69 6e   The Expr.isJoin
14c0: 45 78 70 72 20 66 6c 61 67 20 69 73 20 75 73 65  Expr flag is use
14d0: 64 20 61 74 20 6f 6e 20 74 65 72 6d 73 20 6f 66  d at on terms of
14e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
14f0: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
1500: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
1510: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
1520: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
1530: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
1540: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
1550: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 20   and not a part 
1560: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1570: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1590: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
15a0: 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  r *p){.  while( 
15b0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 4a 6f  p ){.    p->isJo
15c0: 69 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 20 20  inExpr = 1;.    
15d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
15e0: 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20 70  Left);.    p = p
15f0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
1600: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1610: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
1620: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
1630: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
1640: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
1650: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1660: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
1670: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
1680: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1690: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
16a0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
16b0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
16c0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
16d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16e0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
16f0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
1700: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73  ncountered..*/.s
1710: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1720: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73  ProcessJoin(Pars
1730: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1740: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
1750: 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69 2c   *pSrc;.  int i,
1760: 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   j;.  pSrc = p->
1770: 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  pSrc;.  for(i=0;
1780: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
1790: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
17a0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17b0: 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pTerm = &pSrc->a
17c0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
17d0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
17e0: 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61 5b  ther = &pSrc->a[
17f0: 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  i+1];..    if( p
1800: 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c  Term->pTab==0 ||
1810: 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d 30   pOther->pTab==0
1820: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1830: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
1840: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
1850: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
1860: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1870: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
1880: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
1890: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
18a0: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
18b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
18c0: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
18d0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
18e0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
18f0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1900: 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70 55  pOn || pTerm->pU
1910: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
1920: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
1930: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
1940: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
1950: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
1960: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
1970: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1980: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
1990: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
19a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19b0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
19c0: 20 70 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70   pTab = pTerm->p
19d0: 54 61 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  Tab;.      for(j
19e0: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
19f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1a00: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
1a10: 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54  pOther->pTab, pT
1a20: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1a30: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1a40: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
1a50: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
1a60: 61 6d 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65  ame, pTab, pOthe
1a70: 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68  r->pTab, &p->pWh
1a80: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
1a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1aa0: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
1ab0: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
1ac0: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
1ad0: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
1ae0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1af0: 70 4f 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55  pOn && pTerm->pU
1b00: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
1b10: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
1b20: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
1b30: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
1b40: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
1b50: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
1b60: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
1b70: 69 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  in", 0);.      p
1b80: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
1b90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1ba0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
1bb0: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
1bc0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1bd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
1be0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
1bf0: 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65 72 61  ** and AND opera
1c00: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
1c10: 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 29  if( pTerm->pOn )
1c20: 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45  {.      setJoinE
1c30: 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e 29 3b  xpr(pTerm->pOn);
1c40: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57  .      if( p->pW
1c50: 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  here==0 ){.     
1c60: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
1c70: 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20 20 20  Term->pOn;.     
1c80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c90: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
1ca0: 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  teExpr(TK_AND, p
1cb0: 2d 3e 70 57 68 65 72 65 2c 20 70 54 65 72 6d 2d  ->pWhere, pTerm-
1cc0: 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  >pOn, 0);.      
1cd0: 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  }.      pTerm->p
1ce0: 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  On = 0;.    }.. 
1cf0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74     /* Create ext
1d00: 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
1d10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
1d20: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d   each column nam
1d30: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ed.    ** in the
1d40: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20   USING clause.  
1d50: 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
1d60: 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65  two tables to be
1d70: 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20   joined are .   
1d80: 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20   ** A and B and 
1d90: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
1da0: 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64   names X, Y, and
1db0: 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69   Z, then add thi
1dc0: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  s.    ** to the 
1dd0: 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20  WHERE clause:   
1de0: 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59   A.X=B.X AND A.Y
1df0: 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a  =B.Y AND A.Z=B.Z
1e00: 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61  .    ** Report a
1e10: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63  n error if any c
1e20: 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20  olumn mentioned 
1e30: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
1e40: 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  use is.    ** no
1e50: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62  t contained in b
1e60: 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65  oth tables to be
1e70: 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a   joined..    */.
1e80: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1e90: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
1ea0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  dList *pList;.  
1eb0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
1ec0: 20 61 73 73 65 72 74 28 20 69 3c 70 53 72 63 2d   assert( i<pSrc-
1ed0: 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20 20 20 20  >nSrc-1 );.     
1ee0: 20 70 4c 69 73 74 20 3d 20 70 54 65 72 6d 2d 3e   pList = pTerm->
1ef0: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f  pUsing;.      fo
1f00: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e  r(j=0; j<pList->
1f10: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
1f20: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
1f30: 65 78 28 70 54 65 72 6d 2d 3e 70 54 61 62 2c 20  ex(pTerm->pTab, 
1f40: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
1f50: 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  e)<0 ||.        
1f60: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
1f70: 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 4c  pOther->pTab, pL
1f80: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29  ist->a[j].zName)
1f90: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1fa0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
1fb0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
1fc0: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
1fd0: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 22 2c 0a 20  sing column ",. 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74             pList
1ff0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 22 20  ->a[j].zName, " 
2000: 2d 20 63 6f 6c 75 6d 6e 20 6e 6f 74 20 70 72 65  - column not pre
2010: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
2020: 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  les", 0);.      
2030: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2040: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ++;.          re
2050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
2060: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
2070: 72 65 54 65 72 6d 28 70 4c 69 73 74 2d 3e 61 5b  reTerm(pList->a[
2080: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 65 72 6d 2d  j].zName, pTerm-
2090: 3e 70 54 61 62 2c 20 70 4f 74 68 65 72 2d 3e 70  >pTab, pOther->p
20a0: 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  Tab, &p->pWhere)
20b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
20d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
20e0: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
20f0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
2100: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
2110: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
2120: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
2130: 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ete(Select *p){.
2140: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2150: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  urn;.  sqliteExp
2160: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
2170: 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
2180: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
2190: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
21a0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57  ExprDelete(p->pW
21b0: 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 45  here);.  sqliteE
21c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
21d0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
21e0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
21f0: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71  ->pHaving);.  sq
2200: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
2210: 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(p->pOrderBy);
2220: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
2230: 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29  elete(p->pPrior)
2240: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
2250: 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->zSelect);.  sq
2260: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
2270: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2280: 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
2290: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
22a0: 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  parse structure.
22b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22c0: 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49  sqliteAggregateI
22d0: 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20 2a  nfoReset(Parse *
22e0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
22f0: 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41  eFree(pParse->aA
2300: 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  gg);.  pParse->a
2310: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
2320: 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70  e->nAgg = 0;.  p
2330: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20  Parse->useAgg = 
2340: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  0;.}../*.** Inse
2350: 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22  rt code into "v"
2360: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
2370: 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  the record on th
2380: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20  e top of the.** 
2390: 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73  stack into the s
23a0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
23b0: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
23c0: 72 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  rter(Parse *pPar
23d0: 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78 70  se, Vdbe *v, Exp
23e0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
23f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f 72 74 4f  {.  char *zSortO
2400: 72 64 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  rder;.  int i;. 
2410: 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20 73 71   zSortOrder = sq
2420: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f 72 64  liteMalloc( pOrd
2430: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 20  erBy->nExpr + 1 
2440: 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72 74 4f 72  );.  if( zSortOr
2450: 64 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  der==0 ) return;
2460: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
2470: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
2480: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 72 64  ++){.    int ord
2490: 65 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  er = pOrderBy->a
24a0: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
24b0: 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20     int type;.   
24c0: 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 66 28 20   int c;.    if( 
24d0: 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f  (order & SQLITE_
24e0: 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51  SO_TYPEMASK)==SQ
24f0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
2500: 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51 4c        type = SQL
2510: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
2520: 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 72 64 65   }else if( (orde
2530: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59  r & SQLITE_SO_TY
2540: 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  PEMASK)==SQLITE_
2550: 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20  SO_NUM ){.      
2560: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  type = SQLITE_SO
2570: 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 20  _NUM;.    }else 
2580: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
2590: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
25a0: 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 73  {.      type = s
25b0: 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 4f  qliteExprType(pO
25c0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
25d0: 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pr);.    }else{.
25e0: 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51 4c        type = SQL
25f0: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20  ITE_SO_NUM;.    
2600: 7d 0a 20 20 20 20 69 66 28 20 28 6f 72 64 65 72  }.    if( (order
2610: 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 49 52   & SQLITE_SO_DIR
2620: 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  MASK)==SQLITE_SO
2630: 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 63 20  _ASC ){.      c 
2640: 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53  = type==SQLITE_S
2650: 4f 5f 54 45 58 54 20 3f 20 27 41 27 20 3a 20 27  O_TEXT ? 'A' : '
2660: 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +';.    }else{. 
2670: 20 20 20 20 20 63 20 3d 20 74 79 70 65 3d 3d 53       c = type==S
2680: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f 20  QLITE_SO_TEXT ? 
2690: 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 7d  'D' : '-';.    }
26a0: 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b  .    zSortOrder[
26b0: 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69  i] = c;.    sqli
26c0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
26d0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
26e0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
26f0: 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64 65  zSortOrder[pOrde
2700: 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30 3b  rBy->nExpr] = 0;
2710: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
2720: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b  Op(v, OP_SortMak
2730: 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e  eKey, pOrderBy->
2740: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71 6c  nExpr, 0);.  sql
2750: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
2760: 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f 72 64 65  v, -1, zSortOrde
2770: 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f 72 74 4f  r, strlen(zSortO
2780: 72 64 65 72 29 29 3b 0a 20 20 73 71 6c 69 74 65  rder));.  sqlite
2790: 46 72 65 65 28 7a 53 6f 72 74 4f 72 64 65 72 29  Free(zSortOrder)
27a0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
27b0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75  dOp(v, OP_SortPu
27c0: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
27d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27e0: 61 64 64 73 20 61 20 50 33 20 61 72 67 75 6d 65  adds a P3 argume
27f0: 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20 56  nt to the last V
2800: 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61 74 20  DBE opcode that 
2810: 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2e  was.** inserted.
2820: 20 54 68 65 20 50 33 20 61 72 67 75 6d 65 6e 74   The P3 argument
2830: 20 61 64 64 65 64 20 69 73 20 61 20 73 74 72 69   added is a stri
2840: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ng suitable for 
2850: 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b 65 4b  the .** OP_MakeK
2860: 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49 64 78  ey or OP_MakeIdx
2870: 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20 54 68  Key opcodes.  Th
2880: 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  e string consist
2890: 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65  s of.** characte
28a0: 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20 64 65  rs 't' or 'n' de
28b0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
28c0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 76 61  er or not the va
28d0: 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64 73 20  rious.** fields 
28e0: 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20 62 65  of the key to be
28f0: 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f 75 6c   generated shoul
2900: 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  d be treated as 
2910: 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20 61 73  numeric.** or as
2920: 20 74 65 78 74 2e 20 20 53 65 65 20 74 68 65 20   text.  See the 
2930: 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64 20 4f  OP_MakeKey and O
2940: 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63  P_MakeIdxKey opc
2950: 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61  ode.** documenta
2960: 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
2970: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
2980: 61 62 6f 75 74 20 74 68 65 20 50 33 20 73 74 72  about the P3 str
2990: 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ing..** See also
29a0: 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 49 64   the sqliteAddId
29b0: 78 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74 69  xKeyType() routi
29c0: 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ne..*/.void sqli
29d0: 74 65 41 64 64 4b 65 79 54 79 70 65 28 56 64 62  teAddKeyType(Vdb
29e0: 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a  e *v, ExprList *
29f0: 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e  pEList){.  int n
2a00: 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d  Column = pEList-
2a10: 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61 72 20 2a  >nExpr;.  char *
2a20: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d 61  zType = sqliteMa
2a30: 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b 31 20  lloc( nColumn+1 
2a40: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  );.  int i;.  if
2a50: 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65 74  ( zType==0 ) ret
2a60: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
2a70: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
2a80: 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20  .    zType[i] = 
2a90: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
2aa0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
2ab0: 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r)==SQLITE_SO_NU
2ac0: 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27 3b 0a 20  M ? 'n' : 't';. 
2ad0: 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20   }.  zType[i] = 
2ae0: 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43  0;.  sqliteVdbeC
2af0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
2b00: 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Type, nColumn);.
2b10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79    sqliteFree(zTy
2b20: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
2b30: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2b40: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
2b50: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2b60: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2b70: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2b80: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2b90: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2ba0: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2bb0: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2bc0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2bd0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2be0: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2bf0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2c00: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2c10: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2c20: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2c30: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2c40: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
2c50: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2c60: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2c80: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2c90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2cb0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2cc0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ce0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2cf0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2d00: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2d10: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2d20: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2d30: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2d40: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2d50: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2d60: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2d70: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2d80: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2d90: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2da0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2db0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2dc0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2dd0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2de0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2df0: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2e00: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2e10: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2e20: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2e30: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2e40: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2e50: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2e60: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2e70: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2e80: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2e90: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2ea0: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2eb0: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2ec0: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2ed0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2ee0: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2ef0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2f00: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2f10: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2f20: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
2f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2f40: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
2f50: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
2f60: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
2f70: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2f80: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2f90: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
2fa0: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
2fb0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
2fc0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
2fd0: 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
2fe0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
2ff0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64  tatement, then d
3000: 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a  o the check.  **
3010: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
3020: 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75  row should be ou
3030: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
3040: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
3050: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73      if( p->nOffs
3060: 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  et>0 ){.      in
3070: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
3080: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3090: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
30a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
30b0: 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73  emIncr, p->nOffs
30c0: 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20  et, addr+2);.   
30d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
30e0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
30f0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
3100: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e    }.    if( p->n
3110: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
3120: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3130: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
3140: 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 69 42 72 65   p->nLimit, iBre
3150: 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ak);.    }.  }..
3160: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
3170: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
3180: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c  .  */.  if( nCol
3190: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
31a0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
31b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
31c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
31d0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
31e0: 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  b, i);.    }.  }
31f0: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d  else{.    nColum
3200: 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  n = pEList->nExp
3210: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
3220: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
3230: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3240: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
3250: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
3260: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
3270: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
3280: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
3290: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
32a0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
32b0: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
32c0: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
32d0: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
32e0: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
32f0: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
3300: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
3310: 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69    */.  if( disti
3320: 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74  nct>=0 && pEList
3330: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
3340: 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f  r>0 ){.#if NULL_
3350: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a  ALWAYS_DISTINCT.
3360: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3370: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
3380: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
3390: 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  , sqliteVdbeCurr
33a0: 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a 23  entAddr(v)+7);.#
33b0: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
33c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
33d0: 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d  MakeKey, pEList-
33e0: 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20  >nExpr, 1);.    
33f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
3400: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
3410: 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70   sqliteAddKeyTyp
3420: 65 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  e(v, pEList);.  
3430: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3440: 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74  p(v, OP_Distinct
3450: 2c 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69  , distinct, sqli
3460: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
3470: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c  r(v)+3);.    sql
3480: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3490: 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e  OP_Pop, pEList->
34a0: 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20  nExpr+1, 0);.   
34b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
34c0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
34d0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
34e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
34f0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
3500: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
3510: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3520: 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69 6e  utStrKey, distin
3530: 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  ct, 0);.  }..  s
3540: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
3550: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
3560: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
3570: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
3580: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
3590: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
35a0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
35b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
35c0: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
35d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
35e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
35f0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3600: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3620: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3630: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
3640: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3650: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
3660: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
3670: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3680: 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  }..    /* Store 
3690: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
36a0: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
36b0: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
36c0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
36d0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
36e0: 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20  empTable: {.    
36f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3700: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
3710: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
3720: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3730: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
3740: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
3750: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
3760: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
3770: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
3790: 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20  ewRecno, iParm, 
37a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
37b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
37c0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
37d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
37e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
37f0: 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  IntKey, iParm, 0
3800: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3820: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
3830: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
3840: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
3850: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
3860: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
3870: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
3880: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
3890: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
38a0: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
38b0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
38c0: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
38d0: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
38e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
38f0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
3900: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3910: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3920: 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41   nColumn, NULL_A
3930: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b  LWAYS_DISTINCT);
3940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3950: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
3960: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64  Found, iParm, ad
3970: 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
3980: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3990: 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d  OP_Delete, iParm
39a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
39b0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
39c0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
39d0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
39e0: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
39f0: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
3a00: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
3a10: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
3a20: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
3a30: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
3a40: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
3a50: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
3a60: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
3a70: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
3a80: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
3a90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20  {.      int lbl 
3aa0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
3ab0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
3ac0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
3ad0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
3ae0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3af0: 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20 6c 62  P_IsNull, -1, lb
3b00: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  l);.      if( pO
3b10: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3b20: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3b30: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3b40: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3b50: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3b60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3b70: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3b80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3b90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3ba0: 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c  utStrKey, iParm,
3bb0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
3bc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
3bd0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
3be0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3bf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
3c00: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
3c10: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
3c20: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3c30: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
3c40: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
3c50: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
3c60: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
3c70: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
3c80: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
3c90: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
3ca0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3cb0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
3cc0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
3cd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3ce0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3cf0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
3d00: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
3d10: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
3d20: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3d30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3d40: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
3d50: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
3d60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3d70: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
3d80: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eak);.      }.  
3d90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3da0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
3db0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
3dc0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
3dd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3de0: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20   SRT_Callback:. 
3df0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74     case SRT_Sort
3e00: 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  er: {.      if( 
3e10: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
3e20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3e30: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
3e40: 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  keRec, nColumn, 
3e50: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  0);.        push
3e60: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
3e70: 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, v, pOrderBy);
3e80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3e90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
3ea0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
3eb0: 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  k );.        sql
3ec0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3ed0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
3ee0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
3ef0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3f00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
3f10: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
3f20: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
3f30: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
3f40: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
3f50: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
3f60: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
3f70: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
3f80: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
3f90: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
3fa0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
3fb0: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
3fc0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
3fd0: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
3fe0: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
3ff0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
4000: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
4010: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4020: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4030: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4050: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4060: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
4070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4080: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4090: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
40a0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
40b0: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
40c0: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
40d0: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
40e0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
40f0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
4100: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
4110: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
4120: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
4130: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
4140: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
4150: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
4160: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
4170: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
4180: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
4190: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
41a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
41b0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
41c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
41d0: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
41e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
41f0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
4200: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
4210: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
4220: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
4230: 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  mn,     /* Numbe
4240: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
4250: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44  data */.  int eD
4260: 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  est,       /* Wr
4270: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
4280: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
4290: 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20   int iParm      
42a0: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61    /* Optional pa
42b0: 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74  rameter associat
42c0: 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f  ed with eDest */
42d0: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20  .){.  int end = 
42e0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
42f0: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
4300: 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  dr;.  if( eDest=
4310: 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65  =SRT_Sorter ) re
4320: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64  turn;.  sqliteVd
4330: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4340: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64  rt, 0, 0);.  add
4350: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
4360: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65  dOp(v, OP_SortNe
4370: 78 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69  xt, 0, end);.  i
4380: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  f( p->nOffset>0 
4390: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
43a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
43b0: 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74  Incr, p->nOffset
43c0: 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73  , addr+4);.    s
43d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
43e0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
43f0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4400: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4410: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20   0, addr);.  }. 
4420: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d   if( p->nLimit>=
4430: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
4440: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4450: 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4c 69 6d 69  emIncr, p->nLimi
4460: 74 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  t, end);.  }.  s
4470: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
4480: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4490: 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73  lback: {.      s
44a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
44b0: 2c 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63  , OP_SortCallbac
44c0: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
44d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
44f0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
4500: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b  SRT_TempTable: {
4510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4520: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
4530: 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29  Recno, iParm, 0)
4540: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4550: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4560: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
4570: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4580: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
4590: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
45a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
45b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
45c0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
45d0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
45e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
45f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
4600: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64  ll, -1, sqliteVd
4610: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4620: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4630: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4640: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4650: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4660: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
4670: 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  trKey, iParm, 0)
4680: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4690: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
46a0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
46b0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
46c0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
46d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
46e0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
46f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4700: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4710: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 29 3b  P_Goto, 0, end);
4720: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4730: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
4740: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
4750: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
4760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4770: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
4780: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4790: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
47a0: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
47b0: 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71 6c  l(v, end);.  sql
47c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
47d0: 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c  OP_SortReset, 0,
47e0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
47f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
4800: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
4810: 44 42 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6c  DBE how many col
4820: 75 6d 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61 72  umns there.** ar
4830: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
4840: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 66 6f 72  and the name for
4850: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20 54   each column.  T
4860: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  his information.
4870: 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ** is used to pr
4880: 6f 76 69 64 65 20 22 61 72 67 63 22 20 61 6e 64  ovide "argc" and
4890: 20 22 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75 65   "azCol[]" value
48a0: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
48b0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
48c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
48d0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
48e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
48f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4900: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
4910: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
4920: 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
4930: 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e  ding to first en
4940: 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20  try in pTabList 
4950: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
4960: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
4970: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
4980: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
4990: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
49a0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
49b0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
49c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
49d0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
49e0: 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
49f0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
4a00: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
4a10: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
4a20: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
4a30: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
4a40: 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   1;.  if( pParse
4a50: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
4a60: 4c 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73  LITE_ReportTypes
4a70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
4a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4a90: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c 69 73  lumnCount, pELis
4aa0: 74 2d 3e 6e 45 78 70 72 2a 32 2c 20 30 29 3b 0a  t->nExpr*2, 0);.
4ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
4ac0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4ad0: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
4ae0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
4af0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
4b00: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
4b10: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
4b20: 72 20 2a 70 3b 0a 20 20 20 20 63 68 61 72 20 2a  r *p;.    char *
4b30: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 69  zType = 0;.    i
4b40: 6e 74 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73  nt showFullNames
4b50: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
4b60: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
4b70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4b80: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
4b90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
4ba0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4bb0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
4bc0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
4bd0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
4be0: 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74  v, -1, zName, st
4bf0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
4c00: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4c10: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 45 4c 69    }.    p = pELi
4c20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
4c30: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
4c40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 68 6f  ontinue;.    sho
4c50: 77 46 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50  wFullNames = (pP
4c60: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
4c70: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
4c80: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 20 20 69  Names)!=0;.    i
4c90: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
4ca0: 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20  UMN && pTabList 
4cb0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
4cc0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
4cd0: 3e 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62  >a[p->iTable - b
4ce0: 61 73 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  ase].pTab;.     
4cf0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
4d00: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
4d10: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
4d20: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
4d30: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
4d40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
4d50: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
4d60: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
4d70: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
4d80: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
4d90: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
4da0: 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20  ROWID_";.       
4db0: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
4dc0: 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  R";.      }else{
4dd0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
4de0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
4df0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
4e00: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
4e10: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
4e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4e30: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20  ( p->token.z && 
4e40: 70 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 26 26  p->token.z[0] &&
4e50: 20 21 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20   !showFullNames 
4e60: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
4e70: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
4e80: 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d  AddOp(v,OP_Colum
4e90: 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20  nName, i, 0);.  
4ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4eb0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
4ec0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74  p->token.z, p->t
4ed0: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  oken.n);.       
4ee0: 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72   sqliteVdbeCompr
4ef0: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
4f00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
4f10: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
4f20: 63 3e 31 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e  c>1 || showFullN
4f30: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
4f40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
4f50: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
4f60: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
4f70: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
4f80: 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61  a[p->iTable - ba
4f90: 73 65 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  se].zAlias;.    
4fa0: 20 20 20 20 69 66 28 20 73 68 6f 77 46 75 6c 6c      if( showFull
4fb0: 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30  Names || zTab==0
4fc0: 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e   ) zTab = pTab->
4fd0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
4fe0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
4ff0: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
5000: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
5010: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5020: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
5030: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
5040: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5050: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
5060: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
5070: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  me));.        sq
5080: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
5090: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
50a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
50b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
50c0: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20  mnName, i, 0);. 
50d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
50e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
50f0: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zCol, 0);.     
5100: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
5110: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70   p->token.z && p
5120: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 26 26 20  ->token.z[0] && 
5130: 21 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29  !showFullNames )
5140: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
5150: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
5160: 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  Op(v,OP_ColumnNa
5170: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
5180: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5190: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 74 6f  eP3(v, -1, p->to
51a0: 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  ken.z, p->token.
51b0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
51c0: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
51d0: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
51e0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 74 6f 6b  }else if( p->tok
51f0: 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e  en.z && p->token
5200: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  .z[0] ){.      i
5210: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
5220: 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43  VdbeAddOp(v,OP_C
5230: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29  olumnName, i, 0)
5240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5250: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
5260: 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d  , p->token.z, p-
5270: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
5280: 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72   sqliteVdbeCompr
5290: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
52a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
52b0: 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33      char zName[3
52c0: 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0];.      assert
52d0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
52e0: 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  MN || pTabList==
52f0: 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  0 );.      sprin
5300: 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  tf(zName, "colum
5310: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
5320: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5330: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
5340: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
5350: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5360: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65  eP3(v, -1, zName
5370: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
5380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5390: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
53a0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 70 6f 72  s & SQLITE_Repor
53b0: 74 54 79 70 65 73 20 29 7b 0a 20 20 20 20 20 20  tTypes ){.      
53c0: 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 7b 0a  if( zType==0 ){.
53d0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
53e0: 74 65 45 78 70 72 54 79 70 65 28 70 29 3d 3d 53  teExprType(p)==S
53f0: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b  QLITE_SO_TEXT ){
5400: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
5410: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
5420: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5430: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 4e 55 4d      zType = "NUM
5440: 45 52 49 43 22 3b 0a 20 20 20 20 20 20 20 20 7d  ERIC";.        }
5450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5460: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5470: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5480: 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i + pEList->nEx
5490: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
54a0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
54b0: 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50  (v, -1, zType, P
54c0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
54d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  .  }.}../*.** Na
54e0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
54f0: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
5500: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
5510: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
5520: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
5530: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
5540: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
5550: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
5560: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
5570: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
5580: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
5590: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
55a0: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
55b0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
55c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
55d0: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
55e0: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
55f0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
5600: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
5610: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
5620: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
5630: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  z;.}../*.** Give
5640: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
5650: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
5660: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
5670: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
5680: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
5690: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
56a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
56b0: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
56c0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
56d0: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
56e0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
56f0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
5700: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ab;.  int i;.  E
5710: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
5720: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 66 69  .  static int fi
5730: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50  llInColumnList(P
5740: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
5750: 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  ..  if( fillInCo
5760: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
5770: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
5780: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5790: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61   pTab = sqliteMa
57a0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
57b0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
57c0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
57d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
57e0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
57f0: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
5800: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
5810: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
5820: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
5830: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
5840: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
5850: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
5860: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
5870: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
5880: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
5890: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
58a0: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ol );.  for(i=0;
58b0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
58c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
58d0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
58e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
58f0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
5900: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
5910: 74 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d  teStrDup(pEList-
5920: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
5930: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70    }else if( (p=p
5940: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
5950: 72 29 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70  r)->token.z && p
5960: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
5970: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
5980: 53 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43  String(&pTab->aC
5990: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e  ol[i].zName, p->
59a0: 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65  token.z, p->toke
59b0: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  n.n, 0);.    }el
59c0: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
59d0: 5f 44 4f 54 20 26 26 20 70 2d 3e 70 52 69 67 68  _DOT && p->pRigh
59e0: 74 20 26 26 20 70 2d 3e 70 52 69 67 68 74 2d 3e  t && p->pRight->
59f0: 74 6f 6b 65 6e 2e 7a 20 26 26 0a 20 20 20 20 20  token.z &&.     
5a00: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d        p->pRight-
5a10: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  >token.z[0] ){. 
5a20: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
5a30: 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f  tring(&pTab->aCo
5a40: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  l[i].zName, .   
5a50: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
5a60: 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 70  t->token.z, p->p
5a70: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  Right->token.n, 
5a80: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
5a90: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33       char zBuf[3
5aa0: 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  0];.      sprint
5ab0: 66 28 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25  f(zBuf, "column%
5ac0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
5ad0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
5ae0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
5af0: 75 70 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a  up(zBuf);.    }.
5b00: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65    }.  pTab->iPKe
5b10: 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  y = -1;.  return
5b20: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
5b30: 46 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  For the given SE
5b40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
5b50: 64 6f 20 74 68 72 65 65 20 74 68 69 6e 67 73 2e  do three things.
5b60: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46  .**.**    (1)  F
5b70: 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
5b80: 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
5b90: 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
5ba0: 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
5bb0: 20 20 20 20 20 64 65 66 69 6e 65 73 20 74 68 65       defines the
5bc0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
5bd0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63  hat should be sc
5be0: 61 6e 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  anned. .**.**   
5bf0: 20 28 32 29 20 20 41 64 64 20 74 65 72 6d 73 20   (2)  Add terms 
5c00: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
5c10: 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
5c20: 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
5c30: 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
5c40: 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
5c50: 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
5c60: 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
5c70: 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 53 63  **.**    (3)  Sc
5c80: 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
5c90: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
5ca0: 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
5cb0: 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
5cc0: 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
5cd0: 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
5ce0: 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
5cf0: 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
5d00: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
5d10: 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
5d20: 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
5d30: 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
5d40: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
5d50: 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
5d60: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
5d70: 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a   in TABLE..**.**
5d80: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
5d90: 63 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20  cess.  If there 
5da0: 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65  are problems, le
5db0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
5dc0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
5dd0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
5de0: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
5df0: 20 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   int fillInColum
5e00: 6e 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61  nList(Parse *pPa
5e10: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
5e20: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
5e30: 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rc;.  SrcList *p
5e40: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
5e50: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
5e60: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 69  able *pTab;..  i
5e70: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53  f( p==0 || p->pS
5e80: 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc==0 ) return 1
5e90: 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
5ea0: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
5eb0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
5ec0: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
5ed0: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  y table in the t
5ee0: 61 62 6c 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a  able list..  */.
5ef0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
5f00: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
5f10: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ){.    if( pTabL
5f20: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 29  ist->a[i].pTab )
5f30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
5f40: 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
5f50: 62 65 66 6f 72 65 21 20 20 4e 6f 20 6e 65 65 64  before!  No need
5f60: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a   to continue */.
5f70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
5f80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
5f90: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
5fa0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  me==0 ){.      /
5fb0: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
5fc0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5fd0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
5fe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
5ff0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
6000: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
6010: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
6020: 5b 69 5d 2e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  [i].zAlias==0 ){
6030: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 46  .        char zF
6040: 61 6b 65 4e 61 6d 65 5b 36 30 5d 3b 0a 20 20 20  akeName[60];.   
6050: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 46 61       sprintf(zFa
6060: 6b 65 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  keName, "sqlite_
6070: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 0a 20  subquery_%p_",. 
6080: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
6090: 29 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e  )pTabList->a[i].
60a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
60b0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
60c0: 67 28 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  g(&pTabList->a[i
60d0: 5d 2e 7a 41 6c 69 61 73 2c 20 7a 46 61 6b 65 4e  ].zAlias, zFakeN
60e0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ame, 0);.      }
60f0: 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d  .      pTabList-
6100: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[i].pTab = pTa
6110: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
6120: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
6130: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
6140: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
6150: 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  as,.            
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
6180: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6190: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
61a0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
61b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
61c0: 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
61d0: 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b  isTransient = 1;
61e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
61f0: 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
6200: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
6210: 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
6220: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
6230: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
6240: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
6250: 20 20 20 20 20 20 73 71 6c 69 74 65 46 69 6e 64        sqliteFind
6260: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
6270: 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
6280: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  .zName);.      i
6290: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
62a0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
62b0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
62c0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
62d0: 20 74 61 62 6c 65 3a 20 22 2c 20 0a 20 20 20 20   table: ", .    
62e0: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
62f0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b  >a[i].zName, 0);
6300: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
6310: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
6320: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6330: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61   }.      if( pTa
6340: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
6350: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6360: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
6370: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
6380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
6390: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
63a0: 7d 0a 20 20 20 20 20 20 20 20 70 54 61 62 4c 69  }.        pTabLi
63b0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
63c0: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44   = sqliteSelectD
63d0: 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  up(pTab->pSelect
63e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
63f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
6400: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
6410: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
6420: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
6430: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
6440: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
6450: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
6460: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
6470: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
6480: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
6490: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
64a0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
64b0: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
64c0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
64d0: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
64e0: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
64f0: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
6500: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
6510: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
6520: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
6530: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
6540: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
6550: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
6560: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
6570: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
6580: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
6590: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
65a0: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
65b0: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
65c0: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
65d0: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
65e0: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
65f0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
6600: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
6610: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
6620: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
6630: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
6640: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
6650: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
6660: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
6670: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
6680: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
6690: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
66a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
66b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
66c0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
66d0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
66e0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
66f0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
6700: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
6710: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
6720: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
6730: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
6740: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
6750: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
6760: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
6770: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
6780: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
6790: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
67a0: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
67b0: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
67c0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
67d0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
67e0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
67f0: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
6800: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
6810: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
6820: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6830: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
6840: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
6850: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
6860: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
6870: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
6880: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
6890: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
68a0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
68b0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
68c0: 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
68d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
68e0: 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
68f0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
6900: 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
6910: 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
6920: 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
6930: 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
6940: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
6950: 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
6960: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
6970: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
6980: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6990: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
69a0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
69b0: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
69c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
69d0: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
69e0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
69f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
6a00: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
6a10: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
6a20: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
6a30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
6a40: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
6a50: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
6a60: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
6a70: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
6a80: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
6a90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
6aa0: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
6ab0: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
6ac0: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
6ad0: 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  */.        Token
6ae0: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *pName;        
6af0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
6b00: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
6b10: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
6b20: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
6b30: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
6b40: 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d      pName = &pE-
6b50: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
6b60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6b70: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
6b80: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
6b90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6ba0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
6bb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
6bc0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
6bd0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
6be0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
6bf0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
6c00: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6c10: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
6c20: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
6c30: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
6c40: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
6c50: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
6c60: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
6c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
6c80: 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54 61  f( pName && (zTa
6c90: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
6ca0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
6cd0: 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d  Name->z, zTabNam
6ce0: 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20  e, pName->n)!=0 
6cf0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
6d00: 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61      zTabName[pNa
6d10: 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20  me->n]!=0) ){.  
6d20: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
6d40: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
6d50: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
6d60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
6d70: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
6d90: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
6da0: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
6db0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
6dc0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
6dd0: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
6de0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
6df0: 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   (pTabList->a[i-
6e00: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
6e10: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  columnIndex(pTab
6e40: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61  List->a[i-1].pTa
6e50: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6e70: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
6e80: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
6e90: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
6ea0: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
6eb0: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
6ec0: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
6ed0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
6ee0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
6ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6f00: 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 49 64   i>0 && sqliteId
6f10: 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c 69  ListIndex(pTabLi
6f20: 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e  st->a[i-1].pUsin
6f30: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f50: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
6f60: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
6f70: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
6f80: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
6f90: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
6fa0: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
6fb0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
6fc0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
6fd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ff0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
7000: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
7010: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
7020: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
7030: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
7040: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
7050: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b  token.z = zName;
7060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7070: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  ght->token.n = s
7080: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
7090: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
70a0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
70b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
70c0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 62 61 73 65 20  ght->token.base 
70d0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
70e0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
70f0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
7100: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
7110: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
7120: 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  eExpr(TK_ID, 0, 
7130: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
7140: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
7150: 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  iteExpr(TK_DOT, 
7160: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
7170: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7180: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7190: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
71a0: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
71b0: 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a  n.z = zTabName;.
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
71d0: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  eft->token.n = s
71e0: 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b  trlen(zTabName);
71f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7200: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Left->token.dyn 
7210: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7220: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
7230: 62 61 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  base = 1;.      
7240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
7250: 74 53 74 72 69 6e 67 28 28 63 68 61 72 2a 2a 29  tString((char**)
7260: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  &pExpr->token.z,
7270: 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c 20   zTabName, ".", 
7280: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
7290: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
72a0: 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e  token.n = strlen
72b0: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  (pExpr->token.z)
72c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
72d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 62 61 73  pExpr->token.bas
72e0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
72f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
7300: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20  n.dyn = 1;.     
7310: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7330: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
7340: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7350: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
7360: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
7370: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
7380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
73a0: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
73b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
73c0: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   pName ){.      
73d0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
73e0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
73f0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
7400: 68 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31 2c 20  h table: ", -1, 
7410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7420: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
7430: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 0);.         
7440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7450: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
7460: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
7470: 72 4d 73 67 2c 20 22 6e 6f 20 74 61 62 6c 65 73  rMsg, "no tables
7480: 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
7490: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
74a0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
74b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
74c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
74d0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
74e0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
74f0: 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
7500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7520: 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c  utine recursivel
7530: 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65  y unlinks the Se
7540: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54  lect.pSrc.a[].pT
7550: 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69  ab pointers.** i
7560: 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63  n a select struc
7570: 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73  ture.  It just s
7580: 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ets the pointers
7590: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a   to NULL.  This.
75a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ** routine is re
75b0: 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73  cursive in the s
75c0: 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65  ense that if the
75d0: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d   Select.pSrc.a[]
75e0: 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e  .pSelect.** poin
75f0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
7600: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7610: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
7620: 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e  ely on that poin
7630: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
7640: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7650: 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20  d on the Select 
7660: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
7670: 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57  efines a.** VIEW
7680: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64   in order to und
7690: 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74  o any bindings t
76a0: 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20  o tables.  This 
76b0: 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  is necessary.** 
76c0: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61  because those ta
76d0: 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52  bles might be DR
76e0: 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71  OPed by a subseq
76f0: 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  uent SQL command
7700: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7710: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
7720: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
7730: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
7740: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54  c = p->pSrc;.  T
7750: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
7760: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
7770: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
7780: 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
7790: 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
77a0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  pSrc->a[i].pTab)
77b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
77c0: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
77d0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
77e0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
77f0: 30 2c 20 70 54 61 62 29 3b 0a 23 69 66 20 30 0a  0, pTab);.#if 0.
7800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
7810: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 72 63 2d  lectDelete(pSrc-
7820: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
7830: 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
7840: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  i].pSelect = 0;.
7850: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
7860: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e       pSrc->a[i].
7870: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
7880: 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  if( pSrc->a[i].p
7890: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
78a0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e    sqliteSelectUn
78b0: 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e  bind(pSrc->a[i].
78c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
78d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
78e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
78f0: 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74  e associates ent
7900: 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52  ries in an ORDER
7910: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   BY expression l
7920: 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75  ist with.** colu
7930: 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e  mns in a result.
7940: 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52    For each ORDER
7950: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   BY expression, 
7960: 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a  the opcode of.**
7970: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
7980: 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ode is changed t
7990: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  o TK_COLUMN and 
79a0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  the iColumn valu
79b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d  e of.** the top-
79c0: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69  level node is fi
79d0: 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c  lled in with col
79e0: 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  umn number and t
79f0: 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c  he iTable.** val
7a00: 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  ue of the top-le
7a10: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
7a20: 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70  ed with iTable p
7a30: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
7a40: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69  If there are pri
7a50: 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65  or SELECT clause
7a60: 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63  s, they are proc
7a70: 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20  essed first.  A 
7a80: 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65  match.** in an e
7a90: 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61  arlier SELECT ta
7aa0: 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f  kes precedence o
7ab0: 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45  ver a later SELE
7ac0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e  CT..**.** Any en
7ad0: 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  try that does no
7ae0: 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67  t match is flagg
7af0: 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20  ed as an error. 
7b00: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
7b10: 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75  f errors is retu
7b20: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
7b30: 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79  int matchOrderby
7b40: 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  ToColumn(.  Pars
7b50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7b60: 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74      /* A place t
7b70: 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65  o leave error me
7b80: 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65  ssages */.  Sele
7b90: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
7ba0: 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20      /* Match to 
7bb0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f  result columns o
7bc0: 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  f this SELECT */
7bd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
7be0: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68  derBy,     /* Th
7bf0: 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65  e ORDER BY value
7c00: 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  s to match again
7c10: 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  st columns */.  
7c20: 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
7c30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
7c40: 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20  t this value in 
7c50: 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  iTable */.  int 
7c60: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20  mustComplete    
7c70: 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61      /* If TRUE a
7c80: 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73  ll ORDER BYs mus
7c90: 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  t match */.){.  
7ca0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20  int nErr = 0;.  
7cb0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72  int i, j;.  Expr
7cc0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
7cd0: 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20   if( pSelect==0 
7ce0: 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  || pOrderBy==0 )
7cf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7d00: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
7d10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7d20: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
7d30: 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d   i++){ pOrderBy-
7d40: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20  >a[i].done = 0; 
7d50: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c  }.  }.  if( fill
7d60: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
7d70: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  rse, pSelect) ){
7d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
7d90: 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74   }.  if( pSelect
7da0: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
7db0: 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79  if( matchOrderby
7dc0: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
7dd0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
7de0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  , pOrderBy, iTab
7df0: 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  le, 0) ){.      
7e00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
7e10: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
7e20: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
7e30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
7e40: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
7e50: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
7e60: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
7e70: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  ].pExpr;.    int
7e80: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
7e90: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
7ea0: 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  i].done ) contin
7eb0: 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
7ec0: 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
7ed0: 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
7ee0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
7ef0: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
7f00: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
7f10: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
7f20: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
7f30: 28 7a 42 75 66 2c 22 4f 52 44 45 52 20 42 59 20  (zBuf,"ORDER BY 
7f40: 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75  position %d shou
7f50: 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  ld be between 1 
7f60: 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  and %d",.       
7f70: 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74      iCol, pEList
7f80: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
7f90: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
7fa0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
7fb0: 73 67 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  sg, zBuf, 0);.  
7fc0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
7fd0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45  rr++;.        nE
7fe0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
7ff0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8000: 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d     iCol--;.    }
8010: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43  .    for(j=0; iC
8020: 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74  ol<0 && j<pEList
8030: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
8040: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
8050: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28  >a[j].zName && (
8060: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
8070: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49   pE->op==TK_STRI
8080: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  NG) ){.        c
8090: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61  har *zName, *zLa
80a0: 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  bel;.        zNa
80b0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  me = pEList->a[j
80c0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
80d0: 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b   assert( pE->tok
80e0: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20  en.z );.        
80f0: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53  zLabel = sqliteS
8100: 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e  trNDup(pE->token
8110: 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pE->token.n)
8120: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8130: 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b  Dequote(zLabel);
8140: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
8150: 69 74 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  iteStrICmp(zName
8160: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
8170: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
8180: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
8190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
81a0: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
81b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
81c0: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 45 78 70  l<0 && sqliteExp
81d0: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
81e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
81f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
8200: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
8210: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
8220: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d  >=0 ){.      pE-
8230: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
8240: 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75  .      pE->iColu
8250: 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
8260: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
8270: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64  able;.      pOrd
8280: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
8290: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
82a0: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73  f( iCol<0 && mus
82b0: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
82c0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
82d0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
82e0: 7a 42 75 66 2c 22 25 64 22 2c 69 2b 31 29 3b 0a  zBuf,"%d",i+1);.
82f0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
8300: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
8310: 45 72 72 4d 73 67 2c 20 22 4f 52 44 45 52 20 42  ErrMsg, "ORDER B
8320: 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 22 2c  Y term number ",
8330: 20 7a 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20   zBuf, .        
8340: 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  " does not match
8350: 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
8360: 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  mn", 0);.      p
8370: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
8380: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
8390: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
83a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
83b0: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  r;  .}../*.** Ge
83c0: 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
83d0: 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
83e0: 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
83f0: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
8400: 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
8410: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
8420: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
8430: 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
8440: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
8450: 20 2a 73 71 6c 69 74 65 47 65 74 56 64 62 65 28   *sqliteGetVdbe(
8460: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
8470: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
8480: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
8490: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
84a0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
84b0: 20 73 71 6c 69 74 65 56 64 62 65 43 72 65 61 74   sqliteVdbeCreat
84c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
84d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
84e0: 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  .    ../*.** Thi
84f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8500: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
8510: 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72   query that is r
8520: 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a  eally the union.
8530: 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ** or intersecti
8540: 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  on of two or mor
8550: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
8560: 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  es..**.** "p" po
8570: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
8580: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
8590: 6f 20 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  o queries.  The 
85a0: 72 65 73 75 6c 74 73 20 73 68 6f 75 6c 64 0a 2a  results should.*
85b0: 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 65  * be stored in e
85c0: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
85d0: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2f 0a 73 74  ter iParm..*/.st
85e0: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
85f0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
8600: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
8610: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
8620: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
8630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8640: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
8650: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
8660: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
8670: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
8680: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
8690: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
86a0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
86b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
86c0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
86d0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
86e0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
86f0: 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 76 61 6c   /* Baseline val
8700: 75 65 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 6e  ue for pParse->n
8710: 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  Tab */..  /* Mak
8720: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
8730: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
8740: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
8750: 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a  CTs.  Only the .
8760: 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54    ** last SELECT
8770: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
8780: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
8790: 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   BY..  */.  if( 
87a0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f  p==0 || p->pPrio
87b0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  r==0 ) return 1;
87c0: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
87d0: 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72  Prior;.  if( pPr
87e0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
87f0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8800: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8810: 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42 59 20  rrMsg,"ORDER BY 
8820: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
8830: 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20 20 20  me after ",.    
8840: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
8850: 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65 66  ->op), " not bef
8860: 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ore", 0);.    pP
8870: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8880: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
8890: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
88a0: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
88b0: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
88c0: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
88d0: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
88e0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
88f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
8900: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
8910: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
8920: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
8930: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
8940: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
8950: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
8960: 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
8970: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8980: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
8990: 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
89a0: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61    eDest = SRT_Ta
89b0: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
89c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
89d0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
89e0: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
89f0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 62 61  ments..  */.  ba
8a00: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  se = pParse->nTa
8a10: 62 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  b;.  switch( p->
8a20: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
8a30: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
8a40: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
8a50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
8a60: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
8a70: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65  Parse, pPrior, e
8a80: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
8a90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
8aa0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8ab0: 63 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  c;.        p->pP
8ac0: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
8ad0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
8ae0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ect(pParse, p, e
8af0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  Dest, iParm, 0, 
8b00: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 0);.        p
8b10: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8b20: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  r;.        if( r
8b30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
8b40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
8b60: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
8b70: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
8b80: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
8b90: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
8ba0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
8bb0: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
8bc0: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
8bd0: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
8be0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
8bf0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
8c00: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
8c10: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
8c20: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
8c30: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
8c40: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
8c50: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
8c60: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
8c70: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
8c80: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
8c90: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
8ca0: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
8cb0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
8cc0: 72 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20  rderBy;  /* The 
8cd0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8ce0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 53 45  for the right SE
8cf0: 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70  LECT */..      p
8d00: 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d  riorOp = p->op==
8d10: 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62  TK_ALL ? SRT_Tab
8d20: 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  le : SRT_Union;.
8d30: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
8d40: 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70  =priorOp && p->p
8d50: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
8d60: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
8d70: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
8d80: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
8d90: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
8da0: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
8db0: 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
8dc0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
8dd0: 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20  ab = iParm;.    
8de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8df0: 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
8e00: 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
8e10: 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
8e20: 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
8e30: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
8e40: 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
8e50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8e60: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
8e70: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
8e80: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
8e90: 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26  derBy .        &
8ea0: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
8eb0: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
8ec0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75  , p->pOrderBy, u
8ed0: 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20  nionTab, 1) ){. 
8ee0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
8ef0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
8f00: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d       if( p->op!=
8f10: 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20  TK_ALL ){.      
8f20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8f30: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
8f40: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  mp, unionTab, 1)
8f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
8f60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8f70: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69  P_KeyAsData, uni
8f80: 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20  onTab, 1);.     
8f90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8fa0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8fb0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
8fc0: 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  mp, unionTab, 0)
8fd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8fe0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
8ff0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
9000: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
9010: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
9020: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
9030: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
9040: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
9050: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
9060: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
9070: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
9080: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
9090: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
90a0: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
90b0: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
90c0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
90d0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
90e0: 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65  :  op = SRT_Exce
90f0: 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  pt;   break;.   
9100: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e        case TK_UN
9110: 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f  ION:   op = SRT_
9120: 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b  Union;    break;
9130: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
9140: 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20  K_ALL:     op = 
9150: 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72  SRT_Table;    br
9160: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9170: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
9180: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
9190: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
91a0: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
91b0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  y = 0;.      rc 
91c0: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
91d0: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
91e0: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29  ionTab, 0, 0, 0)
91f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
9200: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
9210: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
9220: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
9230: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9240: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  rc;..      /* Co
9250: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
9260: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
9270: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
9280: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
9290: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
92a0: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
92b0: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
92c0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d       if( eDest!=
92d0: 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
92e0: 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20  Tab!=iParm ){.  
92f0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
9300: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
9310: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9320: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
9330: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
9340: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
9350: 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
9360: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
9370: 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20  Parse, p->base, 
9380: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
9390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
93a0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
93b0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
93c0: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
93d0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
93e0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
93f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9400: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
9410: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
9420: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
9430: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  t = sqliteVdbeCu
9440: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
9450: 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
9460: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
9470: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
9480: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
9490: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
94c0: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
94d0: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
9500: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
9510: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31  f( rc ) return 1
9520: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9530: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
9540: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
9550: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9560: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
9570: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
9580: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9590: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
95a0: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
95b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
95c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
95d0: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
95e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
95f0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
9600: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
9610: 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e  rtTail(p, v, p->
9620: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
9630: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
9640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9660: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
9670: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
9680: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
9690: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
96a0: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
96b0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  t;..      /* INT
96c0: 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
96d0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
96e0: 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
96f0: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
9700: 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
9710: 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
9720: 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
9730: 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
9740: 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
9750: 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
9760: 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
9770: 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
9780: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9790: 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
97a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
97b0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
97c0: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
97d0: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
97e0: 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61  p,p->pOrderBy,ta
97f0: 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b1,1) ){.       
9800: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9810: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
9820: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
9830: 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 31  penTemp, tab1, 1
9840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
9860: 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20  eyAsData, tab1, 
9870: 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  1);..      /* Co
9880: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
9890: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
98a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
98b0: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
98c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
98d0: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
98e0: 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69   pPrior, SRT_Uni
98f0: 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20  on, tab1, 0, 0, 
9900: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
9910: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
9920: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
9930: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
9940: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
9950: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
9960: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
9970: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9980: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c  _OpenTemp, tab2,
9990: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
99a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
99b0: 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32  _KeyAsData, tab2
99c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 1);.      p->p
99d0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
99e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
99f0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52  ct(pParse, p, SR
9a00: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30  T_Union, tab2, 0
9a10: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
9a20: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
9a30: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  r;.      if( rc 
9a40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
9a50: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
9a60: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
9a70: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
9a80: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
9a90: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
9aa0: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
9ab0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
9ac0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
9ad0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
9ae0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
9af0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
9b00: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ames(pParse, p->
9b10: 62 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69  base, 0, p->pELi
9b20: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
9b30: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
9b40: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
9b50: 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
9b60: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
9b70: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
9b80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9b90: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
9ba0: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
9bb0: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
9bc0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9bd0: 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c  P_FullKey, tab1,
9be0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
9bf0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9c00: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
9c10: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
9c20: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
9c30: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
9c40: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
9c50: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
9c60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9c80: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
9c90: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
9cc0: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
9cd0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9ce0: 6e 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n 1;.      sqlit
9cf0: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
9d00: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
9d10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9d20: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  Op(v, OP_Next, t
9d30: 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
9d40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
9d50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
9d60: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
9d70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9d80: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
9d90: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9da0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9db0: 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
9dc0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
9dd0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
9de0: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
9df0: 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69  il(p, v, p->pELi
9e00: 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
9e10: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
9e20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9e30: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
9e40: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
9e50: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
9e60: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
9e70: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
9e80: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
9e90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
9ea0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
9eb0: 7a 45 72 72 4d 73 67 2c 20 22 53 45 4c 45 43 54  zErrMsg, "SELECT
9ec0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
9ed0: 64 20 72 69 67 68 74 20 6f 66 20 22 2c 0a 20 20  d right of ",.  
9ee0: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
9ef0: 28 70 2d 3e 6f 70 29 2c 20 22 20 64 6f 20 6e 6f  (p->op), " do no
9f00: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
9f10: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
9f20: 20 63 6f 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a 20   columns", 0);. 
9f30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9f40: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  +;.    return 1;
9f50: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
9f60: 54 61 62 20 3d 20 62 61 73 65 3b 0a 20 20 72 65  Tab = base;.  re
9f70: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9f80: 20 52 65 63 75 72 73 69 76 65 6c 79 20 73 63 61   Recursively sca
9f90: 6e 20 74 68 72 6f 75 67 68 20 61 6e 20 65 78 70  n through an exp
9fa0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 46  ression tree.  F
9fb0: 6f 72 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  or every referen
9fc0: 63 65 0a 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d  ce.** to a colum
9fd0: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
9fe0: 72 20 69 46 72 6f 6d 2c 20 63 68 61 6e 67 65 20  r iFrom, change 
9ff0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
a000: 6f 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 63 6f  o the.** same co
a010: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
a020: 6d 62 65 72 20 69 54 6f 2e 0a 2a 2f 0a 73 74 61  mber iTo..*/.sta
a030: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54  tic void changeT
a040: 61 62 6c 65 73 28 45 78 70 72 20 2a 70 45 78 70  ables(Expr *pExp
a050: 72 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  r, int iFrom, in
a060: 74 20 69 54 6f 29 7b 0a 20 20 69 66 28 20 70 45  t iTo){.  if( pE
a070: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
a080: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
a090: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
a0a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 46  Expr->iTable==iF
a0b0: 72 6f 6d 20 29 7b 0a 20 20 20 20 70 45 78 70 72  rom ){.    pExpr
a0c0: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 6f 3b 0a  ->iTable = iTo;.
a0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
a0e0: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54  tic void changeT
a0f0: 61 62 6c 65 73 49 6e 4c 69 73 74 28 45 78 70 72  ablesInList(Expr
a100: 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 69 6e 74 29  List*, int, int)
a110: 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c  ;.    changeTabl
a120: 65 73 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  es(pExpr->pLeft,
a130: 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20   iFrom, iTo);.  
a140: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
a150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 46  Expr->pRight, iF
a160: 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63  rom, iTo);.    c
a170: 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73  hangeTablesInLis
a180: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
a190: 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 7d  iFrom, iTo);.  }
a1a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
a1b0: 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73  hangeTablesInLis
a1c0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
a1d0: 74 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  t, int iFrom, in
a1e0: 74 20 69 54 6f 29 7b 0a 20 20 69 66 28 20 70 4c  t iTo){.  if( pL
a1f0: 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ist ){.    int i
a200: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a210: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
a220: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67  ++){.      chang
a230: 65 54 61 62 6c 65 73 28 70 4c 69 73 74 2d 3e 61  eTables(pList->a
a240: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 46 72 6f 6d  [i].pExpr, iFrom
a250: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
a260: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  }.}../*.** Scan 
a270: 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
a280: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
a290: 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
a2a0: 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
a2b0: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
a2c0: 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
a2d0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
a2e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
a2f0: 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
a300: 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
a310: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
a320: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
a330: 20 75 6e 63 68 61 6e 67 65 64 2e 29 20 20 57 68   unchanged.)  Wh
a340: 65 6e 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  en making a copy
a350: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
a360: 6e 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 68 61  n in pEList, cha
a370: 6e 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  nge.** reference
a380: 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
a390: 74 61 62 6c 65 20 69 53 75 62 20 69 6e 74 6f 20  table iSub into 
a3a0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
a3b0: 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a  ble iTable..**.*
a3c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a3d0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
a3e0: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
a3f0: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
a400: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
a410: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
a420: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
a430: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
a440: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
a450: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
a460: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
a470: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
a480: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
a490: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
a4a0: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
a4b0: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
a4c0: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
a4d0: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
a4e0: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
a4f0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
a500: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
a510: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
a520: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
a530: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
a540: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
a550: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
a560: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
a570: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
a580: 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20 69 53   *pEList, int iS
a590: 75 62 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  ub){.  if( pExpr
a5a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a5b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
a5c0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
a5d0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
a5e0: 65 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  e && pExpr->iCol
a5f0: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78  umn>=0 ){.    Ex
a600: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 61 73  pr *pNew;.    as
a610: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
a620: 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
a630: 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
a640: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a650: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
a660: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
a670: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
a680: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65  st==0 );.    pNe
a690: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
a6a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
a6b0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
a6c0: 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
a6d0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77  pExpr->op = pNew
a6e0: 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d  ->op;.    pExpr-
a6f0: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45  >pLeft = sqliteE
a700: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65  xprDup(pNew->pLe
a710: 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ft);.    pExpr->
a720: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
a730: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
a740: 67 68 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ght);.    pExpr-
a750: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45  >pList = sqliteE
a760: 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d  xprListDup(pNew-
a770: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  >pList);.    pEx
a780: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
a790: 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70  w->iTable;.    p
a7a0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
a7b0: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
a7c0: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
a7d0: 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
a7e0: 20 70 45 78 70 72 2d 3e 6e 46 75 6e 63 4e 61 6d   pExpr->nFuncNam
a7f0: 65 20 3d 20 70 4e 65 77 2d 3e 6e 46 75 6e 63 4e  e = pNew->nFuncN
a800: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 54  ame;.    sqliteT
a810: 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d  okenCopy(&pExpr-
a820: 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74  >token, &pNew->t
a830: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 69  oken);.    if( i
a840: 53 75 62 21 3d 69 54 61 62 6c 65 20 29 7b 0a 20  Sub!=iTable ){. 
a850: 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65       changeTable
a860: 73 28 70 45 78 70 72 2c 20 69 53 75 62 2c 20 69  s(pExpr, iSub, i
a870: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
a880: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
a890: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
a8a0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69  List(ExprList*,i
a8b0: 6e 74 2c 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  nt,ExprList*,int
a8c0: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
a8d0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
a8e0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69  Table, pEList, i
a8f0: 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45  Sub);.    substE
a900: 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68  xpr(pExpr->pRigh
a910: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
a920: 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75  t, iSub);.    su
a930: 62 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70  bstExprList(pExp
a940: 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  r->pList, iTable
a950: 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  , pEList, iSub);
a960: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
a970: 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69 73  id .substExprLis
a980: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
a990: 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
a9a0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
a9b0: 20 69 6e 74 20 69 53 75 62 29 7b 0a 20 20 69 6e   int iSub){.  in
a9c0: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
a9d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a9e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
a9f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
aa00: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c 69     substExpr(pLi
aa10: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
aa20: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20  iTable, pEList, 
aa30: 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iSub);.  }.}../*
aa40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
aa50: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
aa60: 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
aa70: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65  in order to spee
aa80: 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20  d.** execution. 
aa90: 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
aaa0: 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
aab0: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
aac0: 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75  attening.** occu
aad0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
aae0: 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
aaf0: 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
ab00: 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
ab10: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
ab20: 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
ab30: 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
ab40: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
ab50: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
ab60: 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
ab70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
ab80: 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
ab90: 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
aba0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
abb0: 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
abc0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
abd0: 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
abe0: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
abf0: 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
ac00: 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
ac10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ac20: 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
ac30: 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
ac40: 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
ac50: 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
ac60: 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
ac70: 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
ac80: 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
ac90: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
aca0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
acb0: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
acc0: 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
acd0: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
ace0: 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
acf0: 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
ad00: 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
ad10: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
ad20: 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
ad30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
ad40: 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
ad50: 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
ad60: 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
ad70: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
ad80: 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
ad90: 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
ada0: 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
adb0: 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
adc0: 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
add0: 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
ade0: 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
adf0: 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
ae00: 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
ae10: 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
ae20: 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
ae30: 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
ae40: 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
ae50: 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
ae60: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
ae70: 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
ae80: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
ae90: 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
aea0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
aeb0: 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
aec0: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
aed0: 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
aee0: 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
aef0: 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
af00: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
af10: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
af20: 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
af30: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
af40: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  n..**.**   (4)  
af50: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
af60: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
af70: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
af80: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
af90: 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
afa0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
afb0: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
afc0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
afd0: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
afe0: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
aff0: 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
b000: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
b010: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
b020: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
b030: 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
b040: 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
b050: 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
b060: 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
b070: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
b080: 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
b090: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
b0a0: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
b0b0: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
b0c0: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
b0d0: 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
b0e0: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
b0f0: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
b100: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
b110: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
b120: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
b130: 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
b140: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
b150: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
b160: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
b170: 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
b180: 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
b190: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
b1a0: 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
b1b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
b1c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
b1d0: 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
b1e0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
b1f0: 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
b200: 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
b210: 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
b220: 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
b230: 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
b240: 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
b250: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
b260: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
b270: 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
b280: 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
b290: 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
b2a0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
b2b0: 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 20  nd return 0..** 
b2c0: 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
b2d0: 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
b2e0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
b2f0: 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
b300: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
b310: 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
b320: 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
b330: 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
b340: 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
b350: 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
b360: 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ne runs..*/.int 
b370: 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
b380: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
b390: 46 72 6f 6d 2c 20 69 6e 74 20 69 73 41 67 67 2c  From, int isAgg,
b3a0: 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
b3b0: 67 67 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  gg){.  Select *p
b3c0: 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
b3d0: 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
b3e0: 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
b3f0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
b400: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
b410: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
b420: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
b430: 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
b440: 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
b450: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
b460: 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
b470: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
b480: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
b490: 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
b4a0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  uery */.  int i;
b4b0: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 2c 20  .  int iParent, 
b4c0: 69 53 75 62 3b 0a 20 20 45 78 70 72 20 2a 70 57  iSub;.  Expr *pW
b4d0: 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  here;..  /* Chec
b4e0: 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
b4f0: 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
b500: 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
b510: 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  f not..  */.  if
b520: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b530: 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
b540: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
b550: 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
b560: 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
b570: 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20  Src );.  pSub = 
b580: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
b590: 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
b5a0: 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
b5b0: 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
b5c0: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
b5d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71  rn 0;.  if( subq
b5e0: 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
b5f0: 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
b600: 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20  rn 0;.  pSubSrc 
b610: 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
b620: 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
b630: 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  );.  if( pSubSrc
b640: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
b650: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75  rn 0;.  if( (pSu
b660: 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  b->isDistinct ||
b670: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   pSub->nLimit>=0
b680: 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72  ) &&  (pSrc->nSr
b690: 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
b6a0: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
b6b0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73    }.  if( (p->is
b6c0: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e  Distinct || p->n
b6d0: 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62  Limit>=0) && sub
b6e0: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
b6f0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
b700: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
b710: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
b720: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
b730: 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
b740: 2a 2a 20 69 2d 74 68 20 65 6e 74 72 79 20 6f 66  ** i-th entry of
b750: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b760: 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
b770: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72  ery..  */.  iPar
b780: 65 6e 74 20 3d 20 70 2d 3e 62 61 73 65 20 2b 20  ent = p->base + 
b790: 69 46 72 6f 6d 3b 0a 20 20 69 53 75 62 20 3d 20  iFrom;.  iSub = 
b7a0: 70 53 75 62 2d 3e 62 61 73 65 3b 0a 20 20 73 75  pSub->base;.  su
b7b0: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
b7c0: 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
b7d0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
b7e0: 75 62 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  ub);.  pList = p
b7f0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
b800: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
b810: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
b820: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
b830: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
b840: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
b850: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
b860: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b870: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d  pExpr->token.z!=
b880: 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 );.      pList
b890: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
b8a0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
b8b0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
b8c0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
b8d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
b8e0: 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74  Agg ){.    subst
b8f0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
b900: 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
b910: 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75  Sub->pEList, iSu
b920: 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  b);.    substExp
b930: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
b940: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
b950: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a  ist, iSub);.  }.
b960: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
b970: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
b980: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
b990: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 69 66 28  st, iSub);.  if(
b9a0: 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
b9b0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
b9c0: 6c 69 74 65 45 78 70 72 44 75 70 28 70 53 75 62  liteExprDup(pSub
b9d0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
b9e0: 66 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62  f( iParent!=iSub
b9f0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65   ){.      change
ba00: 54 61 62 6c 65 73 28 70 57 68 65 72 65 2c 20 69  Tables(pWhere, i
ba10: 53 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20  Sub, iParent);. 
ba20: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ba30: 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
ba40: 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
ba50: 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
ba60: 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
ba70: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
ba80: 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
ba90: 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
baa0: 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
bab0: 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
bac0: 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
bad0: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
bae0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
baf0: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
bb00: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
bb10: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
bb20: 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  Sub->pHaving);. 
bb30: 20 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74       if( iParent
bb40: 21 3d 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20  !=iSub ){.      
bb50: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
bb60: 48 61 76 69 6e 67 2c 20 69 53 75 62 2c 20 69 50  Having, iSub, iP
bb70: 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arent);.      }.
bb80: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
bb90: 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
bba0: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  p->pHaving = sql
bbb0: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
bbc0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76  p->pHaving, pHav
bbd0: 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ing, 0);.      }
bbe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
bbf0: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
bc00: 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ng;.      }.    
bc10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
bc20: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
bc30: 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
bc40: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
bc50: 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
bc60: 42 79 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  By);.    if( iPa
bc70: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
bc80: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
bc90: 49 6e 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  InList(p->pGroup
bca0: 42 79 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e  By, iSub, iParen
bcb0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
bcc0: 65 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d  e if( p->pWhere=
bcd0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68  =0 ){.    p->pWh
bce0: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
bcf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
bd00: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
bd10: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
bd20: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
bd30: 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a    if( pWhere ){.
bd40: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
bd50: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
bd60: 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  AND, p->pWhere, 
bd70: 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
bd80: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 44 69 73  }.  }.  p->isDis
bd90: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
bda0: 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
bdb0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 69 66 28  sDistinct;.  if(
bdc0: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   pSub->nLimit>=0
bdd0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
bde0: 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
bdf0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75   p->nLimit = pSu
be00: 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  b->nLimit;.    }
be10: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d  else if( p->nLim
be20: 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20  it+p->nOffset > 
be30: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75  pSub->nLimit+pSu
be40: 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20  b->nOffset ){.  
be50: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
be60: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70  pSub->nLimit + p
be70: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70  Sub->nOffset - p
be80: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d  ->nOffset;.    }
be90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65  .  }.  p->nOffse
bea0: 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73  t += pSub->nOffs
beb0: 65 74 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  et;.  if( pSrc->
bec0: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26  a[iFrom].pTab &&
bed0: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
bee0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
bef0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 44  t ){.    sqliteD
bf00: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
bf10: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
bf20: 62 29 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e  b);.  }.  pSrc->
bf30: 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20 3d 20  a[iFrom].pTab = 
bf40: 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  pSubSrc->a[0].pT
bf50: 61 62 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e 61  ab;.  pSubSrc->a
bf60: 5b 30 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20  [0].pTab = 0;.  
bf70: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
bf80: 53 65 6c 65 63 74 20 3d 20 70 53 75 62 53 72 63  Select = pSubSrc
bf90: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
bfa0: 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e    pSubSrc->a[0].
bfb0: 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
bfc0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
bfd0: 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
bfe0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
bff0: 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
c000: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
c010: 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d  d in as an argum
c020: 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
c030: 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20  .** is a simple 
c040: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
c050: 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20  uery.  If it is 
c060: 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63  and this query c
c070: 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69  an be.** satisfi
c080: 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ed using a singl
c090: 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65  e seek to the be
c0a0: 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f  ginning or end o
c0b0: 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  f an index,.** t
c0c0: 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65  hen generate the
c0d0: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53   code for this S
c0e0: 45 4c 45 43 54 20 72 65 74 75 72 6e 20 31 2e 20  ELECT return 1. 
c0f0: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
c100: 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
c110: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
c120: 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
c130: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
c140: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
c150: 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
c160: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
c170: 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
c180: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
c190: 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
c1a0: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
c1b0: 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
c1c0: 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
c1d0: 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
c1e0: 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
c1f0: 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
c200: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
c210: 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
c220: 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
c230: 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
c240: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
c250: 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
c260: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
c270: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
c280: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
c290: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
c2a0: 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
c2b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
c2c0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
c2d0: 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
c2e0: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
c2f0: 69 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  iteSelect()..** 
c300: 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
c310: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
c320: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
c330: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
c340: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
c350: 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
c360: 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
c370: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
c380: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
c390: 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
c3a0: 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
c3b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
c3c0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
c3d0: 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
c3e0: 2a 76 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 4f 70  *v;.  int openOp
c3f0: 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
c400: 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
c410: 70 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20 20  prList eList;.  
c420: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c430: 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a  item eListItem;.
c440: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
c450: 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ee if this query
c460: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e   is a simple min
c470: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
c480: 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20  y.  Return.  ** 
c490: 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e  zero if it is  n
c4a0: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
c4b0: 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d  ->pGroupBy || p-
c4c0: 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70  >pHaving || p->p
c4d0: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
c4e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d  ;.  if( p->pSrc-
c4f0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
c500: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  n 0;.  if( p->pE
c510: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
c520: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78   return 0;.  pEx
c530: 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
c540: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
c550: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
c560: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
c570: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
c580: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c  Expr->pList==0 |
c590: 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  | pExpr->pList->
c5a0: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
c5b0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
c5c0: 2d 3e 6e 46 75 6e 63 4e 61 6d 65 21 3d 33 20 29  ->nFuncName!=3 )
c5d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
c5e0: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
c5f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
c600: 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
c610: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
c620: 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
c630: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
c640: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
c650: 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
c660: 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
c670: 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
c680: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c690: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
c6a0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
c6b0: 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
c6c0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
c6d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f   return 0;.  iCo
c6e0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
c6f0: 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e  mn;.  pTab = p->
c700: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
c710: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
c720: 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
c730: 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
c740: 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
c750: 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
c760: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
c770: 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
c780: 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
c790: 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
c7a0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
c7b0: 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
c7c0: 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
c7d0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
c7e0: 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
c7f0: 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
c800: 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
c810: 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
c820: 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
c830: 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
c840: 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
c850: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c860: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
c870: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
c880: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c890: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c8a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
c8b0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
c8c0: 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
c8d0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
c8e0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20  lumn[0]==iCol ) 
c8f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c900: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
c910: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
c920: 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
c930: 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
c940: 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
c950: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
c960: 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
c970: 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
c980: 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
c990: 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
c9a0: 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20  ory cell..  */. 
c9b0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
c9c0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
c9d0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
c9e0: 30 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  0;.  if( eDest==
c9f0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
ca00: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
ca10: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
ca20: 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72 63  p->base, p->pSrc
ca30: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
ca40: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
ca50: 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
ca60: 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
ca70: 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
ca80: 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
ca90: 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
caa0: 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
cab0: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
cac0: 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
cad0: 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
cae0: 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
caf0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
cb00: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
cb10: 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
cb20: 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
cb30: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
cb40: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
cb50: 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65  pParse->schemaVe
cb60: 72 69 66 69 65 64 20 26 26 20 28 70 50 61 72 73  rified && (pPars
cb70: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
cb80: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
cb90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
cba0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
cbb0: 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61  erifyCookie, pPa
cbc0: 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f  rse->db->schema_
cbd0: 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  cookie, 0);.    
cbe0: 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65  pParse->schemaVe
cbf0: 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  rified = 1;.  }.
cc00: 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d    openOp = pTab-
cc10: 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65  >isTemp ? OP_Ope
cc20: 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a  nAux : OP_Open;.
cc30: 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65    base = p->base
cc40: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
cc50: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62  dOp(v, openOp, b
cc60: 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  ase, pTab->tnum)
cc70: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
cc80: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
cc90: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
cca0: 41 54 49 43 29 3b 0a 20 20 69 66 28 20 70 49 64  ATIC);.  if( pId
ccb0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
ccc0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  teVdbeAddOp(v, s
ccd0: 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b  eekOp, base, 0);
cce0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
ccf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
cd00: 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2b 31 2c   openOp, base+1,
cd10: 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pIdx->tnum);.  
cd20: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
cd30: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78  geP3(v, -1, pIdx
cd40: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
cd50: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
cd60: 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
cd70: 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  Op, base+1, 0);.
cd80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cd90: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63  dOp(v, OP_IdxRec
cda0: 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  no, base+1, 0);.
cdb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cdc0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
cdd0: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
cde0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
cdf0: 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62  (v, OP_MoveTo, b
ce00: 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
ce10: 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
ce20: 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
ce30: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
ce40: 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
ce50: 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
ce60: 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
ce70: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
ce80: 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56    cont = sqliteV
ce90: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
cea0: 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
ceb0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65  op(pParse, p, &e
cec0: 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
ced0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
cee0: 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b 0a 20 20   cont, cont);.  
cef0: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
cf00: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
cf10: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
cf20: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
cf30: 62 61 73 65 2c 20 30 29 3b 0a 20 20 72 65 74 75  base, 0);.  retu
cf40: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 1;.}../*.** G
cf50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
cf60: 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43   the given SELEC
cf70: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
cf80: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
cf90: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
cfa0: 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
cfb0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
cfc0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73  ** value of eDes
cfd0: 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a  t and iParm..**.
cfe0: 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61 6c  **     eDest Val
cff0: 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a  ue       Result.
d000: 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
d010: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
d020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61  --.**     SRT_Ca
d050: 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65  llback    Invoke
d060: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f   the callback fo
d070: 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68  r each row of th
d080: 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
d090: 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
d0a0: 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20      Store first 
d0b0: 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79  result in memory
d0c0: 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a   cell iParm.**.*
d0d0: 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
d0e0: 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
d0f0: 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 61  lts as keys of a
d100: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
d110: 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  or iParm.**.**  
d120: 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
d130: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
d140: 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
d150: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
d160: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
d170: 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
d180: 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 6f  emove results fo
d190: 72 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  rm the temporary
d1a0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
d1b0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
d1c0: 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
d1d0: 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
d1e0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
d1f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d200: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
d210: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
d220: 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
d230: 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
d240: 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
d250: 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
d260: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
d270: 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
d280: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
d290: 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
d2a0: 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
d2b0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
d2c0: 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
d2d0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
d2e0: 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
d2f0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e  **.** The pParen
d300: 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e  t, parentTab, an
d310: 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69  d *pParentAgg fi
d320: 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20  elds are filled 
d330: 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45  in if this.** SE
d340: 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65  LECT is a subque
d350: 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
d360: 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d  e may try to com
d370: 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54  bine this SELECT
d380: 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72  .** with its par
d390: 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69  ent to form a si
d3a0: 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e  ngle flat query.
d3b0: 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69    In so doing, i
d3c0: 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67  t might.** chang
d3d0: 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  e the parent que
d3e0: 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67  ry from a non-ag
d3f0: 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67  gregate to an ag
d400: 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
d410: 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f  * For that reaso
d420: 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67  n, the pParentAg
d430: 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64  g flag is passed
d440: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73   as a pointer, s
d450: 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63  o it.** can be c
d460: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
d470: 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20 20 50  qliteSelect(.  P
d480: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d490: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
d4a0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
d4b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
d4c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
d4d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
d4e0: 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
d4f0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
d500: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
d510: 6f 66 3a 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  of: SRT_Callback
d520: 20 4d 65 6d 20 53 65 74 20 55 6e 69 6f 6e 20 45   Mem Set Union E
d530: 78 63 65 70 74 20 2a 2f 0a 20 20 69 6e 74 20 69  xcept */.  int i
d540: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
d550: 20 20 2f 2a 20 53 61 76 65 20 72 65 73 75 6c 74    /* Save result
d560: 20 69 6e 20 74 68 69 73 20 6d 65 6d 6f 72 79 20   in this memory 
d570: 6c 6f 63 61 74 69 6f 6e 2c 20 69 66 20 3e 3d 30  location, if >=0
d580: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
d590: 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  arent,       /* 
d5a0: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66  Another SELECT f
d5b0: 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
d5c0: 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a   a sub-query */.
d5d0: 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c    int parentTab,
d5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
d5f0: 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53  x in pParent->pS
d600: 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79  rc of this query
d610: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65   */.  int *pPare
d620: 6e 74 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20  ntAgg        /* 
d630: 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
d640: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
d650: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
d660: 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 49   int i;.  WhereI
d670: 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56  nfo *pWInfo;.  V
d680: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73  dbe *v;.  int is
d690: 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Agg = 0;        
d6a0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
d6b0: 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
d6c0: 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
d6d0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
d6e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
d6f0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
d700: 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
d710: 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
d720: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
d730: 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
d740: 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
d750: 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
d760: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
d770: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
d780: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d790: 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
d7a0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d7b0: 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
d7c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d7d0: 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
d7e0: 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
d7f0: 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
d800: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
d810: 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
d820: 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
d830: 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
d840: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74   */.  int isDist
d850: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
d860: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
d870: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
d880: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
d890: 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20   distinct;      
d8a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
d8b0: 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
d8c0: 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  inct set */.  in
d8d0: 74 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  t base;         
d8e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 75       /* First cu
d8f0: 72 73 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 66  rsor available f
d900: 6f 72 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  or use */.  int 
d910: 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
d920: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
d930: 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
d940: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  function */..  i
d950: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
d960: 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  _failed || pPars
d970: 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20  e->nErr || p==0 
d980: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
d990: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
d9a0: 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
d9b0: 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
d9c0: 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
d9d0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
d9e0: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
d9f0: 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
da00: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
da10: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
da20: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
da30: 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
da40: 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
da50: 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
da60: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
da70: 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
da80: 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f   p->pWhere;.  pO
da90: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
daa0: 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79  erBy;.  pGroupBy
dab0: 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
dac0: 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
dad0: 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
dae0: 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
daf0: 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  inct;..  /* Allo
db00: 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
db10: 56 44 42 45 20 63 75 72 73 6f 72 73 2c 20 6f 6e  VDBE cursors, on
db20: 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  e for each table
db30: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
db40: 75 73 65 2e 0a 20 20 2a 2a 20 54 68 65 20 57 48  use..  ** The WH
db50: 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 72  ERE processing r
db60: 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
db70: 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65   cursors for the
db80: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
db90: 20 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   ** FROM clause 
dba0: 62 65 20 63 6f 6e 73 65 63 75 74 69 76 65 2e 0a  be consecutive..
dbb0: 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70 2d    */.  base = p-
dbc0: 3e 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  >base = pParse->
dbd0: 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nTab;.  pParse->
dbe0: 6e 54 61 62 20 2b 3d 20 70 54 61 62 4c 69 73 74  nTab += pTabList
dbf0: 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 0a 20  ->nSrc;..  /* . 
dc00: 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
dc10: 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
dc20: 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
dc30: 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
dc40: 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
dc50: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
dc60: 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
dc70: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
dc80: 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
dc90: 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
dca0: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
dcb0: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
dcc0: 20 6c 69 73 74 20 61 6e 64 20 63 72 65 61 74 65   list and create
dcd0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a   an appropriate.
dce0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c 69 73 74 20    ** columnlist 
dcf0: 69 6e 20 70 45 4c 69 73 74 20 69 66 20 74 68 65  in pEList if the
dd00: 72 65 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72  re isn't one alr
dd10: 65 61 64 79 2e 20 20 28 54 68 65 20 70 61 72 73  eady.  (The pars
dd20: 65 72 20 6c 65 61 76 65 73 0a 20 20 2a 2a 20 61  er leaves.  ** a
dd30: 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 70 2d 3e   NULL in the p->
dd40: 70 45 4c 69 73 74 20 69 66 20 74 68 65 20 53 51  pEList if the SQ
dd50: 4c 20 73 61 69 64 20 22 53 45 4c 45 43 54 20 2a  L said "SELECT *
dd60: 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a 20 20 2a 2f   FROM ...").  */
dd70: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
dd80: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
dd90: 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  p) ){.    goto s
dda0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
ddb0: 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
ddc0: 65 72 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  ere;.  pEList = 
ddd0: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
dde0: 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
ddf0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
de00: 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
de10: 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
de20: 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
de30: 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
de40: 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
de50: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
de60: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
de70: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
de80: 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  et) && pEList->n
de90: 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71  Expr>1 ){.    sq
dea0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
deb0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
dec0: 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
ded0: 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
dee0: 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
def0: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
df00: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
df10: 6f 6e 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  on", 0);.    pPa
df20: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
df30: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
df40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45  ;.  }..  /* ORDE
df50: 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20  R BY is ignored 
df60: 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61  for some destina
df70: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  tions..  */.  sw
df80: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
df90: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
dfa0: 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  n:.    case SRT_
dfb0: 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61 73 65  Except:.    case
dfc0: 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a 20 20   SRT_Discard:.  
dfd0: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
dfe0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
dff0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
e000: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
e010: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
e020: 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65  , we should have
e030: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74   allocated all t
e040: 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
e050: 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  we.  ** need to 
e060: 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73  handle subquerys
e070: 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74   and temporary t
e080: 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20  ables.  .  **.  
e090: 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  ** Resolve the c
e0a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
e0b0: 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63  do a semantics c
e0c0: 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20  heck on all the 
e0d0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
e0e0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
e0f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
e100: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
e110: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
e120: 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70  (pParse, base, p
e130: 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69  TabList, 0, pELi
e140: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
e150: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
e160: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
e170: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
e180: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
e190: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
e1a0: 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  pr, 1, &isAgg) )
e1b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
e1c0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
e1d0: 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20   }.  if( pWhere 
e1e0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
e1f0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
e200: 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54  pParse, base, pT
e210: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
e220: 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  pWhere) ){.     
e230: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
e240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e250: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
e260: 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
e270: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67  0, 0) ){.      g
e280: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
e290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e2a0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
e2c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
e2d0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
e2e0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
e2f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
e300: 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 43  f( sqliteExprIsC
e310: 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20  onstant(pE) ){. 
e320: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b         int iCol;
e330: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
e340: 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72  iteExprIsInteger
e350: 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29  (pE, &iCol)==0 )
e360: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e370: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
e380: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20  rse->zErrMsg, . 
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f                "O
e3a0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 6d 75  RDER BY terms mu
e3b0: 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
e3c0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
e3d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
e3e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
e3f0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
e400: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e410: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f     }else if( iCo
e420: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
e430: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
e440: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75          char zBu
e450: 66 5b 32 30 30 30 5d 3b 0a 20 20 20 20 20 20 20  f[2000];.       
e460: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
e470: 22 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e  "ORDER BY column
e480: 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
e490: 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
e4a0: 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
e4b0: 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
e4c0: 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c  d %d", iCol, pEL
e4d0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
e4e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
e4f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
e500: 7a 45 72 72 4d 73 67 2c 20 7a 42 75 66 2c 20 30  zErrMsg, zBuf, 0
e510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
e520: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
e530: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
e540: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
e550: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e560: 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
e570: 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
e580: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
e590: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  r = sqliteExprDu
e5a0: 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  p(pEList->a[iCol
e5b0: 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  -1].pExpr);.    
e5c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
e5d0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
e5e0: 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
e5f0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
e600: 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
e610: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
e620: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
e630: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
e640: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
e650: 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
e660: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
e670: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
e680: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
e690: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66  GroupBy ){.    f
e6a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
e6b0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
e6c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
e6d0: 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
e6e0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
e6f0: 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f  ( sqliteExprIsCo
e700: 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
e710: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
e720: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
e730: 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20  ErrMsg, .       
e740: 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20        "GROUP BY 
e750: 65 78 70 72 65 73 73 69 6f 6e 73 20 73 68 6f 75  expressions shou
e760: 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61  ld not be consta
e770: 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nt", 0);.       
e780: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
e790: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
e7a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e7b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
e7c0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
e7d0: 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70  (pParse, base, p
e7e0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
e7f0: 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
e800: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
e810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e820: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
e830: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
e840: 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
e850: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
e860: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
e870: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 48 61   }.  }.  if( pHa
e880: 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66 28 20  ving ){.    if( 
e890: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
e8a0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
e8b0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
e8c0: 72 72 4d 73 67 2c 20 22 61 20 47 52 4f 55 50 20  rrMsg, "a GROUP 
e8d0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
e8e0: 75 69 72 65 64 20 22 0a 20 20 20 20 20 20 20 20  uired ".        
e8f0: 20 22 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22   "before HAVING"
e900: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
e910: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
e920: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
e930: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
e940: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
e950: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
e960: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
e970: 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29 20 29  List, pHaving) )
e980: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
e990: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
e9a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
e9b0: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
e9c0: 48 61 76 69 6e 67 2c 20 69 73 41 67 67 2c 20 30  Having, isAgg, 0
e9d0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
e9e0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e9f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
ea00: 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
ea10: 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
ea20: 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
ea30: 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
ea40: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
ea50: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
ea60: 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
ea70: 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ry(pParse, p, eD
ea80: 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20  est, iParm) ){. 
ea90: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67     rc = 0;.    g
eaa0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
eab0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
eac0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
ead0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
eae0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
eaf0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
eb00: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
eb10: 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
eb20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
eb30: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
eb40: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
eb50: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
eb60: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
eb70: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
eb80: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
eb90: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
eba0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
ebb0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
ebc0: 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
ebd0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
ebe0: 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 54 61 62  e, p->base, pTab
ebf0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
ec00: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
ec10: 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a 20 20   limiter.  */.  
ec20: 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30  if( p->nLimit<=0
ec30: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d 69   ){.    p->nLimi
ec40: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6e  t = -1;.    p->n
ec50: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 7d 65  Offset = 0;.  }e
ec60: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65  lse{.    int iMe
ec70: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
ec80: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  ++;.    sqliteVd
ec90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
eca0: 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69  teger, -p->nLimi
ecb0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
ecc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ecd0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
ece0: 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d   1);.    p->nLim
ecf0: 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 69  it = iMem;.    i
ed00: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3c 3d 30  f( p->nOffset<=0
ed10: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66   ){.      p->nOf
ed20: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  fset = 0;.    }e
ed30: 6c 73 65 7b 0a 20 20 20 20 20 20 69 4d 65 6d 20  lse{.      iMem 
ed40: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
ed50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ed60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
ed70: 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73  teger, -p->nOffs
ed80: 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  et, 0);.      sq
ed90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
eda0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
edb0: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  em, 1);.      p-
edc0: 3e 6e 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b  >nOffset = iMem;
edd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ede0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
edf0: 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
ee00: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
ee10: 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  lause.  */.  for
ee20: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
ee30: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
ee40: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
ee50: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[i].pSelect==0 
ee60: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ee70: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
ee80: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  rse, pTabList->a
ee90: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54  [i].pSelect, SRT
eea0: 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62 61 73 65  _TempTable, base
eeb0: 2b 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +i,.            
eec0: 20 20 20 20 20 70 2c 20 69 2c 20 26 69 73 41 67       p, i, &isAg
eed0: 67 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  g);.    pTabList
eee0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
eef0: 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
ef00: 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
ef10: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
ef20: 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
ef30: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
ef40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
ef50: 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
ef60: 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
ef70: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
ef80: 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
ef90: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
efa0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
efb0: 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
efc0: 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63   subquery that c
efd0: 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64  an be "flattened
efe0: 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  " into its paren
eff0: 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74  t..  ** If flatt
f000: 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69  ening is a possi
f010: 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64  blity, do so and
f020: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
f030: 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ely.  .  */.  if
f040: 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
f050: 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
f060: 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
f070: 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
f080: 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
f090: 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
f0a0: 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
f0b0: 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
f0c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f0d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
f0e0: 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
f0f0: 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
f100: 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
f110: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
f120: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65  f( eDest==SRT_Te
f130: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73  mpTable ){.    s
f140: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f150: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
f160: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Parm, 0);.  }.. 
f170: 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73   /* Do an analys
f180: 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  is of aggregate 
f190: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
f1a0: 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67  /.  sqliteAggreg
f1b0: 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61  ateInfoReset(pPa
f1c0: 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67  rse);.  if( isAg
f1d0: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
f1e0: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30   pParse->nAgg==0
f1f0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
f200: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
f210: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f220: 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  ( sqliteExprAnal
f230: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
f240: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
f250: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
f260: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
f270: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
f280: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
f290: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  upBy ){.      fo
f2a0: 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
f2b0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
f2c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
f2d0: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
f2e0: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
f2f0: 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
f300: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
f310: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
f320: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
f330: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f340: 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73  if( pHaving && s
f350: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
f360: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
f370: 65 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20  e, pHaving) ){. 
f380: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
f390: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
f3a0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
f3b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f3c0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
f3d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
f3e0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e  if( sqliteExprAn
f3f0: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
f400: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
f410: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
f420: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f430: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f440: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f450: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f460: 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
f470: 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  or.  */.  if( is
f480: 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Agg ){.    sqlit
f490: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f4a0: 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50  _AggReset, 0, pP
f4b0: 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20  arse->nAgg);.   
f4c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
f4d0: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
f4e0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
f4f0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20  Func;.      if( 
f500: 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d  (pFunc = pParse-
f510: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21  >aAgg[i].pFunc)!
f520: 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69  =0 && pFunc->xFi
f530: 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20  nalize!=0 ){.   
f540: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f550: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e  ddOp(v, OP_AggIn
f560: 69 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20  it, 0, i);.     
f570: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
f580: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP3(v, -1, (ch
f590: 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f  ar*)pFunc, P3_PO
f5a0: 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a  INTER);.      }.
f5b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
f5c0: 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
f5d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f5e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
f5f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
f600: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f610: 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
f620: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
f630: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
f640: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
f650: 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69  to NULL.  */.  i
f660: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  f( eDest==SRT_Me
f670: 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  m ){.    sqliteV
f680: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
f690: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
f6a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f6b0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
f6c0: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d  , iParm, 1);.  }
f6d0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65  ..  /* Open a te
f6e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
f6f0: 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
f700: 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
f710: 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
f720: 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74   ){.    distinct
f730: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
f740: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  +;.    sqliteVdb
f750: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
f760: 6e 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c  nTemp, distinct,
f770: 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
f780: 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
f790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
f7a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
f7b0: 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  an.  */.  pWInfo
f7c0: 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42 65   = sqliteWhereBe
f7d0: 67 69 6e 28 70 50 61 72 73 65 2c 20 70 2d 3e 62  gin(pParse, p->b
f7e0: 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  ase, pTabList, p
f7f0: 57 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20  Where, 0, .     
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
f820: 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29  ? 0 : &pOrderBy)
f830: 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
f840: 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
f850: 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74  end;..  /* Use t
f860: 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
f870: 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65  r loop if we are
f880: 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74   not dealing wit
f890: 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  h.  ** aggregate
f8a0: 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  s.  */.  if( !is
f8b0: 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Agg ){.    if( s
f8c0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
f8d0: 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
f8e0: 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
f8f0: 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
f900: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
f910: 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57         iParm, pW
f920: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
f930: 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
f940: 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20   ){.       goto 
f950: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
f960: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
f970: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
f980: 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74  th aggregates, t
f990: 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69  hen do the speci
f9a0: 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a  al aggregate.  *
f9b0: 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a  * processing.  .
f9c0: 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
f9d0: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
f9e0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b  .      int lbl1;
f9f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
fa00: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
fa10: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
fa20: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
fa30: 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
fa40: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
fa50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
fa60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fa70: 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f  OP_MakeKey, pGro
fa80: 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  upBy->nExpr, 0);
fa90: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
faa0: 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e->db->file_form
fab0: 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64  at>=4 ) sqliteAd
fac0: 64 4b 65 79 54 79 70 65 28 76 2c 20 70 47 72 6f  dKeyType(v, pGro
fad0: 75 70 42 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c  upBy);.      lbl
fae0: 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  1 = sqliteVdbeMa
faf0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
fb00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fb10: 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
fb20: 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  , 0, lbl1);.    
fb30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
fb40: 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b  rse->nAgg; i++){
fb50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
fb60: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
fb70: 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
fb80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
fb90: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 50  rCode(pParse, pP
fba0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
fbb0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
fbc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fbd0: 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69   OP_AggSet, 0, i
fbe0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
fbf0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
fc00: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29  veLabel(v, lbl1)
fc10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
fc20: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
fc30: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
fc40: 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
fc50: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
fc60: 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  ( !pParse->aAgg[
fc70: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
fc80: 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  nue;.      pE = 
fc90: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
fca0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
fcb0: 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pE->op==TK_
fcc0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
fcd0: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c        if( pE->pL
fce0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ist ){.        f
fcf0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c  or(j=0; j<pE->pL
fd00: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
fd10: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
fd20: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
fd30: 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b  e, pE->pList->a[
fd40: 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
fd50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
fd60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
fd70: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
fd80: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
fd90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
fda0: 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c  , OP_AggFunc, 0,
fdb0: 20 70 45 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d   pE->pList ? pE-
fdc0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
fdd0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
fde0: 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  ( pParse->aAgg[i
fdf0: 5d 2e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20  ].pFunc!=0 );.  
fe00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
fe10: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
fe20: 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20  c->xStep!=0 );. 
fe30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
fe40: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
fe50: 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e 61 41  char*)pParse->aA
fe60: 67 67 5b 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f  gg[i].pFunc, P3_
fe70: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a  POINTER);.    }.
fe80: 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68    }..  /* End th
fe90: 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
fea0: 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  loop..  */.  sql
feb0: 69 74 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e  iteWhereEnd(pWIn
fec0: 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  fo);..  /* If we
fed0: 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20   are processing 
fee0: 61 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e  aggregates, we n
fef0: 65 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20  eed to set up a 
ff00: 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a  second loop.  **
ff10: 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
ff20: 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65   aggregate value
ff30: 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68  s and process th
ff40: 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  em..  */.  if( i
ff50: 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  sAgg ){.    int 
ff60: 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 56  endagg = sqliteV
ff70: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ff80: 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67  .    int startag
ff90: 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20  g;.    startagg 
ffa0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
ffb0: 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c  p(v, OP_AggNext,
ffc0: 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20   0, endagg);.   
ffd0: 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
ffe0: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 48 61  = 1;.    if( pHa
fff0: 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
10000 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28  liteExprIfFalse(
10010 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
10020 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20   startagg, 1);. 
10030 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c     }.    if( sel
10040 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
10050 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
10060 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
10070 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c  distinct, eDest,
10080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10090 20 20 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72       iParm, star
100a0 74 61 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b  tagg, endagg) ){
100b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
100c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
100d0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
100e0 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
100f0 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20   startagg);.    
10100 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
10110 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67  eLabel(v, endagg
10120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
10130 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
10140 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  p, 0, 0);.    pP
10150 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30  arse->useAgg = 0
10160 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
10170 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
10180 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
10190 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
101a0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
101b0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
101c0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
101d0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
101e0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
101f0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
10200 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 45  ortTail(p, v, pE
10210 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
10220 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a  st, iParm);.  }.
10230 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61 20 6e  ..  /* Issue a n
10240 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ull callback if 
10250 74 68 61 74 20 69 73 20 77 68 61 74 20 74 68 65  that is what the
10260 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a   user wants..  *
10270 2f 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  /.  if( (pParse-
10280 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10290 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
102a0 29 21 3d 30 20 26 26 20 65 44 65 73 74 3d 3d 53  )!=0 && eDest==S
102b0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
102c0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
102d0 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c  Op(v, OP_NullCal
102e0 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e  lback, pEList->n
102f0 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Expr, 0);.  }.. 
10300 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
10310 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
10320 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
10330 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
10340 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
10350 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
10360 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
10370 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
10380 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
10390 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
103a0 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
103b0 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
103c0 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
103d0 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
103e0 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 50 61 72  lect_end:.  pPar
103f0 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b  se->nTab = base;
10400 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
10410 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
10420 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  se);.  return rc
10430 3b 0a 7d 0a                                      ;.}.