/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact e79db94a78368e981af31be4f186bb78ca4081ce:


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 31 30  select.c,v 1.110
0200: 20 32 30 30 32 2f 30 38 2f 32 35 20 31 39 3a 32   2002/08/25 19:2
0210: 30 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a  0:40 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 73 71 6c 69 74 65  }.        sqlite
63b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
63c0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
63d0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
63e0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
63f0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c  lect = sqliteSel
6400: 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65  ectDup(pTab->pSe
6410: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
6420: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
6430: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
6440: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
6450: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
6460: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
6470: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
6480: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
6490: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
64a0: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
64b0: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
64c0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
64d0: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
64e0: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
64f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
6500: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
6510: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
6520: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
6530: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
6540: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
6550: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
6560: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
6570: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
6580: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
6590: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
65a0: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
65b0: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
65c0: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
65d0: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
65e0: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
65f0: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
6600: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
6610: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
6620: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
6630: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
6640: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
6650: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
6660: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
6670: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
6680: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
6690: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
66a0: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
66b0: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
66c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
66d0: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
66e0: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
66f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
6700: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
6710: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
6720: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
6730: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
6740: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
6750: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
6760: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
6770: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
6780: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
6790: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
67a0: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
67b0: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
67c0: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
67d0: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
67e0: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
67f0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
6800: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
6810: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
6820: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
6830: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
6840: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
6850: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
6860: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
6870: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
6880: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
6890: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
68a0: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
68b0: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
68c0: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f  pNew = 0;.    fo
68d0: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
68e0: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
68f0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61      Expr *pE = a
6900: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
6910: 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
6920: 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20  ALL &&.         
6930: 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f    (pE->op!=TK_DO
6940: 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d  T || pE->pRight=
6950: 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  =0 || pE->pRight
6960: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
6970: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
6980: 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
6990: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
69a0: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
69b0: 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
69c0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
69d0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
69e0: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
69f0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
6a00: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
6a10: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
6a20: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
6a30: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
6a40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
6a50: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
6a60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6a70: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
6a80: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
6a90: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
6aa0: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
6ab0: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
6ac0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
6ad0: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
6ae0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
6af0: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
6b00: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  hes */.        T
6b10: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
6b20: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
6b30: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
6b40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
6b50: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
6b60: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
6b70: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
6b80: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
6b90: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
6ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  {.          pNam
6bb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
6bc0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
6bd0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
6be0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
6bf0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
6c00: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
6c10: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
6c20: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
6c30: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
6c40: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
6c50: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
6c60: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
6c70: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
6c80: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
6c90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
6ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6cb0: 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20     if( pName && 
6cc0: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
6cd0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
6ce0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
6cf0: 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43      sqliteStrNIC
6d00: 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61  mp(pName->z, zTa
6d10: 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29  bName, pName->n)
6d20: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
6d30: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
6d40: 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29  [pName->n]!=0) )
6d50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
6d60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6d70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
6d80: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
6d90: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
6da0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
6db0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
6dc0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
6dd0: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
6de0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
6df0: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
6e00: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
6e10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
6e20: 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  0 && (pTabList->
6e30: 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  a[i-1].jointype 
6e40: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
6e50: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
6e60: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
6e70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
6e80: 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  .pTab, zName)>=0
6e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6ea0: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
6eb0: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
6ec0: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
6ed0: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
6ee0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
6ef0: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
6f10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6f20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6f30: 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c 69   if( i>0 && sqli
6f40: 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 70 54  teIdListIndex(pT
6f50: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70  abList->a[i-1].p
6f60: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
6f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f80: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
6f90: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
6fa0: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
6fb0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
6fc0: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
6fd0: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
6fe0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
6ff0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
7000: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7010: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7020: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
7030: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
7040: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
7050: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
7060: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
7070: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
7080: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e  ht->token.z = zN
7090: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
70a0: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
70b0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
70c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
70d0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  ight->token.dyn 
70e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
70f0: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 62   pRight->token.b
7100: 61 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ase = 1;.       
7110: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
7120: 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  e && pTabList->n
7130: 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
7140: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
7150: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c  qliteExpr(TK_ID,
7160: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
7170: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
7180: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44   sqliteExpr(TK_D
7190: 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
71a0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
71b0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d       if( pExpr==
71c0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
71d0: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e           pLeft->
71e0: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61  token.z = zTabNa
71f0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
7200: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e    pLeft->token.n
7210: 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61   = strlen(zTabNa
7220: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
7230: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
7240: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
7250: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
7260: 6b 65 6e 2e 62 61 73 65 20 3d 20 31 3b 0a 20 20  ken.base = 1;.  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7280: 74 65 53 65 74 53 74 72 69 6e 67 28 28 63 68 61  teSetString((cha
7290: 72 2a 2a 29 26 70 45 78 70 72 2d 3e 74 6f 6b 65  r**)&pExpr->toke
72a0: 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22  n.z, zTabName, "
72b0: 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  .", zName, 0);. 
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
72d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74  pr->token.n = st
72e0: 72 6c 65 6e 28 70 45 78 70 72 2d 3e 74 6f 6b 65  rlen(pExpr->toke
72f0: 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n.z);.          
7300: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
7310: 2e 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20  .base = 0;.     
7320: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7330: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  token.dyn = 1;. 
7340: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
7350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7360: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
7370: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7380: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
7390: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
73a0: 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70  ppend(pNew, pExp
73b0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
73c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
73d0: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
73e0: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
73f0: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
7400: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7410: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
7420: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
7430: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
7440: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
7450: 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61     pName->z, pNa
7460: 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  me->n, 0);.     
7470: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
7490: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
74a0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 74 61  >zErrMsg, "no ta
74b0: 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  bles specified",
74c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
74d0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
74e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
74f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
7500: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
7510: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
7520: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
7530: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
7540: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
7550: 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73  s routine recurs
7560: 69 76 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68  ively unlinks th
7570: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
7580: 5d 2e 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a  ].pTab pointers.
7590: 2a 2a 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73  ** in a select s
75a0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75  tructure.  It ju
75b0: 73 74 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e  st sets the poin
75c0: 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54  ters to NULL.  T
75d0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
75e0: 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 20 74  s recursive in t
75f0: 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 66  he sense that if
7600: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
7610: 2e 61 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20  .a[].pSelect.** 
7620: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
7630: 55 4c 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ULL, this routin
7640: 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  e is called recu
7650: 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20  rsively on that 
7660: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
7670: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7680: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c  alled on the Sel
7690: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 74 68  ect structure th
76a0: 61 74 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20  at defines a.** 
76b0: 56 49 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f  VIEW in order to
76c0: 20 75 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e   undo any bindin
76d0: 67 73 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54  gs to tables.  T
76e0: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
76f0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73  .** because thos
7700: 65 20 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62  e tables might b
7710: 65 20 44 52 4f 50 65 64 20 62 79 20 61 20 73 75  e DROPed by a su
7720: 62 73 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d  bsequent SQL com
7730: 6d 61 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mand..*/.void sq
7740: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
7750: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
7760: 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
7770: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
7780: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
7790: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
77a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
77b0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
77c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 61  +){.    if( (pTa
77d0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  b = pSrc->a[i].p
77e0: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
77f0: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
7800: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
7810: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
7820: 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 23 69  ble(0, pTab);.#i
7830: 66 20 30 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f 0.        sqli
7840: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
7850: 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Src->a[i].pSelec
7860: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63  t);.        pSrc
7870: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
7880: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   0;.#endif.     
7890: 20 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61   }.      pSrc->a
78a0: 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20  [i].pTab = 0;.  
78b0: 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
78c0: 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  i].pSelect ){.  
78d0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65        sqliteSele
78e0: 63 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61  ctUnbind(pSrc->a
78f0: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
7900: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7910: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7920: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
7930: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
7940: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
7950: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
7960: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
7970: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
7980: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
7990: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
79a0: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
79b0: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
79c0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
79d0: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
79e0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
79f0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
7a00: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
7a10: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
7a20: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
7a30: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
7a40: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
7a50: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
7a60: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
7a70: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
7a80: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
7a90: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
7aa0: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
7ab0: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
7ac0: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
7ad0: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
7ae0: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
7af0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
7b00: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
7b10: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
7b20: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
7b30: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
7b40: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
7b50: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
7b60: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
7b70: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
7b80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7b90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
7ba0: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
7bb0: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
7bc0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
7bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
7be0: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
7bf0: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
7c00: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
7c10: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
7c20: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
7c30: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
7c40: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
7c50: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7c70: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
7c80: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
7c90: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
7ca0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
7cb0: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
7cc0: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
7cd0: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
7ce0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
7cf0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7d00: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
7d10: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
7d20: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
7d30: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
7d40: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
7d50: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
7d60: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
7d70: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
7d80: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
7d90: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
7da0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
7db0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
7dc0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  1;.  }.  if( pSe
7dd0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
7de0: 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64      if( matchOrd
7df0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
7e00: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
7e10: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
7e20: 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
7e30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7e40: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
7e50: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
7e60: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
7e70: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
7e80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
7e90: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
7ea0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
7eb0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
7ec0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
7ed0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
7ee0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
7ef0: 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
7f00: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
7f10: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
7f20: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
7f30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
7f40: 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32       char zBuf[2
7f50: 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70 72  00];.        spr
7f60: 69 6e 74 66 28 7a 42 75 66 2c 22 4f 52 44 45 52  intf(zBuf,"ORDER
7f70: 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20   BY position %d 
7f80: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65  should be betwee
7f90: 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20  n 1 and %d",.   
7fa0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
7fb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
7fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
7fd0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
7fe0: 45 72 72 4d 73 67 2c 20 7a 42 75 66 2c 20 30 29  ErrMsg, zBuf, 0)
7ff0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8000: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
8010: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
8020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8030: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
8040: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
8050: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
8060: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
8070: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
8080: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
8090: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
80a0: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
80b0: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
80c0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
80d0: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
80e0: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
80f0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
8100: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
8110: 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20  >token.z );.    
8120: 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c      zLabel = sql
8130: 69 74 65 53 74 72 4e 44 75 70 28 70 45 2d 3e 74  iteStrNDup(pE->t
8140: 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65  oken.z, pE->toke
8150: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n.n);.        sq
8160: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 61 62  liteDequote(zLab
8170: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  el);.        if(
8180: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
8190: 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30  Name, zLabel)==0
81a0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69   ){ .          i
81b0: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  Col = j;.       
81c0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
81d0: 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20  eFree(zLabel);. 
81e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
81f0: 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74   iCol<0 && sqlit
8200: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c  eExprCompare(pE,
8210: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45   pEList->a[j].pE
8220: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
8230: 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20  iCol = j;.      
8240: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8250: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
8260: 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c   pE->op = TK_COL
8270: 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  UMN;.      pE->i
8280: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
8290: 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20       pE->iTable 
82a0: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  = iTable;.      
82b0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
82c0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  one = 1;.    }. 
82d0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
82e0: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
82f0: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
8300: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69  [30];.      spri
8310: 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 69 2b  ntf(zBuf,"%d",i+
8320: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8330: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
8340: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52 44  e->zErrMsg, "ORD
8350: 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65  ER BY term numbe
8360: 72 20 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20  r ", zBuf, .    
8370: 20 20 20 20 22 20 64 6f 65 73 20 6e 6f 74 20 6d      " does not m
8380: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
8390: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
83a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
83b0: 2b 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  +;.      nErr++;
83c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
83d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
83e0: 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a   nErr;  .}../*.*
83f0: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
8400: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
8410: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
8420: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
8430: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
8440: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8450: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
8460: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
8470: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
8480: 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74 56  Vdbe *sqliteGetV
8490: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
84a0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
84b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
84c0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
84d0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
84e0: 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  be = sqliteVdbeC
84f0: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
8500: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8510: 76 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  v;.}.    ../*.**
8520: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8530: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
8540: 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20  ss a query that 
8550: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e  is really the un
8560: 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73  ion.** or inters
8570: 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72  ection of two or
8580: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
8590: 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70  ueries..**.** "p
85a0: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
85b0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
85c0: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
85d0: 54 68 65 20 72 65 73 75 6c 74 73 20 73 68 6f 75  The results shou
85e0: 6c 64 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ld.** be stored 
85f0: 69 6e 20 65 44 65 73 74 20 77 69 74 68 20 70 61  in eDest with pa
8600: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
8610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
8620: 74 69 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  tiSelect(Parse *
8630: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
8640: 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e  p, int eDest, in
8650: 74 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20  t iParm){.  int 
8660: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8670: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
8680: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
8690: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
86a0: 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e  Prior;     /* An
86b0: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
86c0: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
86d0: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
86e0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
86f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8700: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
8710: 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20   int base;      
8720: 20 20 20 20 20 2f 2a 20 42 61 73 65 6c 69 6e 65       /* Baseline
8730: 20 76 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73   value for pPars
8740: 65 2d 3e 6e 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a  e->nTab */..  /*
8750: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
8760: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
8770: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
8780: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74  SELECTs.  Only t
8790: 68 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45  he .  ** last SE
87a0: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
87b0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
87c0: 52 44 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20  RDER BY..  */.  
87d0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
87e0: 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
87f0: 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  n 1;.  pPrior = 
8800: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
8810: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
8820: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
8830: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
8840: 2d 3e 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45 52  ->zErrMsg,"ORDER
8850: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
8860: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a  d come after ",.
8870: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
8880: 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74  me(p->op), " not
8890: 20 62 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20   before", 0);.  
88a0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
88b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
88c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
88d0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
88e0: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
88f0: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
8900: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
8910: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
8920: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
8930: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
8940: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  rn 1;..  /* Crea
8950: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
8960: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
8970: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
8980: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
8990: 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
89a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
89b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
89c0: 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
89d0: 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52  ;.    eDest = SR
89e0: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
89f0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
8a00: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
8a10: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
8a20: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
8a30: 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d    base = pParse-
8a40: 3e 6e 54 61 62 3b 0a 20 20 73 77 69 74 63 68 28  >nTab;.  switch(
8a50: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
8a60: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
8a70: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
8a80: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
8a90: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
8aa0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
8ab0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  r, eDest, iParm,
8ac0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
8ad0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
8ae0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70  rn rc;.        p
8af0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
8b00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8b10: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
8b20: 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
8b30: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
8b40: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
8b50: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
8b60: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8b70: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
8b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8b90: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
8ba0: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
8bb0: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
8bc0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
8bd0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8be0: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
8bf0: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
8c00: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
8c10: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
8c20: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
8c30: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
8c40: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
8c50: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
8c60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
8c70: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
8c80: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
8c90: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
8ca0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
8cb0: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
8cc0: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
8cd0: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
8ce0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
8cf0: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20   *pOrderBy;  /* 
8d00: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
8d10: 75 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  use for the righ
8d20: 74 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20  t SELECT */..   
8d30: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e     priorOp = p->
8d40: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54  op==TK_ALL ? SRT
8d50: 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69  _Table : SRT_Uni
8d60: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  on;.      if( eD
8d70: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
8d80: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
8d90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
8da0: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
8db0: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
8dc0: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
8dd0: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
8de0: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
8df0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
8e00: 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a  ionTab = iParm;.
8e10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8e20: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
8e30: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
8e40: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
8e50: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
8e60: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
8e70: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
8e80: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
8e90: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
8ea0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
8eb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
8ec0: 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20  >pOrderBy .     
8ed0: 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72     && matchOrder
8ee0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
8ef0: 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
8f00: 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20  y, unionTab, 1) 
8f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
8f20: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
8f30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
8f40: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
8f50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8f60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
8f70: 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62  enTemp, unionTab
8f80: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
8f90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8fa0: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
8fb0: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
8fc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8fd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8fe0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
8ff0: 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62  enTemp, unionTab
9000: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
9010: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
9020: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
9030: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
9040: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
9050: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
9060: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
9070: 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f  , pPrior, priorO
9080: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
9090: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
90a0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
90b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
90c0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
90d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
90e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
90f0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
9100: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
9110: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
9120: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
9130: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
9140: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
9150: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
9160: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
9170: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
9180: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
9190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
91a0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
91b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64   = 0;.      pOrd
91c0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
91d0: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  By;.      p->pOr
91e0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
91f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
9200: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
9210: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
9220: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
9230: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
9240: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
9250: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
9260: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9270: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
9280: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
9290: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
92a0: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
92b0: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
92c0: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
92d0: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
92e0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
92f0: 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65    .      if( eDe
9300: 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
9310: 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29  nionTab!=iParm )
9320: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
9330: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
9340: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
9350: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
9360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44  ;.        if( eD
9370: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
9380: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  k ){.          g
9390: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
93a0: 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61  es(pParse, p->ba
93b0: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
93c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
93d0: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
93e0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
93f0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
9400: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ont = sqliteVdbe
9410: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
9420: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9430: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
9440: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
9450: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
9460: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64  Start = sqliteVd
9470: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9480: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
9490: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
94a0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
94b0: 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
94c0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
94d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
94f0: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
9500: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
9530: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
9540: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
9550: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71  rn 1;.        sq
9560: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
9570: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
9580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
9590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
95a0: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
95b0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
95c0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
95d0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
95e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
95f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9600: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
9610: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
9620: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
9630: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
9640: 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c  teSortTail(p, v,
9650: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
9660: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
9670: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9680: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
9690: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
96a0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
96b0: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
96c0: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
96d0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
96e0: 53 74 61 72 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Start;..      /*
96f0: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
9700: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
9710: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
9720: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
9730: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
9740: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
9750: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
9760: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
9770: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
9780: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
9790: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
97a0: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
97b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
97c0: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
97d0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
97e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
97f0: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
9800: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
9810: 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42  rse,p,p->pOrderB
9820: 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20  y,tab1,1) ){.   
9830: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9850: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9860: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62  OP_OpenTemp, tab
9870: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
9880: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9890: 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61  OP_KeyAsData, ta
98a0: 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f  b1, 1);..      /
98b0: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
98c0: 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
98d0: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
98e0: 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
98f0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
9900: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
9910: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
9920: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
9930: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
9940: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
9950: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
9960: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
9970: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
9980: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
9990: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
99a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
99b0: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
99c0: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ab2, 1);.      s
99d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
99e0: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
99f0: 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  tab2, 1);.      
9a00: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
9a10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9a20: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
9a30: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
9a40: 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  2, 0, 0, 0);.   
9a50: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
9a60: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
9a70: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9a80: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
9a90: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
9aa0: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
9ab0: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
9ac0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
9ad0: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
9ae0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9af0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
9b00: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
9b10: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
9b20: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
9b30: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
9b40: 20 70 2d 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e   p->base, 0, p->
9b50: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
9b60: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
9b70: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
9b80: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
9b90: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ont = sqliteVdbe
9ba0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
9bb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9bc0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
9bd0: 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
9be0: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
9bf0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9c00: 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74  v, OP_FullKey, t
9c10: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab1, 0);.      s
9c20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9c30: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
9c40: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
9c50: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
9c60: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
9c70: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
9c80: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
9c90: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
9cc0: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
9cd0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
9d00: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
9d10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 73  eturn 1;.      s
9d20: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
9d30: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
9d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9d50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
9d60: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
9d70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9d80: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
9d90: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
9da0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9db0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
9dc0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
9dd0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9de0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
9df0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
9e00: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
9e10: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
9e20: 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e  rtTail(p, v, p->
9e30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
9e40: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
9e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
9e60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  k;.    }.  }.  a
9e70: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
9e80: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
9e90: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
9ea0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
9eb0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
9ec0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
9ed0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
9ee0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45  se->zErrMsg, "SE
9ef0: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
9f00: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 22  t and right of "
9f10: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
9f20: 4e 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 64  Name(p->op), " d
9f30: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
9f40: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
9f50: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 30  sult columns", 0
9f60: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
9f70: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
9f80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  n 1;.  }.  pPars
9f90: 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a  e->nTab = base;.
9fa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9fb0: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
9fc0: 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 61 6e   scan through an
9fd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9fe0: 2e 20 20 46 6f 72 20 65 76 65 72 79 20 72 65 66  .  For every ref
9ff0: 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 61 20 63  erence.** to a c
a000: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
a010: 75 6d 62 65 72 20 69 46 72 6f 6d 2c 20 63 68 61  umber iFrom, cha
a020: 6e 67 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  nge that referen
a030: 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 73 61 6d  ce to the.** sam
a040: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  e column in tabl
a050: 65 20 6e 75 6d 62 65 72 20 69 54 6f 2e 0a 2a 2f  e number iTo..*/
a060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61  .static void cha
a070: 6e 67 65 54 61 62 6c 65 73 28 45 78 70 72 20 2a  ngeTables(Expr *
a080: 70 45 78 70 72 2c 20 69 6e 74 20 69 46 72 6f 6d  pExpr, int iFrom
a090: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66  , int iTo){.  if
a0a0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
a0b0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
a0c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
a0d0: 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
a0e0: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 70  ==iFrom ){.    p
a0f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
a100: 54 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  To;.  }else{.   
a110: 20 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61   static void cha
a120: 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28  ngeTablesInList(
a130: 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
a140: 69 6e 74 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  int);.    change
a150: 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e 70 4c  Tables(pExpr->pL
a160: 65 66 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29  eft, iFrom, iTo)
a170: 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c  ;.    changeTabl
a180: 65 73 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  es(pExpr->pRight
a190: 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20  , iFrom, iTo);. 
a1a0: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49     changeTablesI
a1b0: 6e 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  nList(pExpr->pLi
a1c0: 73 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b  st, iFrom, iTo);
a1d0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
a1e0: 69 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49  id changeTablesI
a1f0: 6e 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  nList(ExprList *
a200: 70 4c 69 73 74 2c 20 69 6e 74 20 69 46 72 6f 6d  pList, int iFrom
a210: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66  , int iTo){.  if
a220: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ( pList ){.    i
a230: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
a240: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
a250: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  r; i++){.      c
a260: 68 61 6e 67 65 54 61 62 6c 65 73 28 70 4c 69 73  hangeTables(pLis
a270: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
a280: 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  From, iTo);.    
a290: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
a2a0: 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
a2b0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
a2c0: 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
a2d0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
a2e0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
a2f0: 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
a300: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
a310: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
a320: 67 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  g.** entry in pE
a330: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
a340: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
a350: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
a360: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
a370: 20 20 57 68 65 6e 20 6d 61 6b 69 6e 67 20 61 20    When making a 
a380: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
a390: 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 2c  ssion in pEList,
a3a0: 20 63 68 61 6e 67 65 0a 2a 2a 20 72 65 66 65 72   change.** refer
a3b0: 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
a3c0: 20 69 6e 20 74 61 62 6c 65 20 69 53 75 62 20 69   in table iSub i
a3d0: 6e 74 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74  nto references t
a3e0: 6f 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2e 0a  o table iTable..
a3f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a400: 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
a410: 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
a420: 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
a430: 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
a440: 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
a450: 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
a460: 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
a470: 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
a480: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
a490: 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
a4a0: 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
a4b0: 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
a4c0: 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
a4d0: 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
a4e0: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
a4f0: 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
a500: 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
a510: 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
a520: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
a530: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
a540: 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
a550: 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
a560: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
a570: 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
a580: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
a590: 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  pr(Expr *pExpr, 
a5a0: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
a5b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e  List *pEList, in
a5c0: 74 20 69 53 75 62 29 7b 0a 20 20 69 66 28 20 70  t iSub){.  if( p
a5d0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
a5e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
a5f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
a600: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
a610: 54 61 62 6c 65 20 26 26 20 70 45 78 70 72 2d 3e  Table && pExpr->
a620: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
a630: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
a640: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
a650: 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
a660: 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
a670: 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  xpr );.    asser
a680: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
a690: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
a6a0: 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
a6b0: 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
a6c0: 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e   pNew = pEList->
a6d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
a6e0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
a6f0: 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a  ert( pNew!=0 );.
a700: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
a710: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 61 73  pNew->op;.    as
a720: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
a730: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78  ft==0 );.    pEx
a740: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
a750: 74 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  teExprDup(pNew->
a760: 70 4c 65 66 74 29 3b 0a 20 20 20 20 61 73 73 65  pLeft);.    asse
a770: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
a780: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70  t==0 );.    pExp
a790: 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
a7a0: 74 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  teExprDup(pNew->
a7b0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 61 73 73  pRight);.    ass
a7c0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73  ert( pExpr->pLis
a7d0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70  t==0 );.    pExp
a7e0: 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r->pList = sqlit
a7f0: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65  eExprListDup(pNe
a800: 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  w->pList);.    p
a810: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
a820: 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
a830: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
a840: 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pNew->iColumn;
a850: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67  .    pExpr->iAgg
a860: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
a870: 20 20 20 70 45 78 70 72 2d 3e 6e 46 75 6e 63 4e     pExpr->nFuncN
a880: 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 6e 46 75 6e  ame = pNew->nFun
a890: 63 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  cName;.    sqlit
a8a0: 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  eTokenCopy(&pExp
a8b0: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
a8c0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  >token);.    if(
a8d0: 20 69 53 75 62 21 3d 69 54 61 62 6c 65 20 29 7b   iSub!=iTable ){
a8e0: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62  .      changeTab
a8f0: 6c 65 73 28 70 45 78 70 72 2c 20 69 53 75 62 2c  les(pExpr, iSub,
a900: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a   iTable);.    }.
a910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
a920: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
a930: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a  prList(ExprList*
a940: 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 2c 69  ,int,ExprList*,i
a950: 6e 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  nt);.    substEx
a960: 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
a970: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c   iTable, pEList,
a980: 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73   iSub);.    subs
a990: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69  tExpr(pExpr->pRi
a9a0: 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
a9b0: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
a9c0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45  substExprList(pE
a9d0: 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
a9e0: 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62  le, pEList, iSub
a9f0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
aa00: 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c  void .substExprL
aa10: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
aa20: 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  ist, int iTable,
aa30: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
aa40: 74 2c 20 69 6e 74 20 69 53 75 62 29 7b 0a 20 20  t, int iSub){.  
aa50: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
aa60: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
aa70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
aa80: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
aa90: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
aaa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
aab0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
aac0: 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  , iSub);.  }.}..
aad0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
aae0: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
aaf0: 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
ab00: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
ab10: 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
ab20: 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
ab30: 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
ab40: 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
ab50: 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
ab60: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
ab70: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
ab80: 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
ab90: 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
aba0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
abb0: 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
abc0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
abd0: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
abe0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
abf0: 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
ac00: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
ac10: 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
ac20: 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
ac30: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
ac40: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
ac50: 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
ac60: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
ac70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
ac80: 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
ac90: 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
aca0: 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
acb0: 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
acc0: 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
acd0: 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
ace0: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
acf0: 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
ad00: 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
ad10: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
ad20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
ad30: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ad40: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
ad50: 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
ad60: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
ad70: 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
ad80: 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
ad90: 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
ada0: 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
adb0: 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
adc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
add0: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
ade0: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
adf0: 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
ae00: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
ae10: 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
ae20: 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
ae30: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
ae40: 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
ae50: 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
ae60: 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
ae70: 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
ae80: 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
ae90: 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
aea0: 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
aeb0: 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
aec0: 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
aed0: 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
aee0: 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
aef0: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
af00: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
af10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
af20: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
af30: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
af40: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
af50: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
af60: 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
af70: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
af80: 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
af90: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
afa0: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
afb0: 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
afc0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
afd0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  oin..**.**   (4)
afe0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
aff0: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
b000: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
b010: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
b020: 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
b030: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
b040: 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
b050: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
b060: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
b070: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
b080: 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
b090: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
b0a0: 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
b0b0: 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
b0c0: 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
b0d0: 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
b0e0: 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
b0f0: 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
b100: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
b110: 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
b120: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
b130: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
b140: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
b150: 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
b160: 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
b170: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
b180: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
b190: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
b1a0: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
b1b0: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
b1c0: 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
b1d0: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
b1e0: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
b1f0: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
b200: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
b210: 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
b220: 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  T..**.** In this
b230: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
b240: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
b250: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
b260: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
b270: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
b280: 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
b290: 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
b2a0: 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
b2b0: 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
b2c0: 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
b2d0: 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
b2e0: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
b2f0: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
b300: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
b310: 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
b320: 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
b330: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
b340: 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a 2a   and return 0..*
b350: 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
b360: 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
b370: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
b380: 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
b390: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b3a0: 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
b3b0: 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
b3c0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
b3d0: 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
b3e0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
b3f0: 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
b400: 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
b410: 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
b420: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b430: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
b440: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
b450: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
b460: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
b470: 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
b480: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
b490: 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
b4a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
b4b0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
b4c0: 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
b4d0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
b4e0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
b4f0: 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
b500: 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
b510: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
b520: 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
b530: 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
b540: 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
b550: 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
b560: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
b570: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
b580: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
b590: 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
b5a0: 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69  uery" */.  SrcLi
b5b0: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
b5c0: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
b5d0: 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
b5e0: 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
b5f0: 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
b600: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
b610: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
b620: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
b630: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
b640: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
b650: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
b660: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  /.  int i;.  int
b670: 20 69 50 61 72 65 6e 74 2c 20 69 53 75 62 3b 0a   iParent, iSub;.
b680: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a    Expr *pWhere;.
b690: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
b6a0: 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
b6b0: 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
b6c0: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
b6d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
b6e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b6f0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
b700: 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
b710: 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
b720: 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
b730: 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e  .  pSub = pSrc->
b740: 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74  a[iFrom].pSelect
b750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
b760: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
b770: 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
b780: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
b790: 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
b7a0: 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
b7b0: 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  c>1 ) return 0;.
b7c0: 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
b7d0: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
b7e0: 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69  ( pSubSrc );.  i
b7f0: 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
b800: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
b810: 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44    if( (pSub->isD
b820: 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
b830: 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 20  >nLimit>=0) &&  
b840: 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
b850: 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
b860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b870: 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74 69 6e  if( (p->isDistin
b880: 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e  ct || p->nLimit>
b890: 3d 30 29 20 26 26 20 73 75 62 71 75 65 72 79 49  =0) && subqueryI
b8a0: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
b8b0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
b8c0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
b8d0: 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69  t means flatteni
b8e0: 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  ng is permitted 
b8f0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 2d 74  for the.  ** i-t
b900: 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
b910: 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
b920: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
b930: 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20   */.  iParent = 
b940: 70 2d 3e 62 61 73 65 20 2b 20 69 46 72 6f 6d 3b  p->base + iFrom;
b950: 0a 20 20 69 53 75 62 20 3d 20 70 53 75 62 2d 3e  .  iSub = pSub->
b960: 62 61 73 65 3b 0a 20 20 73 75 62 73 74 45 78 70  base;.  substExp
b970: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
b980: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
b990: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
b9a0: 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69   pList = p->pELi
b9b0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
b9c0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
b9d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ++){.    if( pLi
b9e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
b9f0: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
ba00: 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
ba10: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
ba20: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ba30: 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 3b 0a 20  >token.z!=0 );. 
ba40: 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
ba50: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
ba60: 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 74 6f  trNDup(pExpr->to
ba70: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
ba80: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  ken.n);.    }.  
ba90: 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
baa0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
bab0: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
bac0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
bad0: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
bae0: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
baf0: 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
bb00: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
bb10: 53 75 62 29 3b 0a 20 20 7d 0a 20 20 73 75 62 73  Sub);.  }.  subs
bb20: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
bb30: 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
bb40: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
bb50: 75 62 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d  ub);.  if( pSub-
bb60: 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
bb70: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78  Where = sqliteEx
bb80: 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
bb90: 72 65 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  re);.    if( iPa
bba0: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
bbb0: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
bbc0: 28 70 57 68 65 72 65 2c 20 69 53 75 62 2c 20 69  (pWhere, iSub, i
bbd0: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  Parent);.    }. 
bbe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
bbf0: 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
bc00: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
bc10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
bc20: 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
bc30: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
bc40: 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
bc50: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
bc60: 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
bc70: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
bc80: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
bc90: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
bca0: 69 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  if( pSub->pHavin
bcb0: 67 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  g ){.      Expr 
bcc0: 2a 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  *pHaving = sqlit
bcd0: 65 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  eExprDup(pSub->p
bce0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69  Having);.      i
bcf0: 66 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62  f( iParent!=iSub
bd00: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 6e   ){.        chan
bd10: 67 65 54 61 62 6c 65 73 28 70 48 61 76 69 6e 67  geTables(pHaving
bd20: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
bd30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bd40: 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
bd50: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
bd60: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70  ving = sqliteExp
bd70: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61  r(TK_AND, p->pHa
bd80: 76 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30  ving, pHaving, 0
bd90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bda0: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69          p->pHavi
bdb0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
bdc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bdd0: 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
bde0: 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  pBy==0 );.    p-
bdf0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
be00: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 53  teExprListDup(pS
be10: 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  ub->pGroupBy);. 
be20: 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d     if( iParent!=
be30: 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68  iSub ){.      ch
be40: 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74  angeTablesInList
be50: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 53  (p->pGroupBy, iS
be60: 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20  ub, iParent);.  
be70: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
be80: 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a  p->pWhere==0 ){.
be90: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
bea0: 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b  pWhere;.  }else{
beb0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
bec0: 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
bed0: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c  t, pSub->pEList,
bee0: 20 69 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   iSub);.    if( 
bef0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
bf00: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
bf10: 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  teExpr(TK_AND, p
bf20: 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
bf30: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
bf40: 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
bf50: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
bf60: 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
bf70: 6e 63 74 3b 0a 0a 20 20 69 66 28 20 70 53 75 62  nct;..  if( pSub
bf80: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
bf90: 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74     if( p->nLimit
bfa0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  <0 ){.      p->n
bfb0: 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c  Limit = pSub->nL
bfc0: 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  imit;.    }else 
bfd0: 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d  if( p->nLimit+p-
bfe0: 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d  >nOffset > pSub-
bff0: 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f  >nLimit+pSub->nO
c000: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
c010: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
c020: 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e  >nLimit + pSub->
c030: 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66  nOffset - p->nOf
c040: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fset;.    }.  }.
c050: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20    p->nOffset += 
c060: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a  pSub->nOffset;..
c070: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
c080: 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 73 75  uery contains su
c090: 62 71 75 65 72 69 65 73 20 6f 66 20 69 74 73 20  bqueries of its 
c0a0: 6f 77 6e 2c 20 74 68 61 74 20 77 65 72 65 20 6e  own, that were n
c0b0: 6f 74 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 65  ot.  ** flattene
c0c0: 64 2c 20 74 68 65 6e 20 63 6f 64 65 20 77 69 6c  d, then code wil
c0d0: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
c0e0: 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 74 6f  een generated to
c0f0: 20 70 75 74 0a 20 20 2a 2a 20 74 68 65 20 72 65   put.  ** the re
c100: 73 75 6c 74 73 20 6f 66 20 74 68 6f 73 65 20 73  sults of those s
c110: 75 62 2d 73 75 62 71 75 65 72 69 65 73 20 69 6e  ub-subqueries in
c120: 74 6f 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  to VDBE cursors 
c130: 72 65 6c 61 74 69 76 65 0a 20 20 2a 2a 20 74 6f  relative.  ** to
c140: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
c150: 57 65 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74  We must translat
c160: 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
c170: 62 65 72 20 69 6e 74 6f 20 76 61 6c 75 65 73 0a  ber into values.
c180: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
c190: 72 20 75 73 65 20 62 79 20 74 68 65 20 6f 75 74  r use by the out
c1a0: 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
c1b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 75 62   for(i=0; i<pSub
c1c0: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
c1d0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
c1e0: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 61    if( pSubSrc->a
c1f0: 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
c200: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 76   continue;.    v
c210: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
c220: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
c230: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c240: 20 4f 50 5f 52 65 6e 61 6d 65 43 75 72 73 6f 72   OP_RenameCursor
c250: 2c 20 70 53 75 62 2d 3e 62 61 73 65 2b 69 2c 20  , pSub->base+i, 
c260: 70 2d 3e 62 61 73 65 2b 69 29 3b 0a 20 20 7d 0a  p->base+i);.  }.
c270: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69  .  if( pSrc->a[i
c280: 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53  From].pTab && pS
c290: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
c2a0: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
c2b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  {.    sqliteDele
c2c0: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d  teTable(0, pSrc-
c2d0: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b  >a[iFrom].pTab);
c2e0: 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 61 5b 69  .  }.  pSrc->a[i
c2f0: 46 72 6f 6d 5d 2e 70 54 61 62 20 3d 20 70 53 75  From].pTab = pSu
c300: 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  bSrc->a[0].pTab;
c310: 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d  .  pSubSrc->a[0]
c320: 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 61 73 73  .pTab = 0;.  ass
c330: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 46 72  ert( pSrc->a[iFr
c340: 6f 6d 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 53 75  om].pSelect==pSu
c350: 62 20 29 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 69  b );.  pSrc->a[i
c360: 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 20 3d 20  From].pSelect = 
c370: 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  pSubSrc->a[0].pS
c380: 65 6c 65 63 74 3b 0a 20 20 70 53 75 62 53 72 63  elect;.  pSubSrc
c390: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
c3a0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65   0;.  sqliteSele
c3b0: 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
c3c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
c3d0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
c3e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c3f0: 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
c400: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
c410: 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
c420: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
c430: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
c440: 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
c450: 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
c460: 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
c470: 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
c480: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
c490: 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
c4a0: 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
c4b0: 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
c4c0: 20 74 68 69 73 20 53 45 4c 45 43 54 20 72 65 74   this SELECT ret
c4d0: 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
c4e0: 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
c4f0: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
c500: 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
c510: 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
c520: 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
c530: 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
c540: 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
c550: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
c560: 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
c570: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
c580: 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
c590: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
c5a0: 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
c5b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
c5c0: 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
c5d0: 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
c5e0: 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
c5f0: 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
c600: 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
c610: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
c620: 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
c630: 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
c640: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
c650: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
c660: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
c670: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
c680: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
c690: 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
c6a0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
c6b0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
c6c0: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
c6d0: 66 6f 72 20 73 71 6c 69 74 65 53 65 6c 65 63 74  for sqliteSelect
c6e0: 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  ()..** See the h
c6f0: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
c700: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
c710: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
c720: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
c730: 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69  tic int simpleMi
c740: 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20  nMaxQuery(Parse 
c750: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
c760: 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  *p, int eDest, i
c770: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70  nt iParm){.  Exp
c780: 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20  r *pExpr;.  int 
c790: 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iCol;.  Table *p
c7a0: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
c7b0: 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a  dx;.  int base;.
c7c0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
c7d0: 20 6f 70 65 6e 4f 70 3b 0a 20 20 69 6e 74 20 73   openOp;.  int s
c7e0: 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e  eekOp;.  int con
c7f0: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 65 4c  t;.  ExprList eL
c800: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
c810: 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73  prList_item eLis
c820: 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65  tItem;..  /* Che
c830: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
c840: 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
c850: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
c860: 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
c870: 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
c880: 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
c890: 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
c8a0: 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
c8b0: 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
c8c0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
c8d0: 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
c8e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
c8f0: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
c900: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
c910: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
c920: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c930: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
c940: 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
c950: 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
c960: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69    if( pExpr->pLi
c970: 73 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  st==0 || pExpr->
c980: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
c990: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
c9a0: 28 20 70 45 78 70 72 2d 3e 6e 46 75 6e 63 4e 61  ( pExpr->nFuncNa
c9b0: 6d 65 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30  me!=3 ) return 0
c9c0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ;.  if( sqliteSt
c9d0: 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
c9e0: 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d  ken.z,"min",3)==
c9f0: 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
ca00: 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d  = OP_Rewind;.  }
ca10: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 53  else if( sqliteS
ca20: 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74  trNICmp(pExpr->t
ca30: 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d  oken.z,"max",3)=
ca40: 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70  =0 ){.    seekOp
ca50: 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65   = OP_Last;.  }e
ca60: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
ca70: 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d  0;.  }.  pExpr =
ca80: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
ca90: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
caa0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
cab0: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
cac0: 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
cad0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
cae0: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
caf0: 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66  ].pTab;..  /* If
cb00: 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c   we get to here,
cb10: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75   it means the qu
cb20: 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f  ery is of the co
cb30: 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a  rrect form..  **
cb40: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
cb50: 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69  ure we have an i
cb60: 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49  ndex and make pI
cb70: 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  dx point to the.
cb80: 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
cb90: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
cba0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
cbb0: 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20  s on an INTEGER 
cbc0: 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79  PRIMARY.  ** key
cbd0: 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65   column, no inde
cbe0: 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  x is necessary s
cbf0: 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55  o set pIdx to NU
cc00: 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20  LL.  If no.  ** 
cc10: 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20  usable index is 
cc20: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e  found, return 0.
cc30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  .  */.  if( iCol
cc40: 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d  <0 ){.    pIdx =
cc50: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
cc60: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
cc70: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
cc80: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
cc90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cca0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20  Idx->nColumn>=1 
ccb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
ccc0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ccd0: 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  iCol ) break;.  
cce0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
ccf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
cd00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69    }..  /* Identi
cd10: 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
cd20: 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
cd30: 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
cd40: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
cd50: 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
cd60: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
cd70: 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
cd80: 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
cd90: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
cda0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
cdb0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
cdc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
cdd0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
cde0: 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
cdf0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
ce00: 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20  Parse, p->base, 
ce10: 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  p->pSrc, p->pELi
ce20: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
ce30: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
ce40: 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
ce50: 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
ce60: 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
ce70: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
ce80: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
ce90: 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
cea0: 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
ceb0: 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
cec0: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
ced0: 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
cee0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
cef0: 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
cf00: 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
cf10: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
cf20: 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
cf30: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 73    if( !pParse->s
cf40: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 26 26  chemaVerified &&
cf50: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
cf60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
cf70: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
cf80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cf90: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
cfa0: 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ie, pParse->db->
cfb0: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
cfc0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73  );.    pParse->s
cfd0: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20  chemaVerified = 
cfe0: 31 3b 0a 20 20 7d 0a 20 20 6f 70 65 6e 4f 70 20  1;.  }.  openOp 
cff0: 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f  = pTab->isTemp ?
d000: 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50   OP_OpenAux : OP
d010: 5f 4f 70 65 6e 3b 0a 20 20 62 61 73 65 20 3d 20  _Open;.  base = 
d020: 70 2d 3e 62 61 73 65 3b 0a 20 20 73 71 6c 69 74  p->base;.  sqlit
d030: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
d040: 65 6e 4f 70 2c 20 62 61 73 65 2c 20 70 54 61 62  enOp, base, pTab
d050: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  ->tnum);.  sqlit
d060: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d070: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
d080: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
d090: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20  if( pIdx==0 ){. 
d0a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d0b0: 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61  Op(v, seekOp, ba
d0c0: 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  se, 0);.  }else{
d0d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d0e0: 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20  ddOp(v, openOp, 
d0f0: 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e  base+1, pIdx->tn
d100: 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  um);.    sqliteV
d110: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d120: 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
d130: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
d140: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d150: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b  v, seekOp, base+
d160: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
d170: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d180: 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b  _IdxRecno, base+
d190: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
d1a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
d1b0: 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20  _Close, base+1, 
d1c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
d1d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
d1e0: 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veTo, base, 0);.
d1f0: 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
d200: 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
d210: 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
d220: 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
d230: 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
d240: 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
d250: 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
d260: 70 45 78 70 72 3b 0a 20 20 63 6f 6e 74 20 3d 20  pExpr;.  cont = 
d270: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
d280: 62 65 6c 28 76 29 3b 0a 20 20 73 65 6c 65 63 74  bel(v);.  select
d290: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
d2a0: 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20  , p, &eList, 0, 
d2b0: 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c  0, 0, -1, eDest,
d2c0: 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f   iParm, cont, co
d2d0: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
d2e0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d2f0: 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
d300: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d310: 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
d320: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
d330: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d340: 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
d350: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
d360: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
d370: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
d380: 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
d390: 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
d3a0: 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
d3b0: 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
d3c0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
d3d0: 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
d3e0: 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
d3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
d400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
d430: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
d440: 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
d450: 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
d460: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
d470: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
d480: 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
d490: 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
d4a0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
d4b0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
d4c0: 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
d4d0: 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
d4e0: 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69  ys of a table wi
d4f0: 74 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a  th cursor iParm.
d500: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
d510: 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
d520: 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
d530: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
d540: 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
d550: 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
d560: 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
d570: 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20 74 65  ults form the te
d580: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
d590: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
d5a0: 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
d5b0: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
d5c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d5d0: 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iParm.**.** This
d5e0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
d5f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
d600: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
d610: 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
d620: 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
d630: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
d640: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
d650: 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
d660: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
d670: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
d680: 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
d690: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
d6a0: 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
d6b0: 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
d6c0: 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
d6d0: 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   that..**.** The
d6e0: 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
d6f0: 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e  Tab, and *pParen
d700: 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20  tAgg fields are 
d710: 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69  filled in if thi
d720: 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61  s.** SELECT is a
d730: 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
d740: 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79   routine may try
d750: 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73   to combine this
d760: 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
d770: 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f  its parent to fo
d780: 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  rm a single flat
d790: 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64   query.  In so d
d7a0: 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a  oing, it might.*
d7b0: 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72  * change the par
d7c0: 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61  ent query from a
d7d0: 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74   non-aggregate t
d7e0: 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  o an aggregate q
d7f0: 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61  uery..** For tha
d800: 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50  t reason, the pP
d810: 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73  arentAgg flag is
d820: 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69   passed as a poi
d830: 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63  nter, so it.** c
d840: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  an be changed..*
d850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 65 6c 65  /.int sqliteSele
d860: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
d870: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
d880: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
d890: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
d8a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
d8b0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
d8c0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
d8d0: 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ed. */.  int eDe
d8e0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
d8f0: 2f 2a 20 4f 6e 65 20 6f 66 3a 20 53 52 54 5f 43  /* One of: SRT_C
d900: 61 6c 6c 62 61 63 6b 20 4d 65 6d 20 53 65 74 20  allback Mem Set 
d910: 55 6e 69 6f 6e 20 45 78 63 65 70 74 20 2a 2f 0a  Union Except */.
d920: 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
d930: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
d940: 20 72 65 73 75 6c 74 20 69 6e 20 74 68 69 73 20   result in this 
d950: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2c  memory location,
d960: 20 69 66 20 3e 3d 30 20 2a 2f 0a 20 20 53 65 6c   if >=0 */.  Sel
d970: 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
d980: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
d990: 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
d9a0: 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
d9b0: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
d9c0: 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
d9d0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
d9e0: 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
d9f0: 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
da00: 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20 20   *pParentAgg    
da10: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
da20: 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
da30: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
da40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
da50: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
da60: 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  fo;.  Vdbe *v;. 
da70: 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20   int isAgg = 0; 
da80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
da90: 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
daa0: 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
dab0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dac0: 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
dad0: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
dae0: 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
daf0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
db00: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
db10: 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
db20: 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
db30: 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
db40: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
db50: 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
db60: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
db70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
db80: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
db90: 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
dba0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
dbb0: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
dbc0: 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
dbd0: 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
dbe0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
dbf0: 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
dc00: 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
dc10: 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
dc20: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
dc30: 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
dc40: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
dc50: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
dc60: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
dc70: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
dc80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
dc90: 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
dca0: 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
dcb0: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b 20 20  */.  int base;  
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
dcd0: 69 72 73 74 20 63 75 72 73 6f 72 20 61 76 61 69  irst cursor avai
dce0: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f  lable for use */
dcf0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
dd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
dd10: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
dd20: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
dd30: 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  */..  if( sqlite
dd40: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c  _malloc_failed |
dd50: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
dd60: 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  | p==0 ) return 
dd70: 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
dd80: 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
dd90: 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
dda0: 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
ddb0: 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
ddc0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
ddd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
dde0: 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
ddf0: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
de00: 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  m);.  }..  /* Ma
de10: 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20  ke local copies 
de20: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
de30: 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  s for this query
de40: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73  ..  */.  pTabLis
de50: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
de60: 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
de70: 65 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  e;.  pOrderBy = 
de80: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
de90: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
dea0: 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
deb0: 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
dec0: 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
ded0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
dee0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 6c  /* Allocate a bl
def0: 6f 63 6b 20 6f 66 20 56 44 42 45 20 63 75 72 73  ock of VDBE curs
df00: 6f 72 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63  ors, one for eac
df10: 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
df20: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
df30: 20 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65   The WHERE proce
df40: 73 73 69 6e 67 20 72 65 71 75 69 72 65 73 20 74  ssing requires t
df50: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 73 20  hat the cursors 
df60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  for the tables i
df70: 6e 20 74 68 65 0a 20 20 2a 2a 20 46 52 4f 4d 20  n the.  ** FROM 
df80: 63 6c 61 75 73 65 20 62 65 20 63 6f 6e 73 65 63  clause be consec
df90: 75 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 62 61  utive..  */.  ba
dfa0: 73 65 20 3d 20 70 2d 3e 62 61 73 65 20 3d 20 70  se = p->base = p
dfb0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70  Parse->nTab;.  p
dfc0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 70  Parse->nTab += p
dfd0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
dfe0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
dff0: 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
e000: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
e010: 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
e020: 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
e030: 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
e040: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
e050: 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
e060: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
e070: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
e080: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
e090: 76 65 72 79 20 74 61 62 6c 65 20 69 6e 20 74 68  very table in th
e0a0: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
e0b0: 20 63 72 65 61 74 65 20 61 6e 20 61 70 70 72 6f   create an appro
e0c0: 70 72 69 61 74 65 0a 20 20 2a 2a 20 63 6f 6c 75  priate.  ** colu
e0d0: 6d 6e 6c 69 73 74 20 69 6e 20 70 45 4c 69 73 74  mnlist in pEList
e0e0: 20 69 66 20 74 68 65 72 65 20 69 73 6e 27 74 20   if there isn't 
e0f0: 6f 6e 65 20 61 6c 72 65 61 64 79 2e 20 20 28 54  one already.  (T
e100: 68 65 20 70 61 72 73 65 72 20 6c 65 61 76 65 73  he parser leaves
e110: 0a 20 20 2a 2a 20 61 20 4e 55 4c 4c 20 69 6e 20  .  ** a NULL in 
e120: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 69 66  the p->pEList if
e130: 20 74 68 65 20 53 51 4c 20 73 61 69 64 20 22 53   the SQL said "S
e140: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e  ELECT * FROM ...
e150: 22 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69  ").  */.  if( fi
e160: 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
e170: 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
e180: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
e190: 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d  ;.  }.  pWhere =
e1a0: 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45   p->pWhere;.  pE
e1b0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
e1c0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
e1d0: 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
e1e0: 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
e1f0: 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
e200: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
e210: 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
e220: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
e230: 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
e240: 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  /.  if( (eDest==
e250: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
e260: 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
e270: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
e280: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
e290: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
e2a0: 72 72 4d 73 67 2c 20 22 6f 6e 6c 79 20 61 20 73  rrMsg, "only a s
e2b0: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
e2c0: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
e2d0: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
e2e0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
e2f0: 78 70 72 65 73 73 69 6f 6e 22 2c 20 30 29 3b 0a  xpression", 0);.
e300: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
e310: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ++;.    goto sel
e320: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
e330: 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
e340: 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
e350: 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
e360: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  */.  switch( eDe
e370: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
e380: 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61  RT_Union:.    ca
e390: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20  se SRT_Except:. 
e3a0: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63     case SRT_Disc
e3b0: 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65  ard:.      pOrde
e3c0: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  rBy = 0;.      b
e3d0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
e3e0: 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t:.      break;.
e3f0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
e400: 73 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75  s point, we shou
e410: 6c 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65  ld have allocate
e420: 64 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72  d all the cursor
e430: 73 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e  s that we.  ** n
e440: 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75  eed to handle su
e450: 62 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70  bquerys and temp
e460: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a  orary tables.  .
e470: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76    **.  ** Resolv
e480: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
e490: 65 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61  es and do a sema
e4a0: 6e 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61  ntics check on a
e4b0: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
e4c0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
e4d0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
e4e0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
e4f0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
e500: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
e510: 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
e520: 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  0, pEList->a[i].
e530: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
e540: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
e550: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
e560: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
e570: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
e580: 5b 69 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69  [i].pExpr, 1, &i
e590: 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67  sAgg) ){.      g
e5a0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
e5b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e5c0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66  pWhere ){.    if
e5d0: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
e5e0: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62  lveIds(pParse, b
e5f0: 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  ase, pTabList, p
e600: 45 4c 69 73 74 2c 20 70 57 68 65 72 65 29 20 29  EList, pWhere) )
e610: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
e620: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
e630: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
e640: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
e650: 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Where, 0, 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 7d 0a 20 20 7d  t_end;.    }.  }
e680: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
e690: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
e6a0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
e6b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
e6c0: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
e6d0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
e6e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e6f0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
e700: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  E) ){.        in
e710: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
e720: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
e730: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
e740: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
e750: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
e760: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
e770: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Msg, .          
e780: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74       "ORDER BY t
e790: 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65  erms must not be
e7a0: 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e   non-integer con
e7b0: 73 74 61 6e 74 73 22 2c 20 30 29 3b 0a 20 20 20  stants", 0);.   
e7c0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
e7d0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
e7e0: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
e7f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
e800: 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
e810: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
e820: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  r ){.          c
e830: 68 61 72 20 7a 42 75 66 5b 32 30 30 30 5d 3b 0a  har zBuf[2000];.
e840: 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74            sprint
e850: 66 28 7a 42 75 66 2c 22 4f 52 44 45 52 20 42 59  f(zBuf,"ORDER BY
e860: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25   column number %
e870: 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  d out of range -
e880: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
e890: 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
e8a0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43  en 1 and %d", iC
e8b0: 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
e8c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
e8d0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
e8e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
e8f0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  zBuf, 0);.      
e900: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
e910: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ++;.          go
e920: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
e930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e940: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
e950: 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70  e(pE);.        p
e960: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
e970: 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
e980: 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  eExprDup(pEList-
e990: 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
e9a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e9b0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
e9c0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
e9d0: 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  , base, pTabList
e9e0: 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b  , pEList, pE) ){
e9f0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
ea00: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
ea10: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
ea20: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
ea30: 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30  se, pE, isAgg, 0
ea40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
ea50: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
ea60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ea70: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
ea80: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
ea90: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
eaa0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
eab0: 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42  pr *pE = pGroupB
eac0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
ead0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
eae0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
eaf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
eb00: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
eb10: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a  arse->zErrMsg, .
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52               "GR
eb30: 4f 55 50 20 42 59 20 65 78 70 72 65 73 73 69 6f  OUP BY expressio
eb40: 6e 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ns should not be
eb50: 20 63 6f 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a   constant", 0);.
eb60: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
eb70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
eb80: 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
eb90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
eba0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
ebb0: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
ebc0: 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
ebd0: 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
ebe0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
ebf0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
ec00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ec10: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
ec20: 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
ec30: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
ec40: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ec50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ec60: 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
ec70: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
ec80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ec90: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
eca0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61  rse->zErrMsg, "a
ecb0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
ecc0: 20 69 73 20 72 65 71 75 69 72 65 64 20 22 0a 20   is required ". 
ecd0: 20 20 20 20 20 20 20 20 22 62 65 66 6f 72 65 20          "before 
ece0: 48 41 56 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20  HAVING", 0);.   
ecf0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
ed00: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  +;.      goto se
ed10: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
ed20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
ed30: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
ed40: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
ed50: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61  ist, pEList, pHa
ed60: 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
ed70: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
ed80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
ed90: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
eda0: 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 69  arse, pHaving, i
edb0: 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
edc0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
edd0: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
ede0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
edf0: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
ee00: 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
ee10: 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74  ) function by it
ee20: 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65  self.  ** in the
ee30: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
ee40: 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69  /.  if( simpleMi
ee50: 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
ee60: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
ee70: 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  m) ){.    rc = 0
ee80: 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
ee90: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
eea0: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
eeb0: 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
eec0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
eed0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
eee0: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
eef0: 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64  ct_end;..  /* Id
ef00: 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
ef10: 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
ef20: 65 20 75 73 69 6e 67 20 69 6e 20 74 68 65 20 63  e using in the c
ef30: 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
ef40: 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
ef50: 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
ef60: 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20  t is going to a 
ef70: 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72  table or a memor
ef80: 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  y cell..  */.  i
ef90: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
efa0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
efb0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
efc0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
efd0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
efe0: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
eff0: 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 0a  Set the limiter.
f000: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c    */.  if( p->nL
f010: 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70  imit<=0 ){.    p
f020: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->nLimit = -1;. 
f030: 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20     p->nOffset = 
f040: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
f050: 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
f060: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
f070: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f080: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70  , OP_Integer, -p
f090: 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->nLimit, 0);.  
f0a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f0b0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
f0c0: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
f0d0: 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 69 4d 65 6d  p->nLimit = iMem
f0e0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66  ;.    if( p->nOf
f0f0: 66 73 65 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20  fset<=0 ){.     
f100: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b   p->nOffset = 0;
f110: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f120: 20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    iMem = pParse-
f130: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73  >nMem++;.      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 49 6e 74 65 67 65 72 2c 20 2d 70  , OP_Integer, -p
f160: 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  ->nOffset, 0);. 
f170: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f180: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
f190: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
f1a0: 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20       p->nOffset 
f1b0: 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  = iMem;.    }.  
f1c0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
f1d0: 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
f1e0: 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
f1f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
f200: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
f210: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
f220: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
f230: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
f240: 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ect==0 ) continu
f250: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  e;.    sqliteSel
f260: 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
f270: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
f280: 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ct, SRT_TempTabl
f290: 65 2c 20 62 61 73 65 2b 69 2c 0a 20 20 20 20 20  e, base+i,.     
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 69              p, i
f2b0: 2c 20 26 69 73 41 67 67 29 3b 0a 20 20 20 20 70  , &isAgg);.    p
f2c0: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
f2d0: 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  c;.    pWhere = 
f2e0: 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69  p->pWhere;.    i
f2f0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
f300: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
f310: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
f320: 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
f330: 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
f340: 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48  pGroupBy;.    pH
f350: 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
f360: 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e  ng;.    isDistin
f370: 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
f380: 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ct;.  }..  /* Ch
f390: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
f3a0: 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
f3b0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
f3c0: 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
f3d0: 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
f3e0: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
f3f0: 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
f400: 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
f410: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
f420: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
f430: 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26   && pParentAgg &
f440: 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53  &.      flattenS
f450: 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
f460: 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
f470: 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  ab, *pParentAgg,
f480: 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69   isAgg) ){.    i
f490: 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72  f( isAgg ) *pPar
f4a0: 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  entAgg = 1;.    
f4b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
f4c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
f4d0: 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
f4e0: 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
f4f0: 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
f500: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
f510: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
f520: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
f530: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f540: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
f550: 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 0);.  }..  
f560: 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
f570: 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
f580: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
f590: 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
f5a0: 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
f5b0: 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  se);.  if( isAgg
f5c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f5d0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20  pParse->nAgg==0 
f5e0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
f5f0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
f600: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
f610: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
f620: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
f630: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
f640: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
f650: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
f660: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
f670: 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75   }.    if( pGrou
f680: 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  pBy ){.      for
f690: 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
f6a0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f6b0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f6c0: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
f6d0: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
f6e0: 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
f6f0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
f700: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
f710: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
f720: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f730: 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71  f( pHaving && sq
f740: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
f750: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
f760: 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
f770: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
f780: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
f790: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
f7a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f7b0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
f7c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f7d0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  f( sqliteExprAna
f7e0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
f7f0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
f800: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
f810: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
f820: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f830: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f840: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73   }.  }..  /* Res
f850: 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  et the aggregato
f860: 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  r.  */.  if( isA
f870: 67 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  gg ){.    sqlite
f880: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f890: 41 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61  AggReset, 0, pPa
f8a0: 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20  rse->nAgg);.    
f8b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
f8c0: 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
f8d0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46       FuncDef *pF
f8e0: 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28  unc;.      if( (
f8f0: 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  pFunc = pParse->
f900: 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d  aAgg[i].pFunc)!=
f910: 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e  0 && pFunc->xFin
f920: 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
f930: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f940: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69  dOp(v, OP_AggIni
f950: 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
f960: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
f970: 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
f980: 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49  r*)pFunc, P3_POI
f990: 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NTER);.      }. 
f9a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
f9b0: 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
f9c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f9d0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
f9e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
f9f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fa00: 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
fa10: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
fa20: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
fa30: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
fa40: 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
fa50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
fa60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
fa70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
fa80: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
fa90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
faa0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
fab0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
fac0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d  .  /* Open a tem
fad0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
fae0: 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
faf0: 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
fb00: 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20   if( isDistinct 
fb10: 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  ){.    distinct 
fb20: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
fb30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
fb40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
fb50: 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20  Temp, distinct, 
fb60: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
fb70: 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
fb80: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
fb90: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
fba0: 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20  n.  */.  pWInfo 
fbb0: 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42 65 67  = sqliteWhereBeg
fbc0: 69 6e 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61  in(pParse, p->ba
fbd0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
fbe0: 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  here, 0, .      
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f        pGroupBy ?
fc10: 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b   0 : &pOrderBy);
fc20: 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30  .  if( pWInfo==0
fc30: 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
fc40: 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68  nd;..  /* Use th
fc50: 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
fc60: 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20   loop if we are 
fc70: 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68  not dealing with
fc80: 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73  .  ** aggregates
fc90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  .  */.  if( !isA
fca0: 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65  gg ){.    if( se
fcb0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
fcc0: 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
fcd0: 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
fce0: 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
fcf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fd00: 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
fd10: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
fd20: 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20  pWInfo->iBreak) 
fd30: 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
fd40: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
fd50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
fd60: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
fd70: 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68  h aggregates, th
fd80: 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69 61  en do the specia
fd90: 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a  l aggregate.  **
fda0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20   processing.  . 
fdb0: 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
fdc0: 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
fdd0: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a        int lbl1;.
fde0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
fdf0: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
fe00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
fe10: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
fe20: 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
fe30: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
fe40: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
fe50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fe60: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75  P_MakeKey, pGrou
fe70: 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  pBy->nExpr, 0);.
fe80: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
fe90: 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  ->db->file_forma
fea0: 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64  t>=4 ) sqliteAdd
feb0: 4b 65 79 54 79 70 65 28 76 2c 20 70 47 72 6f 75  KeyType(v, pGrou
fec0: 70 42 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31  pBy);.      lbl1
fed0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
fee0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
fef0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ff00: 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
ff10: 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20   0, lbl1);.     
ff20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
ff30: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
ff40: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
ff50: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
ff60: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
ff70: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
ff80: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 50 61  Code(pParse, pPa
ff90: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
ffa0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
ffb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ffc0: 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29  OP_AggSet, 0, i)
ffd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ffe0: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
fff0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b  eLabel(v, lbl1);
10000 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
10010 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
10020 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
10030 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
10040 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
10050 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69   !pParse->aAgg[i
10060 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
10070 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
10080 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
10090 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
100a0 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  rt( pE->op==TK_A
100b0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
100c0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69       if( pE->pLi
100d0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  st ){.        fo
100e0 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69  r(j=0; j<pE->pLi
100f0 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
10100 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10110 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
10120 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a  , pE->pList->a[j
10130 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
10140 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10150 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10160 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
10170 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
10180 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10190 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20   OP_AggFunc, 0, 
101a0 70 45 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e  pE->pList ? pE->
101b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
101c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
101d0 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
101e0 2e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20  .pFunc!=0 );.   
101f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
10200 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63  e->aAgg[i].pFunc
10210 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20  ->xStep!=0 );.  
10220 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
10230 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
10240 68 61 72 2a 29 70 50 61 72 73 65 2d 3e 61 41 67  har*)pParse->aAg
10250 67 5b 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50  g[i].pFunc, P3_P
10260 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20  OINTER);.    }. 
10270 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65   }..  /* End the
10280 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
10290 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  oop..  */.  sqli
102a0 74 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  teWhereEnd(pWInf
102b0 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  o);..  /* If we 
102c0 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  are processing a
102d0 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65  ggregates, we ne
102e0 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73  ed to set up a s
102f0 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20  econd loop.  ** 
10300 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
10310 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73  aggregate values
10320 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65   and process the
10330 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  m..  */.  if( is
10340 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  Agg ){.    int e
10350 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64  ndagg = sqliteVd
10360 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10370 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67 67      int startagg
10380 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20 3d  ;.    startagg =
10390 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
103a0 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20  (v, OP_AggNext, 
103b0 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20  0, endagg);.    
103c0 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
103d0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76   1;.    if( pHav
103e0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
103f0 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70  iteExprIfFalse(p
10400 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
10410 73 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20  startagg, 1);.  
10420 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65    }.    if( sele
10430 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
10440 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
10450 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
10460 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a  istinct, eDest,.
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74      iParm, start
10490 61 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a  agg, endagg) ){.
104a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
104b0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
104c0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
104d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
104e0 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73  startagg);.    s
104f0 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
10500 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29  Label(v, endagg)
10510 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
10520 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
10530 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  , 0, 0);.    pPa
10540 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b  rse->useAgg = 0;
10550 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
10560 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
10570 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
10580 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
10590 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
105a0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
105b0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
105c0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
105d0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
105e0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
105f0 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c  rtTail(p, v, pEL
10600 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
10610 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a  t, iParm);.  }..
10620 0a 20 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75  .  /* Issue a nu
10630 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  ll callback if t
10640 68 61 74 20 69 73 20 77 68 61 74 20 74 68 65 20  hat is what the 
10650 75 73 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f  user wants..  */
10660 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
10670 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10680 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29  TE_NullCallback)
10690 21 3d 30 20 26 26 20 65 44 65 73 74 3d 3d 53 52  !=0 && eDest==SR
106a0 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
106b0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
106c0 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c  p(v, OP_NullCall
106d0 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  back, pEList->nE
106e0 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  xpr, 0);.  }..  
106f0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
10700 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
10710 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
10720 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
10730 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
10740 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
10750 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
10760 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
10770 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
10780 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
10790 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
107a0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
107b0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
107c0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
107d0 65 63 74 5f 65 6e 64 3a 0a 20 20 70 50 61 72 73  ect_end:.  pPars
107e0 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a  e->nTab = base;.
107f0 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74    sqliteAggregat
10800 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73  eInfoReset(pPars
10810 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
10820 0a 7d 0a                                         .}.