/ Hex Artifact Content
Login

Artifact 1c7c0b42c27b9d115c955023074a292197a17b3b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 30 33  select.c,v 1.103
0200: 20 32 30 30 32 2f 30 37 2f 30 35 20 32 31 3a 34   2002/07/05 21:4
0210: 32 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a 2a  2:37 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0240: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53  Allocate a new S
0250: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0260: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
0270: 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20  nter to that.** 
0280: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65  structure..*/.Se
0290: 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65  lect *sqliteSele
02a0: 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69 73  ctNew(.  ExprLis
02b0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
02c0: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
02d0: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
02e0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
02f0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0300: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0310: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0320: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0330: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0340: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0350: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0360: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0370: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0380: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0390: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
03a0: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
03b0: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
03c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
03d0: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
03e0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
03f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  e */.  int isDis
0400: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  tinct,       /* 
0410: 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
0420: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0430: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
0440: 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20   nLimit,        
0450: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75     /* LIMIT valu
0460: 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74  e.  -1 means not
0470: 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   used */.  int n
0480: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
0490: 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65   /* OFFSET value
04a0: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74 20  .  -1 means not 
04b0: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
04c0: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  ect *pNew;.  pNe
04d0: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
04e0: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
04f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
0500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78   ){.    sqliteEx
0510: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
0520: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
0530: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 53  SrcListDelete(pS
0540: 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  rc);.    sqliteE
0550: 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72 65  xprDelete(pWhere
0560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  );.    sqliteExp
0570: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72 6f  rListDelete(pGro
0580: 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
0590: 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61 76  eExprDelete(pHav
05a0: 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
05b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
05c0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c 73  OrderBy);.  }els
05d0: 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c  e{.    pNew->pEL
05e0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
05f0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70    pNew->pSrc = p
0600: 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  Src;.    pNew->p
0610: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
0620: 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70      pNew->pGroup
0630: 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
0640: 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67     pNew->pHaving
0650: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20   = pHaving;.    
0660: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
0670: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
0680: 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  New->isDistinct 
0690: 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  = isDistinct;.  
06a0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
06b0: 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65 77  SELECT;.    pNew
06c0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d 69  ->nLimit = nLimi
06d0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 66  t;.    pNew->nOf
06e0: 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b 0a  fset = nOffset;.
06f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0700: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  w;.}../*.** Give
0710: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
0720: 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20  iers preceeding 
0730: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0740: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0750: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0760: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0770: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0780: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0790: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
07a0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
07b0: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
07c0: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
07d0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  R.**     JT_OUTE
07e0: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
07f0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0800: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0810: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0820: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0830: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0840: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0850: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0860: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0870: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0880: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0890: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
08a0: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
08b0: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
08c0: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
08d0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
08e0: 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 50  sqliteJoinType(P
08f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0900: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0910: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0920: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0930: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0940: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0950: 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  p;.  static stru
0960: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
0970: 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20  har *zKeyword;. 
0980: 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20     int nChar;.  
0990: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d 20    int code;.  } 
09a0: 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20  keywords[] = {. 
09b0: 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20     { "natural", 
09c0: 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c  7, JT_NATURAL },
09d0: 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20  .    { "left",  
09e0: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
09f0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0a00: 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f  right",   5, JT_
0a10: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
0a20: 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20  ,.    { "full", 
0a30: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
0a40: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0a50: 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22  },.    { "outer"
0a60: 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  ,   5, JT_OUTER 
0a70: 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22  },.    { "inner"
0a80: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0a90: 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22  },.    { "cross"
0aa0: 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20  ,   5, JT_INNER 
0ab0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
0ac0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
0ad0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
0ae0: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
0af0: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
0b00: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
0b10: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
0b20: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
0b30: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66  or(j=0; j<sizeof
0b40: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0b50: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20  f(keywords[0]); 
0b60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
0b70: 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a  p->n==keywords[j
0b80: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
0b90: 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e     && sqliteStrN
0ba0: 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f  ICmp(p->z, keywo
0bb0: 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c  rds[j].zKeyword,
0bc0: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
0bd0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0be0: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64   keywords[j].cod
0bf0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
0c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0c10: 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f      if( j>=sizeo
0c20: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0c30: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20  of(keywords[0]) 
0c40: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
0c50: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
0c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0c70: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
0c80: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
0c90: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
0ca0: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
0cb0: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
0cc0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
0cd0: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
0ce0: 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64 75   static Token du
0cf0: 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a  mmy = { 0, 0 };.
0d00: 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20 3d      char *zSp1 =
0d10: 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22 20   " ", *zSp2 = " 
0d20: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0d30: 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79 3b   ){ pB = &dummy;
0d40: 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20 20   zSp1 = 0; }.   
0d50: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70 43   if( pC==0 ){ pC
0d60: 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32 20   = &dummy; zSp2 
0d70: 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  = 0; }.    sqlit
0d80: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
0d90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
0da0: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0db0: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0dc0: 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70 41   ", 0,.       pA
0dd0: 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70 31  ->z, pA->n, zSp1
0de0: 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d 3e  , 1, pB->z, pB->
0df0: 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d 3e  n, zSp2, 1, pC->
0e00: 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20 20  z, pC->n, 0);.  
0e10: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0e20: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0e30: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
0e40: 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20  se if( jointype 
0e50: 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20  & JT_RIGHT ){.  
0e60: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
0e70: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
0e80: 73 67 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  sg, .      "RIGH
0e90: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
0ea0: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
0eb0: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
0ec0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
0ed0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
0ee0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
0ef0: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
0f00: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
0f10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
0f20: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
0f30: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
0f40: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
0f50: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
0f60: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
0f70: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
0f80: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
0f90: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
0fa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
0fb0: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
0fc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
0fd0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
0fe0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
0ff0: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(pTab->aCol[i].
1000: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
1010: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1020: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1030: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d  /*.** Add a term
1040: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78   to the WHERE ex
1050: 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45  pression in *ppE
1060: 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65  xpr that require
1070: 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f  s the.** zCol co
1080: 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c  lumn to be equal
1090: 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c   in the two tabl
10a0: 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61  es pTab1 and pTa
10b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
10c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
10d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10e0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
10f0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1100: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
1110: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
1120: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
1130: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
1140: 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20  *pTab2,      /* 
1150: 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  Second table */.
1160: 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20    Expr **ppExpr 
1170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1180: 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  d the equality t
1190: 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72  erm to this expr
11a0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54  ession */.){.  T
11b0: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78  oken dummy;.  Ex
11c0: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
11d0: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
11e0: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
11f0: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1200: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f  .  dummy.z = zCo
1210: 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73  l;.  dummy.n = s
1220: 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 70  trlen(zCol);.  p
1230: 45 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72  E1a = sqliteExpr
1240: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1250: 75 6d 6d 79 29 3b 0a 20 20 70 45 31 61 2d 3e 73  ummy);.  pE1a->s
1260: 74 61 74 69 63 54 6f 6b 65 6e 20 3d 20 31 3b 0a  taticToken = 1;.
1270: 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65 45    pE2a = sqliteE
1280: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1290: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61   &dummy);.  pE2a
12a0: 2d 3e 73 74 61 74 69 63 54 6f 6b 65 6e 20 3d 20  ->staticToken = 
12b0: 31 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70  1;.  dummy.z = p
12c0: 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64  Tab1->zName;.  d
12d0: 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  ummy.n = strlen(
12e0: 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62  dummy.z);.  pE1b
12f0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
1300: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
1310: 79 29 3b 0a 20 20 70 45 31 62 2d 3e 73 74 61 74  y);.  pE1b->stat
1320: 69 63 54 6f 6b 65 6e 20 3d 20 31 3b 0a 20 20 64  icToken = 1;.  d
1330: 75 6d 6d 79 2e 7a 20 3d 20 70 54 61 62 32 2d 3e  ummy.z = pTab2->
1340: 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d 6d 79 2e 6e  zName;.  dummy.n
1350: 20 3d 20 73 74 72 6c 65 6e 28 64 75 6d 6d 79 2e   = strlen(dummy.
1360: 7a 29 3b 0a 20 20 70 45 32 62 20 3d 20 73 71 6c  z);.  pE2b = sql
1370: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
1380: 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  , 0, &dummy);.  
1390: 70 45 32 62 2d 3e 73 74 61 74 69 63 54 6f 6b 65  pE2b->staticToke
13a0: 6e 20 3d 20 31 3b 0a 20 20 70 45 31 63 20 3d 20  n = 1;.  pE1c = 
13b0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f  sqliteExpr(TK_DO
13c0: 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30  T, pE1b, pE1a, 0
13d0: 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69  );.  pE2c = sqli
13e0: 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  teExpr(TK_DOT, p
13f0: 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20  E2b, pE2a, 0);. 
1400: 20 70 45 20 3d 20 73 71 6c 69 74 65 45 78 70 72   pE = sqliteExpr
1410: 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45  (TK_EQ, pE1c, pE
1420: 32 63 2c 20 30 29 3b 0a 20 20 70 45 2d 3e 69 73  2c, 0);.  pE->is
1430: 4a 6f 69 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20  JoinExpr = 1;.  
1440: 69 66 28 20 2a 70 70 45 78 70 72 20 29 7b 0a 20  if( *ppExpr ){. 
1450: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
1460: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
1470: 2a 70 70 45 78 70 72 2c 20 70 45 2c 20 30 29 3b  *ppExpr, pE, 0);
1480: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
1490: 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d 0a  pExpr = pE;.  }.
14a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
14b0: 20 45 78 70 72 2e 69 73 4a 6f 69 6e 45 78 70 72   Expr.isJoinExpr
14c0: 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 74 65 72   flag on all ter
14d0: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
14e0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
14f0: 2a 20 54 68 65 20 45 78 70 72 2e 69 73 4a 6f 69  * The Expr.isJoi
1500: 6e 45 78 70 72 20 66 6c 61 67 20 69 73 20 75 73  nExpr flag is us
1510: 65 64 20 61 74 20 6f 6e 20 74 65 72 6d 73 20 6f  ed at on terms o
1520: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1530: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
1540: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
1550: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
1560: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
1570: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
1580: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
1590: 6e 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  n and not a part
15a0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
15b0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
15c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
15d0: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
15e0: 70 72 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  pr *p){.  while(
15f0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 4a   p ){.    p->isJ
1600: 6f 69 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 20  oinExpr = 1;.   
1610: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
1620: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d 20  pLeft);.    p = 
1630: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1640: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1650: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1660: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1670: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1680: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1690: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
16a0: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
16b0: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
16c0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
16d0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
16e0: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
16f0: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
1700: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1710: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1720: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
1730: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
1740: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
1750: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1760: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72  eProcessJoin(Par
1770: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1780: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
1790: 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 69  t *pSrc;.  int i
17a0: 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  , j;.  pSrc = p-
17b0: 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
17c0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
17d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
17e0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
17f0: 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d 3e  *pTerm = &pSrc->
1800: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
1810: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1820: 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e 61  Other = &pSrc->a
1830: 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [i+1];..    if( 
1840: 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20 7c  pTerm->pTab==0 |
1850: 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d 3d  | pOther->pTab==
1860: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
1870: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
1880: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
1890: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
18a0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
18b0: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
18c0: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
18d0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
18e0: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
18f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65    */.    if( pTe
1900: 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  rm->jointype & J
1910: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
1920: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
1930: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
1940: 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e 70  >pOn || pTerm->p
1950: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  Using ){.       
1960: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1970: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
1980: 67 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  g, "a NATURAL jo
1990: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
19a0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
19b0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
19c0: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
19d0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
19e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
19f0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1a00: 20 20 70 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e    pTab = pTerm->
1a10: 70 54 61 62 3b 0a 20 20 20 20 20 20 66 6f 72 28  pTab;.      for(
1a20: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1a30: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
1a40: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
1a50: 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70  (pOther->pTab, p
1a60: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1a70: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1a80: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
1a90: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  (pTab->aCol[j].z
1aa0: 4e 61 6d 65 2c 20 70 54 61 62 2c 20 70 4f 74 68  Name, pTab, pOth
1ab0: 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57  er->pTab, &p->pW
1ac0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
1ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ae0: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
1af0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
1b00: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
1b10: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
1b20: 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  /.    if( pTerm-
1b30: 3e 70 4f 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70  >pOn && pTerm->p
1b40: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
1b50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
1b60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
1b70: 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f   "cannot have bo
1b80: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
1b90: 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73  ".        "claus
1ba0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
1bb0: 6f 69 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  oin", 0);.      
1bc0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
1bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1be0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
1bf0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
1c00: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1c10: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
1c20: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
1c30: 20 2a 2a 20 61 6e 64 20 41 4e 44 20 6f 70 65 72   ** and AND oper
1c40: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
1c50: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 4f 6e 20   if( pTerm->pOn 
1c60: 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
1c70: 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 4f 6e 29  Expr(pTerm->pOn)
1c80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
1c90: 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Where==0 ){.    
1ca0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
1cb0: 70 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20 20 20 20  pTerm->pOn;.    
1cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cd0: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
1ce0: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
1cf0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 54 65 72 6d  p->pWhere, pTerm
1d00: 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ->pOn, 0);.     
1d10: 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e   }.      pTerm->
1d20: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
1d30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
1d40: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
1d50: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
1d60: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
1d70: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
1d80: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
1d90: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
1da0: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
1db0: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
1dc0: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
1dd0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
1de0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
1df0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
1e00: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
1e10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
1e20: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
1e30: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
1e40: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
1e50: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
1e60: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
1e70: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
1e80: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
1e90: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1ea0: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
1eb0: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
1ec0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
1ed0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
1ee0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  IdList *pList;. 
1ef0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1f00: 20 20 61 73 73 65 72 74 28 20 69 3c 70 53 72 63    assert( i<pSrc
1f10: 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20 20 20 20  ->nSrc-1 );.    
1f20: 20 20 70 4c 69 73 74 20 3d 20 70 54 65 72 6d 2d    pList = pTerm-
1f30: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
1f40: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
1f50: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
1f60: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
1f70: 64 65 78 28 70 54 65 72 6d 2d 3e 70 54 61 62 2c  dex(pTerm->pTab,
1f80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
1f90: 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20 20 20 20  me)<0 ||.       
1fa0: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
1fb0: 28 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70  (pOther->pTab, p
1fc0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
1fd0: 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
1fe0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1ff0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
2000: 67 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  g, "cannot join 
2010: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 22 2c 0a  using column ",.
2020: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 69 73              pLis
2030: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 22  t->a[j].zName, "
2040: 20 2d 20 63 6f 6c 75 6d 6e 20 6e 6f 74 20 70 72   - column not pr
2050: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
2060: 62 6c 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 20  bles", 0);.     
2070: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
2080: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  r++;.          r
2090: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
20a0: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68   }.        addWh
20b0: 65 72 65 54 65 72 6d 28 70 4c 69 73 74 2d 3e 61  ereTerm(pList->a
20c0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 65 72 6d  [j].zName, pTerm
20d0: 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65 72 2d 3e  ->pTab, pOther->
20e0: 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65 72 65  pTab, &p->pWhere
20f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2100: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2120: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
2130: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
2140: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
2150: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
2160: 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65  d sqliteSelectDe
2170: 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b  lete(Select *p){
2180: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2190: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78  turn;.  sqliteEx
21a0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
21b0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
21c0: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
21d0: 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74  ->pSrc);.  sqlit
21e0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  eExprDelete(p->p
21f0: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
2200: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2210: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73  ->pGroupBy);.  s
2220: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
2230: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
2240: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
2250: 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ete(p->pOrderBy)
2260: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
2270: 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
2280: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2290: 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73  p->zSelect);.  s
22a0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
22b0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
22c0: 65 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  e aggregate info
22d0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
22e0: 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65   parse structure
22f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2300: 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
2310: 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65 20  InfoReset(Parse 
2320: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
2330: 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61  teFree(pParse->a
2340: 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Agg);.  pParse->
2350: 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  aAgg = 0;.  pPar
2360: 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20  se->nAgg = 0;.  
2370: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d  pParse->useAgg =
2380: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
2390: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
23a0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
23b0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
23c0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
23d0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
23e0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
23f0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
2400: 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  orter(Parse *pPa
2410: 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78  rse, Vdbe *v, Ex
2420: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2430: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f 72 74  ){.  char *zSort
2440: 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Order;.  int i;.
2450: 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20 73    zSortOrder = s
2460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f 72  qliteMalloc( pOr
2470: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
2480: 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72 74 4f   );.  if( zSortO
2490: 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rder==0 ) return
24a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
24b0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
24c0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 72  i++){.    int or
24d0: 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  der = pOrderBy->
24e0: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
24f0: 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20      int type;.  
2500: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 66 28    int c;.    if(
2510: 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54 45   (order & SQLITE
2520: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53  _SO_TYPEMASK)==S
2530: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b  QLITE_SO_TEXT ){
2540: 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51  .      type = SQ
2550: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
2560: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 72 64    }else if( (ord
2570: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
2580: 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  YPEMASK)==SQLITE
2590: 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20  _SO_NUM ){.     
25a0: 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53   type = SQLITE_S
25b0: 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  O_NUM;.    }else
25c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
25d0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 33 20  >file_format>=3 
25e0: 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20  ){.      type = 
25f0: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
2600: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2610: 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  xpr);.    }else{
2620: 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53 51  .      type = SQ
2630: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
2640: 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72 64 65   }.    if( (orde
2650: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 49  r & SQLITE_SO_DI
2660: 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53  RMASK)==SQLITE_S
2670: 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 63  O_ASC ){.      c
2680: 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f   = type==SQLITE_
2690: 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20 3a 20  SO_TEXT ? 'A' : 
26a0: 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  '+';.    }else{.
26b0: 20 20 20 20 20 20 63 20 3d 20 74 79 70 65 3d 3d        c = type==
26c0: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f  SQLITE_SO_TEXT ?
26d0: 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20   'D' : '-';.    
26e0: 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72  }.    zSortOrder
26f0: 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c  [i] = c;.    sql
2700: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
2710: 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
2720: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  i].pExpr);.  }. 
2730: 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64   zSortOrder[pOrd
2740: 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30  erBy->nExpr] = 0
2750: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
2760: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61  dOp(v, OP_SortMa
2770: 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d  keKey, pOrderBy-
2780: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71  >nExpr, 0);.  sq
2790: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
27a0: 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f 72 64  (v, -1, zSortOrd
27b0: 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f 72 74  er, strlen(zSort
27c0: 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c 69 74  Order));.  sqlit
27d0: 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64 65 72  eFree(zSortOrder
27e0: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  );.  sqliteVdbeA
27f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50  ddOp(v, OP_SortP
2800: 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  ut, 0, 0);.}../*
2810: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2820: 20 61 64 64 73 20 61 20 50 33 20 61 72 67 75 6d   adds a P3 argum
2830: 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ent to the last 
2840: 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61 74  VDBE opcode that
2850: 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64   was.** inserted
2860: 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d 65 6e  . The P3 argumen
2870: 74 20 61 64 64 65 64 20 69 73 20 61 20 73 74 72  t added is a str
2880: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
2890: 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b 65   the .** OP_Make
28a0: 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49 64  Key or OP_MakeId
28b0: 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20 54  xKey opcodes.  T
28c0: 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73  he string consis
28d0: 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74  ts of.** charact
28e0: 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20 64  ers 't' or 'n' d
28f0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
2900: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 76  her or not the v
2910: 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64 73  arious.** fields
2920: 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20 62   of the key to b
2930: 65 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f 75  e generated shou
2940: 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ld be treated as
2950: 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20 61   numeric.** or a
2960: 73 20 74 65 78 74 2e 20 20 53 65 65 20 74 68 65  s text.  See the
2970: 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64 20   OP_MakeKey and 
2980: 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70  OP_MakeIdxKey op
2990: 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74  code.** document
29a0: 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ation for additi
29b0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
29c0: 20 61 62 6f 75 74 20 74 68 65 20 50 33 20 73 74   about the P3 st
29d0: 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c 73  ring..** See als
29e0: 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 49  o the sqliteAddI
29f0: 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74  dxKeyType() rout
2a00: 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
2a10: 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 56 64  iteAddKeyType(Vd
2a20: 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74 20  be *v, ExprList 
2a30: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  *pEList){.  int 
2a40: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74  nColumn = pEList
2a50: 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61 72 20  ->nExpr;.  char 
2a60: 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d  *zType = sqliteM
2a70: 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b 31  alloc( nColumn+1
2a80: 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   );.  int i;.  i
2a90: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65  f( zType==0 ) re
2aa0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
2ab0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
2ac0: 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d  {.    zType[i] =
2ad0: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
2ae0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
2af0: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  pr)==SQLITE_SO_N
2b00: 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27 3b 0a  UM ? 'n' : 't';.
2b10: 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d 20 3d    }.  zType[i] =
2b20: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
2b30: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
2b40: 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  zType, nColumn);
2b50: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
2b60: 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ype);.}../*.** T
2b70: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
2b80: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
2b90: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
2ba0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
2bb0: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
2bc0: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
2bd0: 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20  and nColumn are 
2be0: 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20  both zero, then 
2bf0: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
2c00: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
2c10: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
2c20: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
2c30: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
2c40: 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20  If nColumn>0.** 
2c50: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
2c60: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
2c70: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
2c80: 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74  ed only to get t
2c90: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20  he.** datatypes 
2ca0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
2cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2cc0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
2cd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cf0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2d00: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d20: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
2d30: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
2d40: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
2d50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
2d60: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2d70: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
2d80: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
2d90: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
2da0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
2db0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
2dc0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
2dd0: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
2df0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
2e00: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
2e10: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2e20: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
2e30: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
2e40: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
2e50: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
2e60: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
2e70: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
2e80: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
2e90: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
2ea0: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
2eb0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
2ec0: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
2ed0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
2ee0: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
2ef0: 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65      /* An argume
2f00: 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73  nt to the dispos
2f10: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
2f20: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
2f30: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2f40: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
2f50: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
2f60: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
2f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
2f80: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
2f90: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
2fa0: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
2fb0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2fc0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2fd0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
2fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
2ff0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
3000: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
3010: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
3020: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
3030: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
3040: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
3050: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
3060: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
3070: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
3080: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
3090: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66  .    if( p->nOff
30a0: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  set>0 ){.      i
30b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
30c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
30d0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
30e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
30f0: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66  MemIncr, p->nOff
3100: 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  set, addr+2);.  
3110: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3120: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3130: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
3140: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
3150: 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  nLimit>=0 ){.   
3160: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3170: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
3180: 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 69 42 72  , p->nLimit, iBr
3190: 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  eak);.    }.  }.
31a0: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
31b0: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
31c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ..  */.  if( nCo
31d0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
31e0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
31f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
3200: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3210: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
3220: 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, i);.    }.  
3230: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75  }else{.    nColu
3240: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
3250: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
3260: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
3270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
3280: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
3290: 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
32a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
32b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32c0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
32d0: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
32e0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
32f0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
3300: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
3310: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
3320: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
3330: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
3340: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
3350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74  .  */.  if( dist
3360: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
3370: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
3380: 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c  pr>0 ){.#if NULL
3390: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
33a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
33b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  ddOp(v, OP_IsNul
33c0: 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l, -pEList->nExp
33d0: 72 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72  r, sqliteVdbeCur
33e0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
33f0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
3400: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3410: 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74  _MakeKey, pEList
3420: 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  ->nExpr, 1);.   
3430: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
3440: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 33 20  >file_format>=3 
3450: 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79  ) sqliteAddKeyTy
3460: 70 65 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a 20  pe(v, pEList);. 
3470: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3480: 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63  Op(v, OP_Distinc
3490: 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c  t, distinct, sql
34a0: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
34b0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71  dr(v)+3);.    sq
34c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
34d0: 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d   OP_Pop, pEList-
34e0: 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20  >nExpr+1, 0);.  
34f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3500: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3510: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
3520: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3530: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
3540: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3550: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3560: 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69  PutStrKey, disti
3570: 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  nct, 0);.  }..  
3580: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
3590: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
35a0: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
35b0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
35c0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
35d0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
35e0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
35f0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
3600: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
3610: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3620: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3630: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
3640: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
3650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3660: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
3670: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
3680: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3690: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
36a0: 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  Key, iParm, 0);.
36b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   }..    /* Store
36d0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
36e0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
36f0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
3700: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
3710: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
3720: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
3730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3740: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3750: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
3760: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3770: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3780: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3790: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
37a0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
37b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
37d0: 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c  NewRecno, iParm,
37e0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
37f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3800: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
3810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3820: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3830: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
3840: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
3850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3860: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
3870: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
3880: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
3890: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
38a0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
38b0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
38c0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
38d0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
38e0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
38f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
3900: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
3910: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
3920: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
3930: 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
3940: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3950: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3960: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3970: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3980: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3990: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
39a0: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
39b0: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
39c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
39d0: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
39e0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
39f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
3a00: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
3a10: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
3a20: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
3a30: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
3a40: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
3a50: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
3a60: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
3a70: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
3a80: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
3a90: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
3aa0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
3ab0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
3ac0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
3ad0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c   {.      int lbl
3ae0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
3af0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
3b00: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
3b10: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
3b20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3b30: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20 6c  OP_IsNull, -1, l
3b40: 62 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  bl);.      if( p
3b50: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
3b60: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
3b70: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
3b80: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
3b90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3ba0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3bb0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
3bc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3bd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3be0: 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d  PutStrKey, iParm
3bf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3c00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
3c10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
3c20: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
3c30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
3c40: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
3c50: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
3c60: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
3c70: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
3c80: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
3c90: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
3ca0: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
3cb0: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
3cc0: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
3cd0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
3ce0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3cf0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
3d00: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
3d10: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
3d20: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3d30: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3d40: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3d50: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3d60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3d70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3d80: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
3d90: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 1);.        s
3da0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3db0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
3dc0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  reak);.      }. 
3dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3de0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  }..    /* Send t
3df0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
3e00: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
3e10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3e20: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a  e SRT_Callback:.
3e30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72      case SRT_Sor
3e40: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ter: {.      if(
3e50: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
3e60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3e70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d  ddOp(v, OP_SortM
3e80: 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c  akeRec, nColumn,
3e90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73   0);.        pus
3ea0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3eb0: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3ec0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3ed0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
3ee0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
3ef0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ck );.        sq
3f00: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f10: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43   OP_Callback, nC
3f20: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
3f30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3f40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3f50: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
3f60: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
3f70: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
3f80: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
3f90: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
3fa0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
3fb0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
3fc0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
3fd0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
3fe0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
3ff0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
4000: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
4010: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
4020: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
4030: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4040: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4050: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4060: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4070: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4080: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4090: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
40a0: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
40b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
40c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
40d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
40e0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
40f0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
4100: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
4110: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
4120: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
4130: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
4140: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
4150: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4160: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4170: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4180: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4190: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
41a0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
41b0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
41c0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
41d0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
41e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
41f0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
4200: 28 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  (.  Select *p,  
4210: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
4220: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
4230: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
4240: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
4250: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
4260: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
4270: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  umn,     /* Numb
4280: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
4290: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65   data */.  int e
42a0: 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57  Dest,       /* W
42b0: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
42c0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
42d0: 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20    int iParm     
42e0: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70     /* Optional p
42f0: 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61  arameter associa
4300: 74 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a  ted with eDest *
4310: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d  /.){.  int end =
4320: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
4330: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
4340: 64 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  ddr;.  if( eDest
4350: 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72  ==SRT_Sorter ) r
4360: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56  eturn;.  sqliteV
4370: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4380: 6f 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64  ort, 0, 0);.  ad
4390: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
43a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e  ddOp(v, OP_SortN
43b0: 65 78 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20  ext, 0, end);.  
43c0: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
43d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
43e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
43f0: 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65  mIncr, p->nOffse
4400: 74 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20  t, addr+4);.    
4410: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4420: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
4430: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
4440: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
4450: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  , 0, addr);.  }.
4460: 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e    if( p->nLimit>
4470: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4490: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4c 69 6d  MemIncr, p->nLim
44a0: 69 74 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20  it, end);.  }.  
44b0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
44c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
44d0: 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20  llback: {.      
44e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
44f0: 76 2c 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61  v, OP_SortCallba
4500: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4510: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4520: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
4530: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4540: 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20   SRT_TempTable: 
4550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
4560: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4570: 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30  wRecno, iParm, 0
4580: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
45a0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
45b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
45c0: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
45d0: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
45e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
45f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
4600: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
4610: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
4620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
4640: 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56  ull, -1, sqliteV
4650: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4660: 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+3);.      sqli
4670: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4680: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
4690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
46a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
46b0: 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30  StrKey, iParm, 0
46c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
46d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
46e0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
46f0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4700: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
4710: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4720: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
4730: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 1);.      sql
4740: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4750: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 29  OP_Goto, 0, end)
4760: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4770: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
4780: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
4790: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
47a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
47b0: 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  }.  sqliteVdbeAd
47c0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
47d0: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
47e0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
47f0: 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20 73 71  el(v, end);.  sq
4800: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4810: 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30   OP_SortReset, 0
4820: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  , 0);.}../*.** G
4830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4840: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
4850: 56 44 42 45 20 68 6f 77 20 6d 61 6e 79 20 63 6f  VDBE how many co
4860: 6c 75 6d 6e 73 20 74 68 65 72 65 0a 2a 2a 20 61  lumns there.** a
4870: 72 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  re in the result
4880: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 66 6f   and the name fo
4890: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 20 20  r each column.  
48a0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
48b0: 0a 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 70  .** is used to p
48c0: 72 6f 76 69 64 65 20 22 61 72 67 63 22 20 61 6e  rovide "argc" an
48d0: 64 20 22 61 7a 43 6f 6c 5b 5d 22 20 76 61 6c 75  d "azCol[]" valu
48e0: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
48f0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
4900: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
4910: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
4920: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4930: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
4940: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
4950: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45           /* VDBE
4960: 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
4970: 6e 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65  nding to first e
4980: 6e 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74  ntry in pTabList
4990: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
49a0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
49b0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
49c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
49d0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
49e0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
49f0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
4a00: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4a10: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
4a20: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
4a30: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
4a40: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  || v==0 || sqlit
4a50: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
4a60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
4a70: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
4a80: 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  = 1;.  sqliteVdb
4a90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
4aa0: 75 6d 6e 43 6f 75 6e 74 2c 20 70 45 4c 69 73 74  umnCount, pEList
4ab0: 2d 3e 6e 45 78 70 72 2a 32 2b 31 2c 20 30 29 3b  ->nExpr*2+1, 0);
4ac0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
4ad0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
4ae0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
4af0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20      char *zType 
4b00: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 68 6f  = 0;.    int sho
4b10: 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  wFullNames;.    
4b20: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
4b30: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
4b40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
4b50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
4b60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4b70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4b80: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b  lumnName, i, 0);
4b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4ba0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
4bb0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
4bc0: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
4bd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
4be0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
4bf0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
4c00: 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ( p==0 ) continu
4c10: 65 3b 0a 20 20 20 20 73 68 6f 77 46 75 6c 6c 4e  e;.    showFullN
4c20: 61 6d 65 73 20 3d 20 28 70 50 61 72 73 65 2d 3e  ames = (pParse->
4c30: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
4c40: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
4c50: 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  !=0;.    if( p->
4c60: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
4c70: 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f 77 46  n.z[0] && !showF
4c80: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
4c90: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
4ca0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f  iteVdbeAddOp(v,O
4cb0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
4cc0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4cd0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
4ce0: 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   -1, p->span.z, 
4cf0: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
4d00: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
4d10: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
4d20: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  r);.    }else if
4d30: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
4d40: 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  MN && pTabList )
4d50: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
4d60: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
4d70: 61 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61  a[p->iTable - ba
4d80: 73 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  se].pTab;.      
4d90: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
4da0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
4db0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69  iColumn;.      i
4dc0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
4dd0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
4de0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
4df0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
4e00: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
4e10: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
4e20: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
4e30: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52        zCol = "_R
4e40: 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20  OWID_";.        
4e50: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
4e60: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
4e70: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
4e80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
4e90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a  zName;.        z
4ea0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
4eb0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4ed0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
4ee0: 31 20 7c 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d  1 || showFullNam
4ef0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  es ){.        ch
4f00: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
4f10: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
4f20: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
4f30: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
4f40: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
4f50: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
4f60: 20 20 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61    if( showFullNa
4f70: 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29  mes || zTab==0 )
4f80: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
4f90: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
4fa0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
4fb0: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
4fc0: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
4fd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4fe0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
4ff0: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
5000: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
5010: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61  ngeP3(v, -1, zNa
5020: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
5030: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
5040: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
5050: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5060: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5070: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
5080: 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20  Name, i, 0);.   
5090: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
50a0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
50b0: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Col, 0);.      }
50c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
50d0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
50e0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
50f0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
5100: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f  iteVdbeAddOp(v,O
5110: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
5120: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5130: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
5140: 20 2d 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20   -1, p->span.z, 
5150: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
5160: 20 20 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70    sqliteVdbeComp
5170: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
5180: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
5190: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
51a0: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
51b0: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
51c0: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
51d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
51e0: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
51f0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
5200: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5210: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e  Op(v, OP_ColumnN
5220: 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ame, i, 0);.    
5230: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
5240: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d  geP3(v, -1, zNam
5250: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
5260: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5270: 20 7a 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   zType==0 ){.   
5280: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
5290: 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54 45  rType(p)==SQLITE
52a0: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
52b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
52c0: 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  T";.      }else{
52d0: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
52e0: 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20   "NUMERIC";.    
52f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
5300: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5310: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
5320: 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  i + pEList->nExp
5330: 72 20 2b 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  r + 1, 0);.    s
5340: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5350: 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20  3(v, -1, zType, 
5360: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  P3_STATIC);.  }.
5370: 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  }../*.** Name of
5380: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5390: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
53a0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
53b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
53c0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
53d0: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
53e0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
53f0: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
5400: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
5410: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
5420: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
5430: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
5440: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
5450: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
5460: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
5470: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
5480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5490: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
54a0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
54b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
54c0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
54d0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
54e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
54f0: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
5500: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
5510: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
5520: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
5530: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
5540: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 52 65 73  Table *sqliteRes
5550: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
5560: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
5570: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65  ar *zTabName, Se
5580: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
5590: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
55a0: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
55b0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
55c0: 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
55d0: 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72 73 65 2a  olumnList(Parse*
55e0: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 20 20 69  , Select*);..  i
55f0: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
5600: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
5610: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
5620: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
5630: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5640: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
5650: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
5660: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5670: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  .  }.  pTab->zNa
5680: 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20  me = zTabName ? 
5690: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61  sqliteStrDup(zTa
56a0: 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45  bName) : 0;.  pE
56b0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
56c0: 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e  pEList;.  pTab->
56d0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
56e0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
56f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
5700: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 73    pTab->aCol = s
5710: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
5720: 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30  eof(pTab->aCol[0
5730: 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ])*pTab->nCol );
5740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
5750: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
5760: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
5770: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
5780: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
5790: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
57a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
57b0: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  Dup(pEList->a[i]
57c0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  .zName);.    }el
57d0: 73 65 20 69 66 28 20 28 70 3d 70 45 4c 69 73 74  se if( (p=pEList
57e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
57f0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
5800: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
5810: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
5820: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &pTab->aCol[i].z
5830: 4e 61 6d 65 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c  Name, p->span.z,
5840: 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20 30 29 3b 0a   p->span.n, 0);.
5850: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
5860: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
5870: 2d 3e 70 52 69 67 68 74 20 26 26 20 70 2d 3e 70  ->pRight && p->p
5880: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  Right->token.z &
5890: 26 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  &.           p->
58a0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
58b0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
58c0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 54  teSetNString(&pT
58d0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
58e0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  e, .           p
58f0: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
5900: 7a 2c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  z, p->pRight->to
5910: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 7d  ken.n, 0);.    }
5920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
5930: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20   zBuf[30];.     
5940: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
5950: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
5960: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
5970: 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  l[i].zName = sql
5980: 69 74 65 53 74 72 44 75 70 28 7a 42 75 66 29 3b  iteStrDup(zBuf);
5990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
59a0: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
59b0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
59c0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 67  ./*.** For the g
59d0: 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
59e0: 65 6d 65 6e 74 2c 20 64 6f 20 74 68 72 65 65 20  ement, do three 
59f0: 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  things..**.**   
5a00: 20 28 31 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (1)  Fill in th
5a10: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
5a20: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
5a30: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
5a40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
5a50: 6e 65 73 20 74 68 65 20 73 65 74 20 6f 66 20 74  nes the set of t
5a60: 61 62 6c 65 73 20 74 68 61 74 20 73 68 6f 75 6c  ables that shoul
5a70: 64 20 62 65 20 73 63 61 6e 6e 65 64 2e 20 0a 2a  d be scanned. .*
5a80: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 64 64  *.**    (2)  Add
5a90: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
5aa0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
5ab0: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
5ac0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
5ad0: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
5ae0: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
5af0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
5b00: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
5b10: 28 33 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (3)  Scan the li
5b20: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
5b30: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5b40: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
5b50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
5b60: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
5b70: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
5b80: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
5b90: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
5ba0: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
5bb0: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
5bc0: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
5bd0: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
5be0: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
5bf0: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
5c00: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
5c10: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
5c20: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
5c30: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
5c40: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
5c50: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
5c60: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
5c70: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
5c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
5c90: 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 50 61 72  InColumnList(Par
5ca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
5cb0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ct *p){.  int i,
5cc0: 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63   j, k, rc;.  Src
5cd0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
5ce0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
5cf0: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
5d00: 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  b;..  if( p==0 |
5d10: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 29 20 72  | p->pSrc==0 ) r
5d20: 65 74 75 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c  eturn 1;.  pTabL
5d30: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
5d40: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
5d50: 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  ist;..  /* Look 
5d60: 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 69  up every table i
5d70: 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74  n the table list
5d80: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
5d90: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
5da0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rc; i++){.    if
5db0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
5dc0: 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  .pTab ){.      /
5dd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
5de0: 61 73 20 72 75 6e 20 62 65 66 6f 72 65 21 20 20  as run before!  
5df0: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69  No need to conti
5e00: 6e 75 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  nue */.      ret
5e10: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
5e20: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
5e30: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
5e40: 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
5e50: 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
5e60: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
5e70: 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
5e80: 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 61  ert( pTabList->a
5e90: 5b 69 5d 2e 70 53 65 6c 65 63 74 21 3d 30 20 29  [i].pSelect!=0 )
5ea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
5eb0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
5ec0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
5ed0: 63 68 61 72 20 7a 46 61 6b 65 4e 61 6d 65 5b 36  char zFakeName[6
5ee0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  0];.        spri
5ef0: 6e 74 66 28 7a 46 61 6b 65 4e 61 6d 65 2c 20 22  ntf(zFakeName, "
5f00: 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
5f10: 25 70 5f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %p_",.          
5f20: 20 28 76 6f 69 64 2a 29 70 54 61 62 4c 69 73 74   (void*)pTabList
5f30: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
5f40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
5f50: 65 74 53 74 72 69 6e 67 28 26 70 54 61 62 4c 69  etString(&pTabLi
5f60: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
5f70: 20 7a 46 61 6b 65 4e 61 6d 65 2c 20 30 29 3b 0a   zFakeName, 0);.
5f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
5f90: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
5fa0: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
5fb0: 20 20 20 20 73 71 6c 69 74 65 52 65 73 75 6c 74      sqliteResult
5fc0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
5fd0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  se, pTabList->a[
5fe0: 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  i].zAlias,.     
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6020: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
6030: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
6040: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6050: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
6060: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
6070: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  nt = 1;.    }els
6080: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
6090: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
60a0: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
60b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
60c0: 0a 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d  .      pTabList-
60d0: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[i].pTab = pTa
60e0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
60f0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
6100: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 4c 69 73  rse->db, pTabLis
6110: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
6120: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
6130: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
6140: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
6150: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
6160: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
6170: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  , .           pT
6180: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
6190: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
61a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
61b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
61c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61d0: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
61e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
61f0: 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f   sqliteViewGetCo
6200: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
6210: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
6220: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6240: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6250: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
6260: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
6270: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
6280: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6290: 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
62a0: 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
62b0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
62c0: 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
62d0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
62e0: 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
62f0: 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20  se, p) ) return 
6300: 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65  1;..  /* For eve
6310: 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
6320: 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
6330: 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
6340: 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
6350: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
6360: 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
6370: 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
6380: 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
6390: 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
63a0: 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
63b0: 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
63c0: 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
63d0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
63e0: 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
63f0: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
6400: 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
6410: 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
6420: 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
6430: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
6440: 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
6450: 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
6460: 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
6470: 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
6480: 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
6490: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
64a0: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
64b0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
64c0: 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
64d0: 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
64e0: 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
64f0: 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
6500: 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
6510: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
6520: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
6530: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; k++){.    Exp
6540: 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pE = pEList->
6550: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
6560: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
6570: 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
6580: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
6590: 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
65a0: 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
65b0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20  op==TK_ALL.     
65c0: 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74      && pE->pLeft
65d0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
65e0: 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b  p==TK_ID ) break
65f0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a  ;.  }.  rc = 0;.
6600: 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
6610: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
6620: 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
6630: 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
6640: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
6650: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
6660: 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
6670: 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
6680: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
6690: 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
66a0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
66b0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
66c0: 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
66d0: 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
66e0: 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
66f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
6700: 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
6710: 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
6720: 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
6730: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
6740: 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
6750: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
6760: 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
6770: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
6780: 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20  TK_ALL &&.      
6790: 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b       (pE->op!=TK
67a0: 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
67b0: 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69  ht==0 || pE->pRi
67c0: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
67d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
67e0: 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
67f0: 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
6800: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
6810: 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
6820: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
6830: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
6840: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b  Append(pNew, a[k
6850: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
6860: 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
6870: 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
6880: 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
6890: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
68a0: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
68b0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
68c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
68d0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
68e0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
68f0: 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
6900: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
6910: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
6920: 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
6930: 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
6940: 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
6950: 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
6960: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
6970: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
6980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78            /* tex
6990: 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
69a0: 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
69b0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
69c0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b   && pE->pLeft ){
69d0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65  .          pName
69e0: 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74   = &pE->pLeft->t
69f0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  oken;.        }e
6a00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
6a10: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
6a20: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
6a30: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
6a40: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
6a50: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
6a60: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
6a70: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
6a80: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
6a90: 6d 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  me = pTabList->a
6aa0: 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [i].zAlias;.    
6ab0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
6ac0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
6ad0: 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20  e[0]==0 ){ .    
6ae0: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
6af0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6b00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6b10: 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20        if( pName 
6b20: 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  && (zTabName==0 
6b30: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
6b40: 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  0 || .          
6b50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 74 72         sqliteStr
6b60: 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20  NICmp(pName->z, 
6b70: 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  zTabName, pName-
6b80: 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20  >n)!=0 ||.      
6b90: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
6ba0: 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30  ame[pName->n]!=0
6bb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
6bc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6be0: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
6bf0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
6c00: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
6c10: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6c20: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
6c30: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
6c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
6c50: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
6c60: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
6c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6c80: 20 69 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73   i>0 && (pTabLis
6c90: 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  t->a[i-1].jointy
6ca0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
6cb0: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  !=0 &&.         
6cc0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
6cd0: 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  ex(pTabList->a[i
6ce0: 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29  -1].pTab, zName)
6cf0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
6d00: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
6d10: 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
6d20: 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
6d30: 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
6d40: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
6d50: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
6d60: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
6d70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6d90: 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 73      if( i>0 && s
6da0: 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78  qliteIdListIndex
6db0: 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  (pTabList->a[i-1
6dc0: 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ].pUsing, zName)
6dd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
6de0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
6df0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
6e00: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
6e10: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
6e20: 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
6e30: 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
6e40: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
6e50: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
6e60: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6e80: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
6e90: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
6ea0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6ec0: 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
6ed0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
6ee0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  Right->token.z =
6ef0: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
6f00: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
6f10: 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  n.n = strlen(zNa
6f20: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
6f30: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 29 7b   if( zTabName ){
6f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
6f50: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
6f60: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
6f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6f80: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 20   if( pLeft==0 ) 
6f90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6fa0: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
6fb0: 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a  n.z = zTabName;.
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
6fd0: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  eft->token.n = s
6fe0: 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b  trlen(zTabName);
6ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7000: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70  Expr = sqliteExp
7010: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
7020: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
7030: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7040: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
7050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
7060: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7070: 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
7080: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7090: 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45  pExpr->span = pE
70a0: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  xpr->token;.    
70b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70c0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
70d0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
70e0: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
70f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7100: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7110: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
7120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
7130: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   pName ){.      
7140: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
7150: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7160: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
7170: 68 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31 2c 20  h table: ", -1, 
7180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7190: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
71a0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 0);.         
71b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
71c0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
71d0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
71e0: 72 4d 73 67 2c 20 22 6e 6f 20 74 61 62 6c 65 73  rMsg, "no tables
71f0: 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
7200: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7210: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
7220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7230: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7240: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
7250: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
7260: 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
7270: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7280: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7290: 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c  utine recursivel
72a0: 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65  y unlinks the Se
72b0: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54  lect.pSrc.a[].pT
72c0: 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69  ab pointers.** i
72d0: 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63  n a select struc
72e0: 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73  ture.  It just s
72f0: 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ets the pointers
7300: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a   to NULL.  This.
7310: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ** routine is re
7320: 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73  cursive in the s
7330: 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65  ense that if the
7340: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d   Select.pSrc.a[]
7350: 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e  .pSelect.** poin
7360: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
7370: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7380: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
7390: 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e  ely on that poin
73a0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
73b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
73c0: 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20  d on the Select 
73d0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
73e0: 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57  efines a.** VIEW
73f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64   in order to und
7400: 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74  o any bindings t
7410: 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20  o tables.  This 
7420: 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  is necessary.** 
7430: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61  because those ta
7440: 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52  bles might be DR
7450: 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71  OPed by a subseq
7460: 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  uent SQL command
7470: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7480: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
7490: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
74a0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
74b0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54  c = p->pSrc;.  T
74c0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
74d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
74e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
74f0: 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
7500: 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
7510: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  pSrc->a[i].pTab)
7520: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
7530: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
7540: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
7550: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
7560: 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  0, pTab);.      
7570: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
7580: 6c 65 74 65 28 70 53 72 63 2d 3e 61 5b 69 5d 2e  lete(pSrc->a[i].
7590: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
75a0: 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65    pSrc->a[i].pSe
75b0: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  lect = 0;.      
75c0: 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  }.      pSrc->a[
75d0: 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  i].pTab = 0;.   
75e0: 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
75f0: 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ].pSelect ){.   
7600: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
7610: 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b  tUnbind(pSrc->a[
7620: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
7630: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
7640: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7650: 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20  tine associates 
7660: 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52  entries in an OR
7670: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
7680: 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63  n list with.** c
7690: 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75  olumns in a resu
76a0: 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52  lt.  For each OR
76b0: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
76c0: 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66  n, the opcode of
76d0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
76e0: 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l node is change
76f0: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61  d to TK_COLUMN a
7700: 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76  nd the iColumn v
7710: 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  alue of.** the t
7720: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
7730: 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
7740: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
7750: 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20  d the iTable.** 
7760: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70  value of the top
7770: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
7780: 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c  illed with iTabl
7790: 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  e parameter..**.
77a0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
77b0: 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61  prior SELECT cla
77c0: 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70  uses, they are p
77d0: 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20  rocessed first. 
77e0: 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61   A match.** in a
77f0: 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54  n earlier SELECT
7800: 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63   takes precedenc
7810: 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53  e over a later S
7820: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ELECT..**.** Any
7830: 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73   entry that does
7840: 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c   not match is fl
7850: 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f  agged as an erro
7860: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  r.  The number.*
7870: 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72  * of errors is r
7880: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7890: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
78a0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50  rbyToColumn(.  P
78b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
78c0: 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63         /* A plac
78d0: 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72  e to leave error
78e0: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
78f0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
7900: 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20         /* Match 
7910: 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  to result column
7920: 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54  s of this SELECT
7930: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7940: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
7950: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61   The ORDER BY va
7960: 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67  lues to match ag
7970: 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ainst columns */
7980: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
7990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
79a0: 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20  sert this value 
79b0: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
79c0: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
79d0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
79e0: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
79f0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
7a00: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
7a10: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
7a20: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
7a30: 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
7a40: 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d  =0 || pOrderBy==
7a50: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
7a60: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
7a70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
7a80: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
7a90: 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72  pr; i++){ pOrder
7aa0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
7ab0: 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66  0; }.  }.  if( f
7ac0: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
7ad0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
7ae0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
7af0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
7b00: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
7b10: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
7b20: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
7b30: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
7b40: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
7b50: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
7b60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7b70: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
7b80: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
7b90: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
7ba0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
7bb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
7bc0: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
7bd0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
7be0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
7bf0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
7c00: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
7c10: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
7c20: 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
7c30: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
7c40: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
7c50: 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
7c60: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
7c70: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
7c80: 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  0];.        spri
7c90: 6e 74 66 28 7a 42 75 66 2c 22 4f 52 44 45 52 20  ntf(zBuf,"ORDER 
7ca0: 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73  BY position %d s
7cb0: 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e  hould be between
7cc0: 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20   1 and %d",.    
7cd0: 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c         iCol, pEL
7ce0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
7cf0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
7d00: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
7d10: 72 72 4d 73 67 2c 20 7a 42 75 66 2c 20 30 29 3b  rrMsg, zBuf, 0);
7d20: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
7d30: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
7d40: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
7d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7d60: 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20        iCol--;.  
7d70: 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b    }.    for(j=0;
7d80: 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c   iCol<0 && j<pEL
7d90: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
7da0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
7db0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26  st->a[j].zName &
7dc0: 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  & (pE->op==TK_ID
7dd0: 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53   || pE->op==TK_S
7de0: 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20  TRING) ){.      
7df0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a    char *zName, *
7e00: 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20  zLabel;.        
7e10: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
7e20: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
7e30: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
7e40: 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20  token.z );.     
7e50: 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69     zLabel = sqli
7e60: 74 65 53 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f  teStrNDup(pE->to
7e70: 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e  ken.z, pE->token
7e80: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  .n);.        sql
7e90: 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 61 62 65  iteDequote(zLabe
7ea0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
7eb0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4e  sqliteStrICmp(zN
7ec0: 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20  ame, zLabel)==0 
7ed0: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69 43  ){ .          iC
7ee0: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  ol = j;.        
7ef0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
7f00: 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  Free(zLabel);.  
7f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7f20: 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65  iCol<0 && sqlite
7f30: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20  ExprCompare(pE, 
7f40: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
7f50: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pr) ){.        i
7f60: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  Col = j;.      }
7f70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
7f80: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
7f90: 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pE->op = TK_COLU
7fa0: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43  MN;.      pE->iC
7fb0: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
7fc0: 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d      pE->iTable =
7fd0: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70   iTable;.      p
7fe0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
7ff0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
8000: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
8010: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
8020: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
8030: 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  30];.      sprin
8040: 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 69 2b 31  tf(zBuf,"%d",i+1
8050: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  );.      sqliteS
8060: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
8070: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 4f 52 44 45  ->zErrMsg, "ORDE
8080: 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72  R BY term number
8090: 20 22 2c 20 7a 42 75 66 2c 20 0a 20 20 20 20 20   ", zBuf, .     
80a0: 20 20 20 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61     " does not ma
80b0: 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63  tch any result c
80c0: 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
80d0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
80e0: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
80f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8100: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8110: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
8120: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
8130: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
8140: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
8150: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
8160: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
8170: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8180: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
8190: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
81a0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
81b0: 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74 56 64  dbe *sqliteGetVd
81c0: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
81d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
81e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
81f0: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
8200: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8210: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72  e = sqliteVdbeCr
8220: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
8230: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
8240: 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  ;.}.    ../*.** 
8250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8260: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
8270: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69  s a query that i
8280: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69  s really the uni
8290: 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65  on.** or interse
82a0: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20  ction of two or 
82b0: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
82c0: 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22  eries..**.** "p"
82d0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
82e0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
82f0: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 54   two queries.  T
8300: 68 65 20 72 65 73 75 6c 74 73 20 73 68 6f 75 6c  he results shoul
8310: 64 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  d.** be stored i
8320: 6e 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  n eDest with par
8330: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2f  ameter iParm..*/
8340: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
8350: 69 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  iSelect(Parse *p
8360: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
8370: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
8380: 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72   iParm){.  int r
8390: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
83a0: 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
83b0: 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
83c0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
83d0: 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f  rior;     /* Ano
83e0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
83f0: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
8400: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
8410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8420: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
8430: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
8440: 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20 20  int base;       
8450: 20 20 20 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20      /* Baseline 
8460: 76 61 6c 75 65 20 66 6f 72 20 70 50 61 72 73 65  value for pParse
8470: 2d 3e 6e 54 61 62 20 2a 2f 0a 0a 20 20 2f 2a 20  ->nTab */..  /* 
8480: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
8490: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
84a0: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
84b0: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68  ELECTs.  Only th
84c0: 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c  e .  ** last SEL
84d0: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
84e0: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
84f0: 44 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69  DER BY..  */.  i
8500: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50  f( p==0 || p->pP
8510: 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
8520: 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70   1;.  pPrior = p
8530: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20  ->pPrior;.  if( 
8540: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
8550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
8560: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
8570: 3e 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45 52 20  >zErrMsg,"ORDER 
8580: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
8590: 20 63 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a 20   come after ",. 
85a0: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
85b0: 65 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20  e(p->op), " not 
85c0: 62 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20  before", 0);.   
85d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
85e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
85f0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
8600: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
8610: 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e  id query engine.
8620: 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65    If not, create
8630: 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
8640: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
8650: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
8660: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
8670: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n 1;..  /* Creat
8680: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
8690: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
86a0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
86b0: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
86c0: 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29  =SRT_TempTable )
86d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
86e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
86f0: 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b  Temp, iParm, 0);
8700: 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54  .    eDest = SRT
8710: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
8720: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8730: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
8740: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
8750: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
8760: 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e   base = pParse->
8770: 6e 54 61 62 3b 0a 20 20 73 77 69 74 63 68 28 20  nTab;.  switch( 
8780: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
8790: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
87a0: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
87b0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
87c0: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
87d0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
87e0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
87f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
8800: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8810: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 2d  n rc;.        p-
8820: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
8830: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8840: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
8850: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
8860: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
8870: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
8880: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
8890: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
88a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
88b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
88c0: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
88d0: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
88e0: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
88f0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
8900: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8910: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
8920: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
8930: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
8940: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
8950: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
8960: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
8970: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
8980: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
8990: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
89a0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
89b0: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
89c0: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
89d0: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
89e0: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
89f0: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
8a00: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
8a10: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8a20: 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54  *pOrderBy;  /* T
8a30: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8a40: 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  se for the right
8a50: 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20   SELECT */..    
8a60: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
8a70: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
8a80: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
8a90: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
8aa0: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
8ab0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ->pOrderBy==0 ){
8ac0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
8ad0: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
8ae0: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
8af0: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
8b00: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
8b10: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
8b20: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
8b30: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
8b40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8b50: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
8b60: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
8b70: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
8b80: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
8b90: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
8ba0: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
8bb0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
8bc0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
8bd0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
8be0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
8bf0: 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20  pOrderBy .      
8c00: 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62    && matchOrderb
8c10: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
8c20: 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
8c30: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29  , unionTab, 1) )
8c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
8c50: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
8c60: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
8c70: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
8c80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8c90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
8ca0: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
8cb0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
8cc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8cd0: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
8ce0: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20  unionTab, 1);.  
8cf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8d10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
8d20: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
8d30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
8d40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
8d50: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
8d60: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
8d70: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
8d80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8d90: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
8da0: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
8db0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
8dc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
8dd0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8de0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
8df0: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
8e00: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
8e10: 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63    */.      switc
8e20: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
8e30: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
8e40: 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45  EPT:  op = SRT_E
8e50: 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a  xcept;   break;.
8e60: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
8e70: 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53  _UNION:   op = S
8e80: 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65  RT_Union;    bre
8e90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
8ea0: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70  e TK_ALL:     op
8eb0: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20   = SRT_Table;   
8ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8ed0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
8ee0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  = 0;.      pOrde
8ef0: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
8f00: 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  y;.      p->pOrd
8f10: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
8f20: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
8f30: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
8f40: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
8f50: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
8f60: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
8f70: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
8f80: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
8f90: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
8fa0: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
8fb0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
8fc0: 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
8fd0: 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
8fe0: 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
8ff0: 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
9000: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
9010: 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20  d..      */     
9020: 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73   .      if( eDes
9030: 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e  t!=priorOp || un
9040: 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b  ionTab!=iParm ){
9050: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
9060: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
9070: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
9080: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
9090: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65  .        if( eDe
90a0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
90b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
90c0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
90d0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
90e0: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
90f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9100: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
9110: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
9120: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
9130: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
9140: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
9150: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9160: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
9170: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
9180: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
9190: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62  tart = sqliteVdb
91a0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
91b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
91c0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
91d0: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
91e0: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
91f0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
9220: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
9230: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
9260: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
9270: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9280: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 1;.        sql
9290: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
92a0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
92b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
92c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
92d0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
92e0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
92f0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
9300: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
9310: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
9320: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
9330: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
9340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
9350: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
9360: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
9370: 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
9380: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
9390: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
93a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
93b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
93c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
93d0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
93e0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
93f0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
9400: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
9410: 74 61 72 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  tart;..      /* 
9420: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
9430: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
9440: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
9450: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
9460: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
9470: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
9480: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
9490: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
94a0: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
94b0: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
94c0: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
94d0: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
94e0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
94f0: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
9500: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9510: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
9520: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
9530: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
9540: 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79  se,p,p->pOrderBy
9550: 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20  ,tab1,1) ){.    
9560: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9570: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9580: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9590: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31  P_OpenTemp, tab1
95a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
95b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
95c0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
95d0: 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  1, 1);..      /*
95e0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
95f0: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
9600: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
9610: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
9620: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
9630: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
9640: 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f  se, pPrior, SRT_
9650: 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20  Union, tab1, 0, 
9660: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
9670: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9680: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
9690: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
96a0: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
96b0: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
96c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
96d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
96e0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
96f0: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  b2, 1);.      sq
9700: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9710: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
9720: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ab2, 1);.      p
9730: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
9740: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
9750: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
9760: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
9770: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
9780: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
9790: 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
97a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
97b0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
97c0: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
97d0: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
97e0: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
97f0: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
9800: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
9810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9820: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
9830: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
9840: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
9850: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
9860: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
9870: 70 2d 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e 70  p->base, 0, p->p
9880: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
9890: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
98a0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
98b0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
98c0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
98d0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
98e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
98f0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
9900: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
9910: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
9920: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9930: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
9940: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
9950: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9960: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
9970: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
9980: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
9990: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
99a0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
99b0: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
99c0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d    p->pOrderBy, -
99f0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
9a00: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
9a20: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
9a30: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
9a40: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 73 71  turn 1;.      sq
9a50: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
9a60: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
9a70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9a80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
9a90: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
9aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9ab0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
9ac0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
9ad0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9ae0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
9af0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
9b00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9b10: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
9b20: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  0);.      if( p-
9b30: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
9b40: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
9b50: 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70  tTail(p, v, p->p
9b60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
9b70: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
9b80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9b90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
9ba0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
9bb0: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
9bc0: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
9bd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
9be0: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
9bf0: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
9c00: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
9c10: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 53 45 4c  e->zErrMsg, "SEL
9c20: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
9c30: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 22 2c   and right of ",
9c40: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
9c50: 61 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 64 6f  ame(p->op), " do
9c60: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
9c70: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
9c80: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 30 29  ult columns", 0)
9c90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
9ca0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
9cb0: 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   1;.  }.  pParse
9cc0: 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 0a 20  ->nTab = base;. 
9cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9ce0: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
9cf0: 73 63 61 6e 20 74 68 72 6f 75 67 68 20 61 6e 20  scan through an 
9d00: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9d10: 20 20 46 6f 72 20 65 76 65 72 79 20 72 65 66 65    For every refe
9d20: 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 61 20 63 6f  rence.** to a co
9d30: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
9d40: 6d 62 65 72 20 69 46 72 6f 6d 2c 20 63 68 61 6e  mber iFrom, chan
9d50: 67 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ge that referenc
9d60: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e to the.** same
9d70: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
9d80: 20 6e 75 6d 62 65 72 20 69 54 6f 2e 0a 2a 2f 0a   number iTo..*/.
9d90: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
9da0: 67 65 54 61 62 6c 65 73 28 45 78 70 72 20 2a 70  geTables(Expr *p
9db0: 45 78 70 72 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  Expr, int iFrom,
9dc0: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66 28   int iTo){.  if(
9dd0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
9de0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
9df0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
9e00: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
9e10: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 70 45  =iFrom ){.    pE
9e20: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  xpr->iTable = iT
9e30: 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
9e40: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
9e50: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 45  geTablesInList(E
9e60: 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 69  xprList*, int, i
9e70: 6e 74 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54  nt);.    changeT
9e80: 61 62 6c 65 73 28 70 45 78 70 72 2d 3e 70 4c 65  ables(pExpr->pLe
9e90: 66 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b  ft, iFrom, iTo);
9ea0: 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65  .    changeTable
9eb0: 73 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  s(pExpr->pRight,
9ec0: 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20   iFrom, iTo);.  
9ed0: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e    changeTablesIn
9ee0: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
9ef0: 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a  t, iFrom, iTo);.
9f00: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9f10: 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e  d changeTablesIn
9f20: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
9f30: 4c 69 73 74 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  List, int iFrom,
9f40: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66 28   int iTo){.  if(
9f50: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 6e   pList ){.    in
9f60: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
9f70: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
9f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
9f90: 61 6e 67 65 54 61 62 6c 65 73 28 70 4c 69 73 74  angeTables(pList
9fa0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 46  ->a[i].pExpr, iF
9fb0: 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  rom, iTo);.    }
9fc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
9fd0: 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
9fe0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
9ff0: 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
a000: 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
a010: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
a020: 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
a030: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
a040: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a050: 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
a060: 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
a070: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
a080: 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
a090: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 20  .** unchanged.) 
a0a0: 20 57 68 65 6e 20 6d 61 6b 69 6e 67 20 61 20 63   When making a c
a0b0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
a0c0: 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 2c 20  sion in pEList, 
a0d0: 63 68 61 6e 67 65 0a 2a 2a 20 72 65 66 65 72 65  change.** refere
a0e0: 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
a0f0: 69 6e 20 74 61 62 6c 65 20 69 53 75 62 20 69 6e  in table iSub in
a100: 74 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  to references to
a110: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a   table iTable..*
a120: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a130: 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
a140: 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
a150: 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
a160: 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
a170: 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
a180: 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
a190: 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
a1a0: 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
a1b0: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
a1c0: 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
a1d0: 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
a1e0: 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
a1f0: 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
a200: 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
a210: 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
a220: 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
a230: 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
a240: 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
a250: 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
a260: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
a270: 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
a280: 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
a290: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
a2a0: 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
a2b0: 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
a2c0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  r(Expr *pExpr, i
a2d0: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
a2e0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74  ist *pEList, int
a2f0: 20 69 53 75 62 29 7b 0a 20 20 69 66 28 20 70 45   iSub){.  if( pE
a300: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
a310: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
a320: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
a330: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
a340: 61 62 6c 65 20 26 26 20 70 45 78 70 72 2d 3e 69  able && pExpr->i
a350: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
a360: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
a370: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
a380: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
a390: 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
a3a0: 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  pr );.    assert
a3b0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
a3c0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
a3d0: 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
a3e0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
a3f0: 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
a400: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
a410: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
a420: 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
a430: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70     pExpr->op = p
a440: 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78  New->op;.    pEx
a450: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
a460: 74 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  teExprDup(pNew->
a470: 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
a480: 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
a490: 74 65 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  teExprDup(pNew->
a4a0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 45 78  pRight);.    pEx
a4b0: 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
a4c0: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e  teExprListDup(pN
a4d0: 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ew->pList);.    
a4e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
a4f0: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
a500: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
a510: 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
a520: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67  ;.    pExpr->iAg
a530: 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
a540: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
a550: 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a   = pNew->token;.
a560: 20 20 20 20 69 66 28 20 69 53 75 62 21 3d 69 54      if( iSub!=iT
a570: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68  able ){.      ch
a580: 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70 72  angeTables(pExpr
a590: 2c 20 69 53 75 62 2c 20 69 54 61 62 6c 65 29 3b  , iSub, iTable);
a5a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a5b0: 20 20 20 20 73 74 61 74 69 63 20 76 6f 69 64 20      static void 
a5c0: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
a5d0: 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72  prList*,int,Expr
a5e0: 4c 69 73 74 2a 2c 69 6e 74 29 3b 0a 20 20 20 20  List*,int);.    
a5f0: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
a600: 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
a610: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
a620: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78     substExpr(pEx
a630: 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
a640: 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62  le, pEList, iSub
a650: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
a660: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
a670: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
a680: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a  t, iSub);.  }.}.
a690: 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73 75 62  static void .sub
a6a0: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
a6b0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
a6c0: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
a6d0: 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20 69 53   *pEList, int iS
a6e0: 75 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ub){.  int i;.  
a6f0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
a700: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
a710: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
a720: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
a730: 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
a740: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
a750: 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a   pEList, iSub);.
a760: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
a770: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
a780: 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
a790: 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
a7a0: 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
a7b0: 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
a7c0: 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
a7d0: 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
a7e0: 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
a7f0: 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
a800: 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
a810: 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
a820: 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
a830: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
a840: 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
a850: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
a860: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
a870: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
a880: 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
a890: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
a8a0: 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
a8b0: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
a8c0: 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
a8d0: 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
a8e0: 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
a8f0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
a900: 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
a910: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
a920: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
a930: 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
a940: 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
a950: 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
a960: 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
a970: 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
a980: 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
a990: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
a9a0: 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
a9b0: 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
a9c0: 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
a9d0: 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
a9e0: 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
a9f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
aa00: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
aa10: 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
aa20: 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
aa30: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
aa40: 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
aa50: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
aa60: 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
aa70: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
aa80: 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
aa90: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
aaa0: 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
aab0: 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
aac0: 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
aad0: 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
aae0: 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
aaf0: 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
ab00: 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
ab10: 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
ab20: 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
ab30: 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
ab40: 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
ab50: 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
ab60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
ab70: 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
ab80: 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
ab90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
aba0: 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
abb0: 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
abc0: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
abd0: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
abe0: 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
abf0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
ac00: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
ac10: 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
ac20: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
ac30: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
ac40: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
ac50: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
ac60: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
ac70: 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
ac80: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
ac90: 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
aca0: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
acb0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
acc0: 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (5)  The subquer
acd0: 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
ace0: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
acf0: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
ad00: 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
ad10: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
ad20: 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
ad30: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
ad40: 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
ad50: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
ad60: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
ad70: 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
ad80: 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
ad90: 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
ada0: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
adb0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
adc0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
add0: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
ade0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
adf0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
ae00: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
ae10: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
ae20: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
ae30: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
ae40: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
ae50: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
ae60: 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
ae70: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
ae80: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
ae90: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
aea0: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
aeb0: 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
aec0: 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
aed0: 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
aee0: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
aef0: 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
af00: 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
af10: 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
af20: 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
af30: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
af40: 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
af50: 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
af60: 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
af70: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
af80: 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
af90: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
afa0: 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
afb0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
afc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
afd0: 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
afe0: 72 6e 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  rn 0..** If flat
aff0: 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
b000: 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
b010: 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
b020: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
b030: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
b040: 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
b050: 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
b060: 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
b070: 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
b080: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
b090: 2e 0a 2a 2f 0a 69 6e 74 20 66 6c 61 74 74 65 6e  ..*/.int flatten
b0a0: 53 75 62 71 75 65 72 79 28 53 65 6c 65 63 74 20  Subquery(Select 
b0b0: 2a 70 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  *p, int iFrom, i
b0c0: 6e 74 20 69 73 41 67 67 2c 20 69 6e 74 20 73 75  nt isAgg, int su
b0d0: 62 71 75 65 72 79 49 73 41 67 67 29 7b 0a 20 20  bqueryIsAgg){.  
b0e0: 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
b0f0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
b100: 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
b110: 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
b120: 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
b130: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
b140: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
b150: 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
b160: 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
b170: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
b180: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
b190: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
b1a0: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
b1b0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
b1c0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
b1d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
b1e0: 69 50 61 72 65 6e 74 2c 20 69 53 75 62 3b 0a 20  iParent, iSub;. 
b1f0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a   Expr *pWhere;..
b200: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
b210: 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
b220: 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
b230: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
b240: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
b250: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
b260: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
b270: 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
b280: 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
b290: 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
b2a0: 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d 3e 61    pSub = pSrc->a
b2b0: 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b  [iFrom].pSelect;
b2c0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
b2d0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
b2e0: 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
b2f0: 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  gg ) return 0;. 
b300: 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
b310: 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63  gg && pSrc->nSrc
b320: 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  >1 ) return 0;. 
b330: 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
b340: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
b350: 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66   pSubSrc );.  if
b360: 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 21  ( pSubSrc->nSrc!
b370: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
b380: 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69   if( (pSub->isDi
b390: 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e  stinct || pSub->
b3a0: 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 20 28  nLimit>=0) &&  (
b3b0: 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
b3c0: 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
b3d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b3e0: 66 28 20 28 70 2d 3e 69 73 44 69 73 74 69 6e 63  f( (p->isDistinc
b3f0: 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d  t || p->nLimit>=
b400: 30 29 20 26 26 20 73 75 62 71 75 65 72 79 49 73  0) && subqueryIs
b410: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
b420: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
b430: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
b440: 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
b450: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
b460: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 2d 74 68  or the.  ** i-th
b470: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
b480: 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
b490: 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
b4a0: 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  */.  iParent = p
b4b0: 2d 3e 62 61 73 65 20 2b 20 69 46 72 6f 6d 3b 0a  ->base + iFrom;.
b4c0: 20 20 69 53 75 62 20 3d 20 70 53 75 62 2d 3e 62    iSub = pSub->b
b4d0: 61 73 65 3b 0a 20 20 73 75 62 73 74 45 78 70 72  ase;.  substExpr
b4e0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
b4f0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
b500: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
b510: 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  pList = p->pELis
b520: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
b530: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
b540: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  +){.    if( pLis
b550: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
b560: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
b570: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
b580: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
b590: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
b5a0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
b5b0: 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  up(pExpr->span.z
b5c0: 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
b5d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
b5e0: 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
b5f0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
b600: 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
b610: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c  t, pSub->pEList,
b620: 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73   iSub);.    subs
b630: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
b640: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
b650: 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a  >pEList, iSub);.
b660: 20 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c    }.  substExprL
b670: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
b680: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
b690: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
b6a0: 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
b6b0: 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
b6c0: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
b6d0: 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
b6e0: 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d     if( iParent!=
b6f0: 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68  iSub ){.      ch
b700: 61 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65 72  angeTables(pWher
b710: 65 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74  e, iSub, iParent
b720: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
b730: 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
b740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
b750: 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
b760: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
b770: 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
b780: 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
b790: 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
b7a0: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
b7b0: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
b7c0: 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
b7d0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
b7e0: 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53  Sub);.    if( pS
b7f0: 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20  ub->pHaving ){. 
b800: 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69       Expr *pHavi
b810: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ng = sqliteExprD
b820: 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
b830: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 61  );.      if( iPa
b840: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
b850: 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c        changeTabl
b860: 65 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75 62  es(pHaving, iSub
b870: 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , iParent);.    
b880: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
b890: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
b8a0: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
b8b0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
b8c0: 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ND, p->pHaving, 
b8d0: 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20  pHaving, 0);.   
b8e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b8f0: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
b900: 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a  Having;.      }.
b910: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
b920: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
b930: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
b940: 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72  pBy = sqliteExpr
b950: 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47  ListDup(pSub->pG
b960: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66 28  roupBy);.    if(
b970: 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29   iParent!=iSub )
b980: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
b990: 62 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 47  blesInList(p->pG
b9a0: 72 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69 50  roupBy, iSub, iP
b9b0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
b9c0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68  }else if( p->pWh
b9d0: 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ere==0 ){.    p-
b9e0: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
b9f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ba00: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65  ubstExpr(p->pWhe
ba10: 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
ba20: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
ba30: 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65  ;.    if( pWhere
ba40: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68   ){.      p->pWh
ba50: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
ba60: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65  (TK_AND, p->pWhe
ba70: 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  re, pWhere, 0);.
ba80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69      }.  }.  p->i
ba90: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
baa0: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
bab0: 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  b->isDistinct;. 
bac0: 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69   if( pSub->nLimi
bad0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t>=0 ){.    if( 
bae0: 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  p->nLimit<0 ){. 
baf0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
bb00: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20   pSub->nLimit;. 
bb10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
bb20: 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65  nLimit+p->nOffse
bb30: 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t > pSub->nLimit
bb40: 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29  +pSub->nOffset )
bb50: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
bb60: 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
bb70: 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74   + pSub->nOffset
bb80: 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   - p->nOffset;. 
bb90: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f     }.  }.  p->nO
bba0: 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e  ffset += pSub->n
bbb0: 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 70 53  Offset;.  if( pS
bbc0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
bbd0: 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72  b && pSrc->a[iFr
bbe0: 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e  om].pTab->isTran
bbf0: 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  sient ){.    sql
bc00: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
bc10: 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  , pSrc->a[iFrom]
bc20: 2e 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 53  .pTab);.  }.  pS
bc30: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
bc40: 62 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 30  b = pSubSrc->a[0
bc50: 5d 2e 70 54 61 62 3b 0a 20 20 70 53 75 62 53 72  ].pTab;.  pSubSr
bc60: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 30  c->a[0].pTab = 0
bc70: 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  ;.  pSrc->a[iFro
bc80: 6d 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  m].pSelect = pSu
bc90: 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  bSrc->a[0].pSele
bca0: 63 74 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e 61  ct;.  pSubSrc->a
bcb0: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b  [0].pSelect = 0;
bcc0: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  .  sqliteSelectD
bcd0: 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72  elete(pSub);.  r
bce0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
bcf0: 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45  * Analyze the SE
bd00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
bd10: 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61  assed in as an a
bd20: 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
bd30: 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d  f it.** is a sim
bd40: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
bd50: 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74  () query.  If it
bd60: 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65   is and this que
bd70: 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74  ry can be.** sat
bd80: 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73  isfied using a s
bd90: 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68  ingle seek to th
bda0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65  e beginning or e
bdb0: 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a  nd of an index,.
bdc0: 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  ** then generate
bdd0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
bde0: 69 73 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  is SELECT return
bdf0: 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20   1.  If this is 
be00: 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65  not a .** simple
be10: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
be20: 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75  query, then retu
be30: 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69  rn 0;.**.** A si
be40: 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mply min() or ma
be50: 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20  x() query looks 
be60: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
be70: 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61      SELECT min(a
be80: 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
be90: 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61      SELECT max(a
bea0: 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
beb0: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61  .** The query ma
bec0: 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69  y have only a si
bed0: 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74  ngle table in it
bee0: 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e  s FROM argument.
bef0: 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62    There.** can b
bf00: 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72  e no GROUP BY or
bf10: 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45   HAVING or WHERE
bf20: 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72   clauses.  The r
bf30: 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a  esult set must.*
bf40: 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f  * be the min() o
bf50: 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e  r max() of a sin
bf60: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  gle column of th
bf70: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
bf80: 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d  lumn.** in the m
bf90: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
bfa0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69  nction must be i
bfb0: 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ndexed..**.** Th
bfc0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
bfd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65  this routine are
bfe0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72   the same as for
bff0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e   sqliteSelect().
c000: 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
c010: 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
c020: 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
c030: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
c040: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
c050: 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
c060: 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
c070: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
c080: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
c090: 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a  iParm){.  Expr *
c0a0: 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f  pExpr;.  int iCo
c0b0: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  l;.  Table *pTab
c0c0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
c0d0: 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56  .  int base;.  V
c0e0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6f 70  dbe *v;.  int op
c0f0: 65 6e 4f 70 3b 0a 20 20 69 6e 74 20 73 65 65 6b  enOp;.  int seek
c100: 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a  Op;.  int cont;.
c110: 20 20 45 78 70 72 4c 69 73 74 20 65 4c 69 73 74    ExprList eList
c120: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
c130: 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74  ist_item eListIt
c140: 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  em;..  /* Check 
c150: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71  to see if this q
c160: 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
c170: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
c180: 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20  query.  Return. 
c190: 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69   ** zero if it i
c1a0: 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  s  not..  */.  i
c1b0: 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c  f( p->pGroupBy |
c1c0: 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20  | p->pHaving || 
c1d0: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
c1e0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
c1f0: 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
c200: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
c210: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
c220: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
c230: 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
c240: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c250: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
c260: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
c270: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
c280: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  f( pExpr->pList=
c290: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69  =0 || pExpr->pLi
c2a0: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
c2b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
c2c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33  Expr->token.n!=3
c2d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
c2e0: 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
c2f0: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
c300: 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
c310: 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
c320: 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20  Rewind;.  }else 
c330: 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43  if( sqliteStrNIC
c340: 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  mp(pExpr->token.
c350: 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b  z,"max",3)==0 ){
c360: 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50  .    seekOp = OP
c370: 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _Last;.  }else{.
c380: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c390: 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 45 78 70  }.  pExpr = pExp
c3a0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
c3b0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
c3c0: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
c3d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
c3e0: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
c3f0: 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70  lumn;.  pTab = p
c400: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
c410: 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  b;..  /* If we g
c420: 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d  et to here, it m
c430: 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69  eans the query i
c440: 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74  s of the correct
c450: 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63   form..  ** Chec
c460: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77  k to make sure w
c470: 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20  e have an index 
c480: 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f  and make pIdx po
c490: 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  int to the.  ** 
c4a0: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
c4b0: 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29  x.  If the min()
c4c0: 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20   or max() is on 
c4d0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
c4e0: 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75  RY.  ** key colu
c4f0: 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20  mn, no index is 
c500: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74  necessary so set
c510: 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20   pIdx to NULL.  
c520: 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c  If no.  ** usabl
c530: 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64  e index is found
c540: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
c550: 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b  .  if( iCol<0 ){
c560: 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20  .    pIdx = 0;. 
c570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
c580: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c590: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c5a0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
c5b0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
c5c0: 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
c5d0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
c5e0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
c5f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
c600: 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29     if( pIdx==0 )
c610: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
c620: 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
c630: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65  lumn names if we
c640: 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
c650: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68  he callback.  Th
c660: 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
c670: 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
c680: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
c690: 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d  o a table or a m
c6a0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f  emory cell..  */
c6b0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
c6c0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c6d0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
c6e0: 6e 20 30 3b 0a 20 20 69 66 28 20 65 44 65 73 74  n 0;.  if( eDest
c6f0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
c700: 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
c710: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
c720: 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53  , p->base, p->pS
c730: 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  rc, p->pEList);.
c740: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
c750: 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e  ting code to fin
c760: 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65  d the min or the
c770: 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79   max.  Basically
c780: 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   all we have.  *
c790: 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20  * to do is find 
c7a0: 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65  the first or the
c7b0: 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
c7c0: 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e  he chosen index.
c7d0: 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69    If.  ** the mi
c7e0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
c7f0: 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  on the INTEGER P
c800: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
c810: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a   find the first.
c820: 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74    ** or last ent
c830: 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ry in the main t
c840: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
c850: 20 21 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61   !pParse->schema
c860: 56 65 72 69 66 69 65 64 20 26 26 20 28 70 50 61  Verified && (pPa
c870: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
c880: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
c890: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c8a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c8b0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70  _VerifyCookie, p
c8c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d  Parse->db->schem
c8d0: 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  a_cookie, 0);.  
c8e0: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
c8f0: 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Verified = 1;.  
c900: 7d 0a 20 20 6f 70 65 6e 4f 70 20 3d 20 70 54 61  }.  openOp = pTa
c910: 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f  b->isTemp ? OP_O
c920: 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e  penAux : OP_Open
c930: 3b 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61  ;.  base = p->ba
c940: 73 65 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  se;.  sqliteVdbe
c950: 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c  AddOp(v, openOp,
c960: 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75   base, pTab->tnu
c970: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  m);.  sqliteVdbe
c980: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
c990: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pTab->zName, P3_
c9a0: 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 70  STATIC);.  if( p
c9b0: 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Idx==0 ){.    sq
c9c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c9d0: 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30   seekOp, base, 0
c9e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c9f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ca00: 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2b  v, openOp, base+
ca10: 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a  1, pIdx->tnum);.
ca20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
ca30: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49  angeP3(v, -1, pI
ca40: 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  dx->zName, P3_ST
ca50: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
ca60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65  eVdbeAddOp(v, se
ca70: 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30 29  ekOp, base+1, 0)
ca80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
ca90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52  AddOp(v, OP_IdxR
caa0: 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29  ecno, base+1, 0)
cab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
cac0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
cad0: 65 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20  e, base+1, 0);. 
cae0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
caf0: 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c  Op(v, OP_MoveTo,
cb00: 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20   base, 0);.  }. 
cb10: 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31   eList.nExpr = 1
cb20: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73  ;.  memset(&eLis
cb30: 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  tItem, 0, sizeof
cb40: 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20  (eListItem));.  
cb50: 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74  eList.a = &eList
cb60: 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b  Item;.  eList.a[
cb70: 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
cb80: 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  ;.  cont = sqlit
cb90: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
cba0: 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
cbb0: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
cbc0: 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  &eList, 0, 0, 0,
cbd0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
cbe0: 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b 0a  m, cont, cont);.
cbf0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
cc00: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
cc10: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  );.  sqliteVdbeA
cc20: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
cc30: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 72 65  , base, 0);.  re
cc40: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
cc50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
cc60: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
cc70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
cc80: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
cc90: 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
cca0: 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
ccb0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
ccc0: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
ccd0: 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
cce0: 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
ccf0: 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
cd00: 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
cd10: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd40: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
cd50: 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
cd60: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
cd70: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
cd80: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
cd90: 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
cda0: 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
cdb0: 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
cdc0: 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
cdd0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
cde0: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
cdf0: 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
ce00: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 63 75   a table with cu
ce10: 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  rsor iParm.**.**
ce20: 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
ce30: 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
ce40: 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
ce50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ce60: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
ce70: 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
ce80: 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
ce90: 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  form the tempora
cea0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
ceb0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
cec0: 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
ced0: 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
cee0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
cef0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
cf00: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
cf10: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
cf20: 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
cf30: 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
cf40: 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
cf50: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
cf60: 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
cf70: 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
cf80: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
cf90: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
cfa0: 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
cfb0: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
cfc0: 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
cfd0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
cfe0: 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
cff0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
d000: 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
d010: 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20  and *pParentAgg 
d020: 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
d030: 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  d in if this.** 
d040: 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71  SELECT is a subq
d050: 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  uery.  This rout
d060: 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63  ine may try to c
d070: 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45  ombine this SELE
d080: 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70  CT.** with its p
d090: 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20  arent to form a 
d0a0: 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72  single flat quer
d0b0: 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c  y.  In so doing,
d0c0: 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61   it might.** cha
d0d0: 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71  nge the parent q
d0e0: 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  uery from a non-
d0f0: 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20  aggregate to an 
d100: 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
d110: 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61  .** For that rea
d120: 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74  son, the pParent
d130: 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73  Agg flag is pass
d140: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c  ed as a pointer,
d150: 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65   so it.** can be
d160: 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
d170: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20   sqliteSelect(. 
d180: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d190: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
d1a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
d1b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
d1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d1d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d1e0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
d1f0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
d200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
d210: 65 20 6f 66 3a 20 53 52 54 5f 43 61 6c 6c 62 61  e of: SRT_Callba
d220: 63 6b 20 4d 65 6d 20 53 65 74 20 55 6e 69 6f 6e  ck Mem Set Union
d230: 20 45 78 63 65 70 74 20 2a 2f 0a 20 20 69 6e 74   Except */.  int
d240: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
d250: 20 20 20 20 2f 2a 20 53 61 76 65 20 72 65 73 75      /* Save resu
d260: 6c 74 20 69 6e 20 74 68 69 73 20 6d 65 6d 6f 72  lt in this memor
d270: 79 20 6c 6f 63 61 74 69 6f 6e 2c 20 69 66 20 3e  y location, if >
d280: 3d 30 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  =0 */.  Select *
d290: 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
d2a0: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
d2b0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
d2c0: 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
d2d0: 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
d2e0: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
d2f0: 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
d300: 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
d310: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
d320: 72 65 6e 74 41 67 67 20 20 20 20 20 20 20 20 2f  rentAgg        /
d330: 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
d340: 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
d350: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
d360: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
d370: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
d380: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
d390: 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20  isAgg = 0;      
d3a0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
d3b0: 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
d3c0: 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
d3d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d3e0: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
d3f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
d400: 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
d410: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
d420: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
d430: 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
d440: 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
d450: 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
d460: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
d470: 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
d480: 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
d490: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
d4a0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
d4b0: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
d4c0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
d4d0: 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
d4e0: 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
d4f0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
d500: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
d510: 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
d520: 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
d530: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
d540: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
d550: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
d560: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
d570: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
d580: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
d590: 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
d5a0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
d5b0: 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
d5c0: 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
d5d0: 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20 20  int base;       
d5e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d5f0: 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62 6c 65  cursor available
d600: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20 69 6e   for use */.  in
d610: 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
d620: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
d630: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
d640: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  s function */.. 
d650: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
d660: 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61  oc_failed || pPa
d670: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d  rse->nErr || p==
d680: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  0 ) return 1;.. 
d690: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
d6a0: 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
d6b0: 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
d6c0: 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
d6d0: 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
d6e0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
d6f0: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
d700: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
d710: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
d720: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f   }..  /* Make lo
d730: 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
d740: 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
d750: 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
d760: 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
d770: 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
d780: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
d790: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
d7a0: 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70  rderBy;.  pGroup
d7b0: 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
d7c0: 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
d7d0: 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69  >pHaving;.  isDi
d7e0: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
d7f0: 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c  stinct;..  /* Al
d800: 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
d810: 66 20 56 44 42 45 20 63 75 72 73 6f 72 73 2c 20  f VDBE cursors, 
d820: 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 74 61 62  one for each tab
d830: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
d840: 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 54 68 65 20  lause..  ** The 
d850: 57 48 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67  WHERE processing
d860: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74   requires that t
d870: 68 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74  he cursors for t
d880: 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
d890: 0a 20 20 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  .  ** FROM claus
d8a0: 65 20 62 65 20 63 6f 6e 73 65 63 75 74 69 76 65  e be consecutive
d8b0: 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20  ..  */.  base = 
d8c0: 70 2d 3e 62 61 73 65 20 3d 20 70 50 61 72 73 65  p->base = pParse
d8d0: 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65  ->nTab;.  pParse
d8e0: 2d 3e 6e 54 61 62 20 2b 3d 20 70 54 61 62 4c 69  ->nTab += pTabLi
d8f0: 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
d900: 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
d910: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
d920: 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
d930: 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
d940: 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
d950: 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
d960: 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
d970: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
d980: 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
d990: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
d9a0: 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
d9b0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
d9c0: 6c 65 20 6c 69 73 74 20 61 6e 64 20 63 72 65 61  le list and crea
d9d0: 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  te an appropriat
d9e0: 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 6c 69 73  e.  ** columnlis
d9f0: 74 20 69 6e 20 70 45 4c 69 73 74 20 69 66 20 74  t in pEList if t
da00: 68 65 72 65 20 69 73 6e 27 74 20 6f 6e 65 20 61  here isn't one a
da10: 6c 72 65 61 64 79 2e 20 20 28 54 68 65 20 70 61  lready.  (The pa
da20: 72 73 65 72 20 6c 65 61 76 65 73 0a 20 20 2a 2a  rser leaves.  **
da30: 20 61 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 70   a NULL in the p
da40: 2d 3e 70 45 4c 69 73 74 20 69 66 20 74 68 65 20  ->pEList if the 
da50: 53 51 4c 20 73 61 69 64 20 22 53 45 4c 45 43 54  SQL said "SELECT
da60: 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 29 0a 20 20   * FROM ...").  
da70: 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43  */.  if( fillInC
da80: 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65  olumnList(pParse
da90: 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , p) ){.    goto
daa0: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
dab0: 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
dac0: 57 68 65 72 65 3b 0a 20 20 70 45 4c 69 73 74 20  Where;.  pEList 
dad0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
dae0: 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67  f( pEList==0 ) g
daf0: 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
db00: 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
db10: 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
db20: 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
db30: 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
db40: 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
db50: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
db60: 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  f( (eDest==SRT_M
db70: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
db80: 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d  _Set) && pEList-
db90: 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20  >nExpr>1 ){.    
dba0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
dbb0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
dbc0: 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
dbd0: 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
dbe0: 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
dbf0: 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
dc00: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
dc10: 73 69 6f 6e 22 2c 20 30 29 3b 0a 20 20 20 20 70  sion", 0);.    p
dc20: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
dc30: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
dc40: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52  nd;.  }..  /* OR
dc50: 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
dc60: 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
dc70: 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
dc80: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
dc90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
dca0: 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ion:.    case SR
dcb0: 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20 63 61  T_Except:.    ca
dcc0: 73 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a 0a  se SRT_Discard:.
dcd0: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
dce0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
dcf0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
dd00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
dd10: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
dd20: 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  nt, we should ha
dd30: 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6c  ve allocated all
dd40: 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
dd50: 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20 74  t we.  ** need t
dd60: 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65 72  o handle subquer
dd70: 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  ys and temporary
dd80: 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a   tables.  .  **.
dd90: 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    ** Resolve the
dda0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
ddb0: 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69 63 73  d do a semantics
ddc0: 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74 68   check on all th
ddd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  e expressions.. 
dde0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
ddf0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
de00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
de10: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
de20: 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
de30: 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45   pTabList, 0, pE
de40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
de50: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
de60: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
de70: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
de80: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
de90: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
dea0: 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29  Expr, 1, &isAgg)
deb0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
dec0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
ded0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72  .  }.  if( pWher
dee0: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  e ){.    if( sql
def0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
df00: 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
df10: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
df20: 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
df30: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
df40: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
df50: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
df60: 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  k(pParse, pWhere
df70: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
df80: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
df90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
dfa0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
dfb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
dfc0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
dfd0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
dfe0: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
dff0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
e000: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
e010: 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
e020: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
e030: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
e040: 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
e050: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e070: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
e080: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
e090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0a0: 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20  "ORDER BY terms 
e0b0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d  must not be non-
e0c0: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
e0d0: 73 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  s", 0);.        
e0e0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
e0f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
e100: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
e110: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
e120: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
e130: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
e140: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
e150: 42 75 66 5b 32 30 30 30 5d 3b 0a 20 20 20 20 20  Buf[2000];.     
e160: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
e170: 66 2c 22 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  f,"ORDER BY colu
e180: 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74  mn number %d out
e190: 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
e1a0: 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
e1b0: 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
e1c0: 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70  and %d", iCol, p
e1d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
e1e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
e1f0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
e200: 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 42 75 66 2c  ->zErrMsg, zBuf,
e210: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
e220: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
e230: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
e240: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
e250: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
e260: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  teExprDelete(pE)
e270: 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
e280: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
e290: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
e2a0: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
e2b0: 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
e2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e2d0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
e2e0: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
e2f0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
e300: 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  ist, pE) ){.    
e310: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
e320: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
e330: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
e340: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
e350: 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a  E, isAgg, 0) ){.
e360: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
e370: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
e380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e390: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
e3a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
e3b0: 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
e3c0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
e3d0: 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
e3e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
e3f0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
e400: 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a  Constant(pE) ){.
e410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
e420: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
e430: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
e440: 20 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42          "GROUP B
e450: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 73 68  Y expressions sh
e460: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e 73  ould not be cons
e470: 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20  tant", 0);.     
e480: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
e490: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
e4a0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e4b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
e4c0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
e4d0: 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
e4e0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
e4f0: 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
e500: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
e510: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
e520: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
e530: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
e540: 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
e550: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
e560: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
e570: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
e580: 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
e590: 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
e5a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
e5b0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
e5c0: 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52 4f 55  zErrMsg, "a GROU
e5d0: 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
e5e0: 65 71 75 69 72 65 64 20 22 0a 20 20 20 20 20 20  equired ".      
e5f0: 20 20 20 22 62 65 66 6f 72 65 20 48 41 56 49 4e     "before HAVIN
e600: 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  G", 0);.      pP
e610: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
e620: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
e630: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
e640: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
e650: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
e660: 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
e670: 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29  pEList, pHaving)
e680: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
e690: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
e6a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
e6b0: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
e6c0: 20 70 48 61 76 69 6e 67 2c 20 69 73 41 67 67 2c   pHaving, isAgg,
e6d0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   0) ){.      got
e6e0: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
e6f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
e700: 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
e710: 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
e720: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
e730: 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
e740: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
e750: 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
e760: 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
e770: 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
e780: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
e790: 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
e7a0: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
e7b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
e7c0: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
e7d0: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
e7e0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
e7f0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
e800: 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
e810: 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d;..  /* Identif
e820: 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
e830: 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
e840: 6e 67 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  ng in the callba
e850: 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
e860: 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
e870: 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
e880: 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  going to a table
e890: 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   or a memory cel
e8a0: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  l..  */.  if( eD
e8b0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
e8c0: 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
e8d0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
e8e0: 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 54  rse, p->base, pT
e8f0: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
e900: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
e910: 68 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a  he limiter.  */.
e920: 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c    if( p->nLimit<
e930: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69  =0 ){.    p->nLi
e940: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d  mit = -1;.    p-
e950: 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
e960: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
e970: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
e980: 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
e990: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e9a0: 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69  Integer, -p->nLi
e9b0: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mit, 0);.    sql
e9c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e9d0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
e9e0: 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c  m, 1);.    p->nL
e9f0: 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 20  imit = iMem;.   
ea00: 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3c   if( p->nOffset<
ea10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
ea20: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
ea30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4d 65  }else{.      iMe
ea40: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
ea50: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
ea60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ea70: 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66  Integer, -p->nOf
ea80: 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  fset, 0);.      
ea90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
eaa0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
eab0: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
eac0: 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 69 4d 65  p->nOffset = iMe
ead0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
eae0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
eaf0: 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
eb00: 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
eb10: 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66   clause.  */.  f
eb20: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
eb30: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
eb40: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
eb50: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d  ->a[i].pSelect==
eb60: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
eb70: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
eb80: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d  Parse, pTabList-
eb90: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53  >a[i].pSelect, S
eba0: 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62 61  RT_TempTable, ba
ebb0: 73 65 2b 69 2c 0a 20 20 20 20 20 20 20 20 20 20  se+i,.          
ebc0: 20 20 20 20 20 20 20 70 2c 20 69 2c 20 26 69 73         p, i, &is
ebd0: 41 67 67 29 3b 0a 20 20 20 20 70 54 61 62 4c 69  Agg);.    pTabLi
ebe0: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
ebf0: 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
ec00: 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44  here;.    if( eD
ec10: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
ec20: 6b 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  k ){.      pOrde
ec30: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
ec40: 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
ec50: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
ec60: 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
ec70: 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
ec80: 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
ec90: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
eca0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
ecb0: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
ecc0: 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74   a subquery that
ecd0: 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e   can be "flatten
ece0: 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72  ed" into its par
ecf0: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61  ent..  ** If fla
ed00: 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73  ttening is a pos
ed10: 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61  siblity, do so a
ed20: 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
ed30: 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20  ately.  .  */.  
ed40: 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
ed50: 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
ed60: 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
ed70: 72 79 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ry(pParent, pare
ed80: 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
ed90: 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
eda0: 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
edb0: 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
edc0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
edd0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
ede0: 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
edf0: 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
ee00: 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
ee10: 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
ee20: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
ee30: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
ee40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ee50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
ee60: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a   iParm, 0);.  }.
ee70: 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c  .  /* Do an anal
ee80: 79 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74  ysis of aggregat
ee90: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  e expressions.. 
eea0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72   */.  sqliteAggr
eeb0: 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70  egateInfoReset(p
eec0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73  Parse);.  if( is
eed0: 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
eee0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d  t( pParse->nAgg=
eef0: 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
ef00: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
ef10: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
ef20: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e  if( sqliteExprAn
ef30: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
ef40: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
ef50: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
ef60: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
ef70: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
ef80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47      }.    if( pG
ef90: 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
efa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
efb0: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
efc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
efd0: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
efe0: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
eff0: 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
f000: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
f010: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
f020: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
f030: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f040: 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26    if( pHaving &&
f050: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
f060: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
f070: 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29 7b  rse, pHaving) ){
f080: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
f090: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
f0a0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
f0b0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
f0c0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
f0d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
f0e0: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
f0f0: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
f100: 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  s(pParse, pOrder
f110: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
f120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
f130: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
f140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f150: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
f160: 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
f170: 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ator.  */.  if( 
f180: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c  isAgg ){.    sql
f190: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f1a0: 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c 20  OP_AggReset, 0, 
f1b0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20  pParse->nAgg);. 
f1c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f1d0: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
f1e0: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
f1f0: 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66  *pFunc;.      if
f200: 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73  ( (pFunc = pPars
f210: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63  e->aAgg[i].pFunc
f220: 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78  )!=0 && pFunc->x
f230: 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
f240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
f250: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
f260: 49 6e 69 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20  Init, 0, i);.   
f270: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
f280: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
f290: 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f  char*)pFunc, P3_
f2a0: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20  POINTER);.      
f2b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f2c0: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
f2d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f2e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
f2f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
f300: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f310: 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20  v, OP_AggFocus, 
f320: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
f330: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
f340: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  e the memory cel
f350: 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20  l to NULL.  */. 
f360: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
f370: 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Mem ){.    sqlit
f380: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f390: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
f3a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f3b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
f3c0: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
f3d0: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
f3e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
f3f0: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
f400: 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
f410: 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
f420: 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e  ct ){.    distin
f430: 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
f440: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  b++;.    sqliteV
f450: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
f460: 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69 6e 63  penTemp, distinc
f470: 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 1);.  }else{.
f480: 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
f490: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
f4a0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
f4b0: 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e  scan.  */.  pWIn
f4c0: 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65  fo = sqliteWhere
f4d0: 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 2d  Begin(pParse, p-
f4e0: 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  >base, pTabList,
f4f0: 20 70 57 68 65 72 65 2c 20 30 2c 20 26 70 4f 72   pWhere, 0, &pOr
f500: 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 57  derBy);.  if( pW
f510: 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
f520: 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
f530: 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
f540: 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20  d inner loop if 
f550: 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69  we are not deali
f560: 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67  ng with.  ** agg
f570: 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  regates.  */.  i
f580: 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  f( !isAgg ){.   
f590: 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
f5a0: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
f5b0: 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
f5c0: 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
f5d0: 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
f5f0: 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
f600: 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
f610: 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20 20  Break) ){.      
f620: 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
f630: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f640: 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c  * If we are deal
f650: 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61  ing with aggrega
f660: 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  tes, then do the
f670: 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61   special aggrega
f680: 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  te.  ** processi
f690: 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73  ng.  .  */.  els
f6a0: 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  e{.    if( pGrou
f6b0: 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
f6c0: 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72   lbl1;.      for
f6d0: 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
f6e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f6f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
f700: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
f710: 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
f720: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
f730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f740: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
f750: 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
f760: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
f770: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
f780: 65 5f 66 6f 72 6d 61 74 3e 3d 33 20 29 20 73 71  e_format>=3 ) sq
f790: 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 76  liteAddKeyType(v
f7a0: 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
f7b0: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
f7c0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
f7d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
f7e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
f7f0: 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29  gFocus, 0, lbl1)
f800: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
f810: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
f820: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f830: 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  f( pParse->aAgg[
f840: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
f850: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
f860: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
f870: 73 65 2c 20 70 50 61 72 73 65 2d 3e 61 41 67 67  se, pParse->aAgg
f880: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
f890: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f8a0: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74  dOp(v, OP_AggSet
f8b0: 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  , 0, i);.      }
f8c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f8d0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f8e0: 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20   lbl1);.    }.  
f8f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
f900: 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b  rse->nAgg; i++){
f910: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
f920: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
f930: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
f940: 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
f950: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
f960: 20 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 41   pE = pParse->aA
f970: 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  gg[i].pExpr;.   
f980: 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
f990: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
f9a0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ON );.      if( 
f9b0: 70 45 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pE->pList ){.   
f9c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
f9d0: 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
f9e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
f9f0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
fa00: 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
fa10: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
fa20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fa30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
fa40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
fa50: 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
fa60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
fa70: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 75  ddOp(v, OP_AggFu
fa80: 6e 63 2c 20 30 2c 20 70 45 2d 3e 70 4c 69 73 74  nc, 0, pE->pList
fa90: 20 3f 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45   ? pE->pList->nE
faa0: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
fab0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
fac0: 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 21 3d 30  aAgg[i].pFunc!=0
fad0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
fae0: 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  ( pParse->aAgg[i
faf0: 5d 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d  ].pFunc->xStep!=
fb00: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
fb10: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
fb20: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 50 61 72   -1, (char*)pPar
fb30: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
fb40: 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  c, P3_POINTER);.
fb50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fb60: 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
fb70: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f   scan loop..  */
fb80: 0a 20 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e  .  sqliteWhereEn
fb90: 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
fba0: 20 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65   If we are proce
fbb0: 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73  ssing aggregates
fbc0: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74  , we need to set
fbd0: 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f   up a second loo
fbe0: 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20  p.  ** over all 
fbf0: 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
fc00: 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63   values and proc
fc10: 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ess them..  */. 
fc20: 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
fc30: 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73    int endagg = s
fc40: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
fc50: 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73  el(v);.    int s
fc60: 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61  tartagg;.    sta
fc70: 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64  rtagg = sqliteVd
fc80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
fc90: 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67  gNext, 0, endagg
fca0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75  );.    pParse->u
fcb0: 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69  seAgg = 1;.    i
fcc0: 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
fcd0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
fce0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
fcf0: 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c  aving, startagg,
fd00: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
fd10: 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
fd20: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
fd30: 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
fd40: 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
fd50: 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
fd60: 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
fd70: 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61  , startagg, enda
fd80: 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
fd90: 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
fda0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
fdb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
fdc0: 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29  to, 0, startagg)
fdd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
fde0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
fdf0: 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  endagg);.    sql
fe00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fe10: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
fe20: 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
fe30: 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
fe40: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
fe50: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fe60: 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
fe70: 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
fe80: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
fe90: 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
fea0: 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
feb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
fec0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
fed0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
fee0: 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
fef0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
ff00: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 73 73  ;.  }...  /* Iss
ff10: 75 65 20 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61  ue a null callba
ff20: 63 6b 20 69 66 20 74 68 61 74 20 69 73 20 77 68  ck if that is wh
ff30: 61 74 20 74 68 65 20 75 73 65 72 20 77 61 6e 74  at the user want
ff40: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  s..  */.  if( (p
ff50: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
ff60: 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61   & SQLITE_NullCa
ff70: 6c 6c 62 61 63 6b 29 21 3d 30 20 26 26 20 65 44  llback)!=0 && eD
ff80: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
ff90: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  k ){.    sqliteV
ffa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
ffb0: 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c  ullCallback, pEL
ffc0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  ist->nExpr, 0);.
ffd0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45    }..  /* The SE
ffe0: 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
fff0: 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
10000 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
10010 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
10020 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
10030 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
10040 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
10050 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
10060 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
10070 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
10080 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
10090 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
100a0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
100b0 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
100c0 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
100d0 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 41   base;.  sqliteA
100e0 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65  ggregateInfoRese
100f0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  t(pParse);.  ret
10100 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.