/ Hex Artifact Content
Login

Artifact afdc06d4606d14ab5793ef480206def6b02a2f19:


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 32 38  select.c,v 1.128
0200: 20 32 30 30 33 2f 30 33 2f 32 37 20 31 32 3a 35   2003/03/27 12:5
0210: 31 3a 32 35 20 64 72 68 20 45 78 70 20 24 0a 2a  1:25 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 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c  elect *sqliteSel
02a0: 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69  ectNew(.  ExprLi
02b0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
02c0: 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  /* which columns
02d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
02e0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53  he result */.  S
02f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
0300: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
0310: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
0320: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
0330: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0340: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  e,         /* th
0350: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
0360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
0370: 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65  roupBy,   /* the
0380: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0390: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
03a0: 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  ing,        /* t
03b0: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
03c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
03d0: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74  pOrderBy,   /* t
03e0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
03f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  se */.  int isDi
0400: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a  stinct,       /*
0410: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
0420: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
0430: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
0440: 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20  t nLimit,       
0450: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
0460: 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  ue.  -1 means no
0470: 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t used */.  int 
0480: 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  nOffset         
0490: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
04a0: 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74  e.  -1 means not
04b0: 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65   used */.){.  Se
04c0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
04d0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
04e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
04f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0520: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0530: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
0540: 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Src);.    sqlite
0550: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
0560: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  e);.    sqliteEx
0570: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72  prListDelete(pGr
0580: 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
0590: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61  teExprDelete(pHa
05a0: 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
05b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
05c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c  pOrderBy);.  }el
05d0: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  se{.    pNew->pE
05e0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
05f0: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
0600: 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pSrc;.    pNew->
0610: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0620: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
0630: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
0640: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
0650: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
0660: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
0670: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
0680: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
0690: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20   = isDistinct;. 
06a0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b     pNew->op = TK
06b0: 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65  _SELECT;.    pNe
06c0: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  w->nLimit = nLim
06d0: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  it;.    pNew->nO
06e0: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
06f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
0700: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ew;.}../*.** Giv
0710: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0720: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0730: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0740: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0750: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0760: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0770: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0780: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0790: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
07a0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
07b0: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
07c0: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
07d0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  ER.**     JT_OUT
07e0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
07f0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0800: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0810: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0820: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0830: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0840: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0850: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0860: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0870: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0880: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0890: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
08a0: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
08b0: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
08c0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
08d0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
08e0: 20 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28   sqliteJoinType(
08f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0900: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0910: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0920: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0930: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0940: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0950: 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  *p;.  static str
0960: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
0970: 63 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a  char *zKeyword;.
0980: 20 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20      int nChar;. 
0990: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d     int code;.  }
09a0: 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a   keywords[] = {.
09b0: 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c      { "natural",
09c0: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d   7, JT_NATURAL }
09d0: 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20  ,.    { "left", 
09e0: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
09f0: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0a00: 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54  "right",   5, JT
0a10: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0a20: 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c  },.    { "full",
0a30: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0a40: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0a50: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72   },.    { "outer
0a60: 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52  ",   5, JT_OUTER
0a70: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72   },.    { "inner
0a80: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0a90: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73   },.    { "cross
0aa0: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0ab0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0ac0: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0ad0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0ae0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
0af0: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
0b00: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
0b10: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
0b20: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
0b30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
0b40: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0b50: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
0b60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
0b70: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
0b80: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
0b90: 20 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72      && sqliteStr
0ba0: 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77  NICmp(p->z, keyw
0bb0: 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64  ords[j].zKeyword
0bc0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
0bd0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
0be0: 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f  = keywords[j].co
0bf0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
0c00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
0c10: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65  .    if( j>=size
0c20: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
0c30: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
0c40: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
0c50: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
0c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0c70: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
0c80: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
0c90: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
0ca0: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
0cb0: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
0cc0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
0cd0: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
0ce0: 20 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64    static Token d
0cf0: 75 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b  ummy = { 0, 0 };
0d00: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20  .    char *zSp1 
0d10: 3d 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22  = " ", *zSp2 = "
0d20: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0d30: 30 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79  0 ){ pB = &dummy
0d40: 3b 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20  ; zSp1 = 0; }.  
0d50: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70    if( pC==0 ){ p
0d60: 43 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32  C = &dummy; zSp2
0d70: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69   = 0; }.    sqli
0d80: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
0d90: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
0da0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
0db0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0dc0: 3a 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70  : ", 0,.       p
0dd0: 41 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70  A->z, pA->n, zSp
0de0: 31 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d  1, 1, pB->z, pB-
0df0: 3e 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d  >n, zSp2, 1, pC-
0e00: 3e 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20  >z, pC->n, 0);. 
0e10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
0e20: 2b 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  +;.    jointype 
0e30: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
0e40: 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65  lse if( jointype
0e50: 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20   & JT_RIGHT ){. 
0e60: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
0e70: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
0e80: 4d 73 67 2c 20 0a 20 20 20 20 20 20 22 52 49 47  Msg, .      "RIG
0e90: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
0ea0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
0eb0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
0ec0: 74 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ted", 0);.    pP
0ed0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0ee0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
0ef0: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
0f00: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
0f10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f20: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
0f30: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
0f40: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
0f50: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
0f60: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
0f70: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
0f80: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
0f90: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
0fa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
0fb0: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
0fc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
0fd0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
0fe0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
0ff0: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
1000: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
1010: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
1020: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1030: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72  ./*.** Add a ter
1040: 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65  m to the WHERE e
1050: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70  xpression in *pp
1060: 45 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72  Expr that requir
1070: 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63  es the.** zCol c
1080: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61  olumn to be equa
1090: 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62  l in the two tab
10a0: 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54  les pTab1 and pT
10b0: 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ab2..*/.static v
10c0: 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d  oid addWhereTerm
10d0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
10e0: 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  zCol,        /* 
10f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1100: 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  mn */.  const Ta
1110: 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20  ble *pTab1,     
1120: 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20   /* First table 
1130: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1140: 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a   *pTab2,      /*
1150: 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   Second table */
1160: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
1170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1180: 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  dd the equality 
1190: 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70  term to this exp
11a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
11b0: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45  Token dummy;.  E
11c0: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
11d0: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
11e0: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
11f0: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
1200: 0a 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43  ..  dummy.z = zC
1210: 6f 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20  ol;.  dummy.n = 
1220: 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20  strlen(zCol);.  
1230: 64 75 6d 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20  dummy.dyn = 0;. 
1240: 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 45 78   pE1a = sqliteEx
1250: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
1260: 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20  &dummy);.  pE2a 
1270: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
1280: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1290: 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70  );.  dummy.z = p
12a0: 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64  Tab1->zName;.  d
12b0: 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  ummy.n = strlen(
12c0: 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62  dummy.z);.  pE1b
12d0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
12e0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
12f0: 79 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20  y);.  dummy.z = 
1300: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
1310: 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e  dummy.n = strlen
1320: 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32  (dummy.z);.  pE2
1330: 62 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  b = sqliteExpr(T
1340: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
1350: 6d 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71  my);.  pE1c = sq
1360: 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c  liteExpr(TK_DOT,
1370: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1380: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1390: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32  Expr(TK_DOT, pE2
13a0: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
13b0: 45 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  E = sqliteExpr(T
13c0: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
13d0: 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50  , 0);.  ExprSetP
13e0: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
13f0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20  romJoin);.  if( 
1400: 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a  *ppExpr ){.    *
1410: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45  ppExpr = sqliteE
1420: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45  xpr(TK_AND, *ppE
1430: 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d  xpr, pE, 0);.  }
1440: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 45 78 70  else{.    *ppExp
1450: 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r = pE;.  }.}../
1460: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
1470: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1480: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
1490: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
14a0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
14b0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
14c0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
14d0: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
14e0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
14f0: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
1500: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
1510: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
1520: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
1530: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
1540: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
1550: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
1560: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
1570: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
1580: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
1590: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
15a0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
15b0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
15c0: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
15d0: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
15e0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
15f0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
1600: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
1610: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
1620: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
1630: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
1640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
1650: 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77  pr(Expr *p){.  w
1660: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
1670: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1680: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1690: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
16a0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  p->pLeft);.    p
16b0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
16c0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
16d0: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
16e0: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
16f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
1700: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1710: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
1720: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
1730: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
1740: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
1750: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
1760: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
1770: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
1780: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
1790: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
17a0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
17b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
17c0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
17d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
17e0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
17f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1800: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
1810: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e  List *pSrc;.  in
1820: 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d  t i, j;.  pSrc =
1830: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28   p->pSrc;.  for(
1840: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
1850: 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  c-1; i++){.    s
1860: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1870: 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 53 72  em *pTerm = &pSr
1880: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  c->a[i];.    str
1890: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
18a0: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 53 72 63   *pOther = &pSrc
18b0: 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69  ->a[i+1];..    i
18c0: 66 28 20 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d  f( pTerm->pTab==
18d0: 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61  0 || pOther->pTa
18e0: 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
18f0: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
1900: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
1910: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
1920: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
1930: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
1940: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
1950: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
1960: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
1970: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1980: 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pTerm->jointype 
1990: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a  & JT_NATURAL ){.
19a0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
19b0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  b;.      if( pTe
19c0: 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d  rm->pOn || pTerm
19d0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
19e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
19f0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
1a00: 72 4d 73 67 2c 20 22 61 20 4e 41 54 55 52 41 4c  rMsg, "a NATURAL
1a10: 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61   join may not ha
1a20: 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ve ".           
1a30: 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  "an ON or USING 
1a40: 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20  clause", 0);.   
1a50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
1a60: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
1a70: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1a80: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 65 72       pTab = pTer
1a90: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 66  m->pTab;.      f
1aa0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1ab0: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1ac0: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
1ad0: 64 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62  dex(pOther->pTab
1ae0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  , pTab->aCol[j].
1af0: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
1b00: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
1b10: 65 72 6d 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  erm(pTab->aCol[j
1b20: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2c 20 70  ].zName, pTab, p
1b30: 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d  Other->pTab, &p-
1b40: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b60: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
1b70: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
1b80: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
1b90: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
1ba0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65    */.    if( pTe
1bb0: 72 6d 2d 3e 70 4f 6e 20 26 26 20 70 54 65 72 6d  rm->pOn && pTerm
1bc0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
1bd0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
1be0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
1bf0: 73 67 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  sg, "cannot have
1c00: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1c10: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
1c20: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1c30: 65 20 6a 6f 69 6e 22 2c 20 30 29 3b 0a 20 20 20  e join", 0);.   
1c40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
1c50: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
1c60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1c70: 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75   Add the ON clau
1c80: 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
1c90: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1ca0: 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a  e, connected by.
1cb0: 20 20 20 20 2a 2a 20 61 6e 64 20 41 4e 44 20 6f      ** and AND o
1cc0: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
1cd0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1ce0: 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  On ){.      setJ
1cf0: 6f 69 6e 45 78 70 72 28 70 54 65 72 6d 2d 3e 70  oinExpr(pTerm->p
1d00: 4f 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  On);.      if( p
1d10: 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20  ->pWhere==0 ){. 
1d20: 20 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65         p->pWhere
1d30: 20 3d 20 70 54 65 72 6d 2d 3e 70 4f 6e 3b 0a 20   = pTerm->pOn;. 
1d40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d50: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
1d60: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e  sqliteExpr(TK_AN
1d70: 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 54  D, p->pWhere, pT
1d80: 65 72 6d 2d 3e 70 4f 6e 2c 20 30 29 3b 0a 20 20  erm->pOn, 0);.  
1d90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72      }.      pTer
1da0: 6d 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  m->pOn = 0;.    
1db0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
1dc0: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
1dd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1de0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
1df0: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
1e00: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
1e10: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
1e20: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
1e30: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
1e40: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
1e50: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
1e60: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
1e70: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
1e80: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
1e90: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1ea0: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
1eb0: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
1ec0: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
1ed0: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
1ee0: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
1ef0: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
1f00: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
1f10: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
1f20: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
1f30: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
1f40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72   */.    if( pTer
1f50: 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  m->pUsing ){.   
1f60: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
1f70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
1f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
1f90: 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 3b 0a 20  Src->nSrc-1 );. 
1fa0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 54 65       pList = pTe
1fb0: 72 6d 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  rm->pUsing;.    
1fc0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
1fd0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
1fe0: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
1ff0: 6e 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e 70 54  nIndex(pTerm->pT
2000: 61 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  ab, pList->a[j].
2010: 7a 4e 61 6d 65 29 3c 30 20 7c 7c 0a 20 20 20 20  zName)<0 ||.    
2020: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e          columnIn
2030: 64 65 78 28 70 4f 74 68 65 72 2d 3e 70 54 61 62  dex(pOther->pTab
2040: 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  , pList->a[j].zN
2050: 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  ame)<0 ){.      
2060: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
2070: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
2080: 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  rMsg, "cannot jo
2090: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
20a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
20b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
20c0: 2c 20 22 20 2d 20 63 6f 6c 75 6d 6e 20 6e 6f 74  , " - column not
20d0: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
20e0: 20 74 61 62 6c 65 73 22 2c 20 30 29 3b 0a 20 20   tables", 0);.  
20f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2100: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
2110: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2120: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
2130: 64 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74  dWhereTerm(pList
2140: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[j].zName, pT
2150: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65  erm->pTab, pOthe
2160: 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68  r->pTab, &p->pWh
2170: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
2180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2190: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
21a0: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
21b0: 65 6e 74 73 20 61 20 6d 69 6e 69 6d 61 6c 20 4f  ents a minimal O
21c0: 72 61 63 6c 65 38 20 6a 6f 69 6e 20 73 79 6e 74  racle8 join synt
21d0: 61 78 20 69 6d 6d 75 6c 61 74 69 6f 6e 2e 0a 2a  ax immulation..*
21e0: 2a 20 54 68 65 20 70 72 65 63 69 73 65 20 6f 72  * The precise or
21f0: 61 63 6c 65 38 20 73 79 6e 74 61 78 20 69 73 20  acle8 syntax is 
2200: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  not implemented 
2210: 2d 20 69 74 20 69 73 20 65 61 73 79 20 65 6e 6f  - it is easy eno
2220: 75 67 68 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ugh.** to get th
2230: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 66 75  is routine confu
2240: 73 65 64 2e 20 20 42 75 74 20 74 68 69 73 20 72  sed.  But this r
2250: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6d 61 6b 65  outine does make
2260: 20 69 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   it possible.** 
2270: 74 6f 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  to write a singl
2280: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2290: 74 68 61 74 20 64 6f 65 73 20 61 20 6c 65 66 74  that does a left
22a0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 6e 20 62   outer join in b
22b0: 6f 74 68 0a 2a 2a 20 6f 72 61 63 6c 65 38 20 61  oth.** oracle8 a
22c0: 6e 64 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a  nd in SQLite..**
22d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22e0: 20 6c 6f 6f 6b 73 20 66 6f 72 20 54 4b 5f 43 4f   looks for TK_CO
22f0: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
2300: 6e 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 6d  nodes that are m
2310: 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  arked.** with th
2320: 65 20 45 50 5f 4f 72 61 63 6c 65 38 4a 6f 69 6e  e EP_Oracle8Join
2330: 20 70 72 6f 70 65 72 74 79 2e 20 20 53 75 63 68   property.  Such
2340: 20 6e 6f 64 65 73 20 61 72 65 20 67 65 6e 65 72   nodes are gener
2350: 61 74 65 64 20 62 79 20 61 0a 2a 2a 20 63 6f 6c  ated by a.** col
2360: 75 6d 6e 20 6e 61 6d 65 20 28 65 69 74 68 65 72  umn name (either
2370: 20 22 63 6f 6c 75 6d 6e 22 20 6f 72 20 22 74 61   "column" or "ta
2380: 62 6c 65 2e 63 6f 6c 75 6d 6e 22 29 20 74 68 61  ble.column") tha
2390: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t is followed by
23a0: 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 61 6c 20  .** the special 
23b0: 22 28 2b 29 22 20 6f 70 65 72 61 74 6f 72 2e 20  "(+)" operator. 
23c0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 66   If the table of
23d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6d 61 72 6b   the column mark
23e0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 28  ed with.** the (
23f0: 2b 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74  +) operator is t
2400: 68 65 20 73 65 63 6f 6e 64 20 61 72 65 20 73 75  he second are su
2410: 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 20 69  bsequent table i
2420: 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 0a 2a  n a join, then.*
2430: 2a 20 74 68 61 74 20 74 61 62 6c 65 20 62 65 63  * that table bec
2440: 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 20 74 61  omes the left ta
2450: 62 6c 65 20 69 6e 20 61 20 4c 45 46 54 20 4f 55  ble in a LEFT OU
2460: 54 45 52 20 4a 4f 49 4e 2e 20 20 54 68 65 20 65  TER JOIN.  The e
2470: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61  xpression.** tha
2480: 74 20 75 73 65 73 20 74 68 61 74 20 74 61 62 6c  t uses that tabl
2490: 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f  e becomes part o
24a0: 66 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  f the ON clause 
24b0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 2e 0a 2a 2a  for the join..**
24c0: 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
24d0: 61 6e 74 20 74 6f 20 65 6e 70 68 61 73 69 7a 65  ant to enphasize
24e0: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f   that this is no
24f0: 74 20 65 78 61 63 74 6c 79 20 68 6f 77 20 6f 72  t exactly how or
2500: 61 63 6c 65 38 0a 2a 2a 20 77 6f 72 6b 73 2e 20  acle8.** works. 
2510: 20 42 75 74 20 69 74 20 69 73 20 63 6c 6f 73 65   But it is close
2520: 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
2530: 6f 6e 65 20 63 61 6e 20 63 6f 6e 73 74 72 75 63  one can construc
2540: 74 20 71 75 65 72 69 65 73 20 74 68 61 74 0a 2a  t queries that.*
2550: 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 63 6f 72 72  * will work corr
2560: 65 63 74 6c 79 20 66 6f 72 20 62 6f 74 68 20 53  ectly for both S
2570: 51 4c 69 74 65 20 61 6e 64 20 4f 72 61 63 6c 65  QLite and Oracle
2580: 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  8..*/.static int
2590: 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a 6f   sqliteOracle8Jo
25a0: 69 6e 46 69 78 75 70 28 0a 20 20 69 6e 74 20 62  inFixup(.  int b
25b0: 61 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ase,         /* 
25c0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
25d0: 65 72 20 66 6f 72 20 66 69 72 73 74 20 74 61 62  er for first tab
25e0: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
25f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
2600: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
2610: 6c 65 73 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  les being joined
2620: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2630: 72 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  re      /* The W
2640: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
2650: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2660: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
2670: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78  rc = 0;.  if( Ex
2680: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
2690: 68 65 72 65 2c 20 45 50 5f 4f 72 61 63 6c 65 38  here, EP_Oracle8
26a0: 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
26b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
26c0: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
26d0: 70 57 68 65 72 65 2d 3e 69 54 61 62 6c 65 20 2d  pWhere->iTable -
26e0: 20 62 61 73 65 3b 0a 20 20 20 20 61 73 73 65 72   base;.    asser
26f0: 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2700: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
2710: 20 20 20 69 66 28 20 69 64 78 3e 30 20 29 7b 0a     if( idx>0 ){.
2720: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 64        pSrc->a[id
2730: 78 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 3d  x-1].jointype &=
2740: 20 7e 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 20 20   ~JT_INNER;.    
2750: 20 20 70 53 72 63 2d 3e 61 5b 69 64 78 2d 31 5d    pSrc->a[idx-1]
2760: 2e 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f  .jointype |= JT_
2770: 4f 55 54 45 52 7c 4a 54 5f 4c 45 46 54 3b 0a 20  OUTER|JT_LEFT;. 
2780: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2790: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
27a0: 57 68 65 72 65 2d 3e 70 52 69 67 68 74 20 29 7b  Where->pRight ){
27b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27c0: 4f 72 61 63 6c 65 38 4a 6f 69 6e 46 69 78 75 70  Oracle8JoinFixup
27d0: 28 62 61 73 65 2c 20 70 53 72 63 2c 20 70 57 68  (base, pSrc, pWh
27e0: 65 72 65 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  ere->pRight);.  
27f0: 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 2d 3e  }.  if( pWhere->
2800: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 72 63 20  pLeft ){.    rc 
2810: 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38  |= sqliteOracle8
2820: 4a 6f 69 6e 46 69 78 75 70 28 62 61 73 65 2c 20  JoinFixup(base, 
2830: 70 53 72 63 2c 20 70 57 68 65 72 65 2d 3e 70 4c  pSrc, pWhere->pL
2840: 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
2850: 70 57 68 65 72 65 2d 3e 70 4c 69 73 74 20 29 7b  pWhere->pList ){
2860: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2870: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2880: 3d 20 70 57 68 65 72 65 2d 3e 70 4c 69 73 74 3b  = pWhere->pList;
2890: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20  pList->nExpr && 
28b0: 72 63 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  rc==0; i++){.   
28c0: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 4f     rc |= sqliteO
28d0: 72 61 63 6c 65 38 4a 6f 69 6e 46 69 78 75 70 28  racle8JoinFixup(
28e0: 62 61 73 65 2c 20 70 53 72 63 2c 20 70 4c 69 73  base, pSrc, pLis
28f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
2900: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2910: 72 63 3d 3d 31 20 26 26 20 28 70 57 68 65 72 65  rc==1 && (pWhere
2920: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20  ->op==TK_AND || 
2930: 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 45  pWhere->op==TK_E
2940: 51 29 20 29 7b 0a 20 20 20 20 73 65 74 4a 6f 69  Q) ){.    setJoi
2950: 6e 45 78 70 72 28 70 57 68 65 72 65 29 3b 0a 20  nExpr(pWhere);. 
2960: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
2970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2980: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2990: 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72  given Select str
29a0: 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f  ucture and all o
29b0: 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  f its substructu
29c0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
29d0: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
29e0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
29f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
2a00: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73  .  sqliteExprLis
2a10: 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69 73  tDelete(p->pELis
2a20: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72 63 4c  t);.  sqliteSrcL
2a30: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 72  istDelete(p->pSr
2a40: 63 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  c);.  sqliteExpr
2a50: 44 65 6c 65 74 65 28 70 2d 3e 70 57 68 65 72 65  Delete(p->pWhere
2a60: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c  );.  sqliteExprL
2a70: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72  istDelete(p->pGr
2a80: 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  oupBy);.  sqlite
2a90: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48  ExprDelete(p->pH
2aa0: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
2ab0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2ac0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
2ad0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
2ae0: 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  e(p->pPrior);.  
2af0: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 53  sqliteFree(p->zS
2b00: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2b10: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2b20: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67 67  * Delete the agg
2b30: 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2b40: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  on from the pars
2b50: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2b60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2b70: 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
2b80: 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  eset(Parse *pPar
2b90: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  se){.  sqliteFre
2ba0: 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b  e(pParse->aAgg);
2bb0: 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20  .  pParse->aAgg 
2bc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
2bd0: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
2be0: 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 7d  e->useAgg = 0;.}
2bf0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2c00: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2c10: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2c20: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2c30: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2c40: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2c50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2c60: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2c80: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2c90: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
2ca0: 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65 72  char *zSortOrder
2cb0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a 53 6f  ;.  int i;.  zSo
2cc0: 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65  rtOrder = sqlite
2cd0: 4d 61 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42 79  Malloc( pOrderBy
2ce0: 2d 3e 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a 20  ->nExpr + 1 );. 
2cf0: 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72 3d   if( zSortOrder=
2d00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
2d10: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
2d20: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
2d30: 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 20 3d  .    int order =
2d40: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2d50: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69  sortOrder;.    i
2d60: 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 69 6e 74  nt type;.    int
2d70: 20 63 3b 0a 20 20 20 20 69 66 28 20 28 6f 72 64   c;.    if( (ord
2d80: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
2d90: 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  YPEMASK)==SQLITE
2da0: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
2db0: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2dc0: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  SO_TEXT;.    }el
2dd0: 73 65 20 69 66 28 20 28 6f 72 64 65 72 20 26 20  se if( (order & 
2de0: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
2df0: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  SK)==SQLITE_SO_N
2e00: 55 4d 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65  UM ){.      type
2e10: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
2e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2e30: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
2e40: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
2e50: 20 20 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74      type = sqlit
2e60: 65 45 78 70 72 54 79 70 65 28 70 4f 72 64 65 72  eExprType(pOrder
2e70: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2e80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e90: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2ea0: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 0a 20 20  SO_NUM;.    }.  
2eb0: 20 20 69 66 28 20 28 6f 72 64 65 72 20 26 20 53    if( (order & S
2ec0: 51 4c 49 54 45 5f 53 4f 5f 44 49 52 4d 41 53 4b  QLITE_SO_DIRMASK
2ed0: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  )==SQLITE_SO_ASC
2ee0: 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 74 79   ){.      c = ty
2ef0: 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45  pe==SQLITE_SO_TE
2f00: 58 54 20 3f 20 27 41 27 20 3a 20 27 2b 27 3b 0a  XT ? 'A' : '+';.
2f10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f20: 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54   c = type==SQLIT
2f30: 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 44 27 20  E_SO_TEXT ? 'D' 
2f40: 3a 20 27 2d 27 3b 0a 20 20 20 20 7d 0a 20 20 20  : '-';.    }.   
2f50: 20 7a 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d   zSortOrder[i] =
2f60: 20 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78   c;.    sqliteEx
2f70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2f80: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f90: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 7a 53 6f 72  xpr);.  }.  zSor
2fa0: 74 4f 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d  tOrder[pOrderBy-
2fb0: 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 73  >nExpr] = 0;.  s
2fc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2fd0: 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79  , OP_SortMakeKey
2fe0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
2ff0: 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56  r, 0);.  sqliteV
3000: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3010: 31 2c 20 7a 53 6f 72 74 4f 72 64 65 72 2c 20 73  1, zSortOrder, s
3020: 74 72 6c 65 6e 28 7a 53 6f 72 74 4f 72 64 65 72  trlen(zSortOrder
3030: 29 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  ));.  sqliteFree
3040: 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20  (zSortOrder);.  
3050: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3060: 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30  v, OP_SortPut, 0
3070: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
3080: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
3090: 20 61 20 50 33 20 61 72 67 75 6d 65 6e 74 20 74   a P3 argument t
30a0: 6f 20 74 68 65 20 6c 61 73 74 20 56 44 42 45 20  o the last VDBE 
30b0: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 61 73 0a  opcode that was.
30c0: 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20 54 68 65  ** inserted. The
30d0: 20 50 33 20 61 72 67 75 6d 65 6e 74 20 61 64 64   P3 argument add
30e0: 65 64 20 69 73 20 61 20 73 74 72 69 6e 67 20 73  ed is a string s
30f0: 75 69 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  uitable for the 
3100: 0a 2a 2a 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 6f  .** OP_MakeKey o
3110: 72 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  r OP_MakeIdxKey 
3120: 6f 70 63 6f 64 65 73 2e 20 20 54 68 65 20 73 74  opcodes.  The st
3130: 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f 66  ring consists of
3140: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 27  .** characters '
3150: 74 27 20 6f 72 20 27 6e 27 20 64 65 70 65 6e 64  t' or 'n' depend
3160: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
3170: 72 20 6e 6f 74 20 74 68 65 20 76 61 72 69 6f 75  r not the variou
3180: 73 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74  s.** fields of t
3190: 68 65 20 6b 65 79 20 74 6f 20 62 65 20 67 65 6e  he key to be gen
31a0: 65 72 61 74 65 64 20 73 68 6f 75 6c 64 20 62 65  erated should be
31b0: 20 74 72 65 61 74 65 64 20 61 73 20 6e 75 6d 65   treated as nume
31c0: 72 69 63 0a 2a 2a 20 6f 72 20 61 73 20 74 65 78  ric.** or as tex
31d0: 74 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d  t.  See the OP_M
31e0: 61 6b 65 4b 65 79 20 61 6e 64 20 4f 50 5f 4d 61  akeKey and OP_Ma
31f0: 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 0a  keIdxKey opcode.
3200: 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ** documentation
3210: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
3220: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
3230: 74 20 74 68 65 20 50 33 20 73 74 72 69 6e 67 2e  t the P3 string.
3240: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
3250: 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79   sqliteAddIdxKey
3260: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
3270: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
3280: 64 4b 65 79 54 79 70 65 28 56 64 62 65 20 2a 76  dKeyType(Vdbe *v
3290: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
32a0: 73 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  st){.  int nColu
32b0: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
32c0: 70 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  pr;.  char *zTyp
32d0: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
32e0: 28 20 6e 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ( nColumn+1 );. 
32f0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 54   int i;.  if( zT
3300: 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ype==0 ) return;
3310: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
3320: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
3330: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 73 71 6c 69   zType[i] = sqli
3340: 74 65 45 78 70 72 54 79 70 65 28 70 45 4c 69 73  teExprType(pELis
3350: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d  t->a[i].pExpr)==
3360: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 3f 20  SQLITE_SO_NUM ? 
3370: 27 6e 27 20 3a 20 27 74 27 3b 0a 20 20 7d 0a 20  'n' : 't';.  }. 
3380: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 30 3b 0a 20   zType[i] = 0;. 
3390: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
33a0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65  eP3(v, -1, zType
33b0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71  , nColumn);.  sq
33c0: 6c 69 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b  liteFree(zType);
33d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
33e0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
33f0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
3400: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
3410: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
3420: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
3430: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
3440: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
3450: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
3460: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
3470: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
3480: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
3490: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
34a0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
34b0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
34c0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
34d0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
34e0: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
34f0: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
3500: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
3510: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
3520: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
3530: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
3540: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3550: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
3560: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3570: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
3580: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3590: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
35a0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
35b0: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
35c0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
35d0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
35e0: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
35f0: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
3600: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
3610: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
3620: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
3630: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
3640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3650: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3660: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  in the source ta
3670: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
3680: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3690: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
36a0: 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73   sort results us
36b0: 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a  ing this key */.
36c0: 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20    int distinct, 
36d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
36e0: 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72  >=0, make sure r
36f0: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69  esults are disti
3700: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  nct */.  int eDe
3710: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
3720: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
3730: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
3740: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
3750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3760: 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  * An argument to
3770: 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65   the disposal me
3780: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  thod */.  int iC
3790: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
37a0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
37b0: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
37c0: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
37d0: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
37e0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
37f0: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
3800: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
3810: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
3820: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
3830: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  e;.  int i;..  i
3840: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
3850: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   0;.  assert( pE
3860: 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  List!=0 );..  /*
3870: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
3880: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
3890: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
38a0: 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68  ment, then do th
38b0: 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20  e check.  ** to 
38c0: 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20  see if this row 
38d0: 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74  should be output
38e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
38f0: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
3900: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
3910: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
3920: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  dr = sqliteVdbeC
3930: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
3940: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3950: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
3960: 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 2c 20  cr, p->nOffset, 
3970: 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 73  addr+2);.      s
3980: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3990: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
39a0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
39b0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69      if( p->nLimi
39c0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t>=0 ){.      sq
39d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
39e0: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
39f0: 6e 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  nLimit, iBreak);
3a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3a10: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
3a20: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
3a30: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
3a40: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3a50: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
3a60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
3a70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3a80: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
3a90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
3aa0: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
3ab0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3ac0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
3ad0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3ae0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
3af0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3b00: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3b10: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3b20: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3b30: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3b40: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3b50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3b60: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3b70: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3b80: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3b90: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3ba0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3bb0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3bc0: 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e  .  if( distinct>
3bd0: 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26 26 20  =0 && pEList && 
3be0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
3bf0: 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41  ){.#if NULL_ALWA
3c00: 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  YS_DISTINCT.    
3c10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3c20: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70  v, OP_IsNull, -p
3c30: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71  EList->nExpr, sq
3c40: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
3c50: 64 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69  ddr(v)+7);.#endi
3c60: 66 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  f.    sqliteVdbe
3c70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3c80: 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Key, pEList->nEx
3c90: 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
3ca0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
3cb0: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c  _format>=4 ) sql
3cc0: 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 76 2c  iteAddKeyType(v,
3cd0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
3ce0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3cf0: 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69   OP_Distinct, di
3d00: 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65 56 64  stinct, sqliteVd
3d10: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3d20: 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  +3);.    sqliteV
3d30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3d40: 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  op, pEList->nExp
3d50: 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  r+1, 0);.    sql
3d60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3d70: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
3d80: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
3d90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3da0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3db0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3dc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3dd0: 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  rKey, distinct, 
3de0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  0);.  }..  switc
3df0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
3e00: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
3e10: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
3e20: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
3e30: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
3e40: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
3e50: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3e60: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
3e70: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
3e80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3e90: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3ea0: 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41  olumn, NULL_ALWA
3eb0: 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20  YS_DISTINCT);.  
3ec0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3ed0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3ee0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
3ef0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3f00: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3f10: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3f30: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
3f40: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
3f50: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
3f60: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
3f70: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
3f80: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
3f90: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
3fa0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3fb0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3fc0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3fd0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3fe0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
3ff0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4000: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
4010: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4020: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4030: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
4040: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
4050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4060: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4070: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
4080: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4090: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
40a0: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
40b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
40c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
40d0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
40e0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
40f0: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
4100: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
4110: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
4120: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
4130: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
4140: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
4150: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
4160: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
4170: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4180: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
4190: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
41a0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
41b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
41c0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
41d0: 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59  lumn, NULL_ALWAY
41e0: 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20  S_DISTINCT);.   
41f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4200: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
4210: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
4220: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4230: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
4240: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29  elete, iParm, 0)
4250: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4260: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4270: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
4280: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
4290: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
42a0: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
42b0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
42c0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
42d0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
42e0: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
42f0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
4300: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
4310: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
4320: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
4330: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4340: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
4350: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
4360: 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
4370: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4390: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
43a0: 4e 75 6c 6c 2c 20 2d 31 2c 20 6c 62 6c 29 3b 0a  Null, -1, lbl);.
43b0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
43c0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
43d0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
43e0: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
43f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4410: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4420: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
4430: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4440: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
4450: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
4460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4470: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
4480: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
4490: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
44a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
44b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
44c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
44d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
44e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
44f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
4500: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
4510: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
4520: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
4530: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
4540: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
4550: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
4560: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
4570: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
4580: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4590: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
45a0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
45b0: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
45c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
45d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
45e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
45f0: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4600: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4610: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4620: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
4630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4650: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
4660: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
4670: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ck function..   
4680: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4690: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
46a0: 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20  ase SRT_Sorter: 
46b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
46c0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
46d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
46e0: 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65  v, OP_SortMakeRe
46f0: 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  c, nColumn, 0);.
4700: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4710: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4720: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
4730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4740: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
4750: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b  =SRT_Callback );
4760: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4770: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4780: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
4790: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
47a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
47b0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
47c0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
47d0: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c  handle the resul
47e0: 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74  ts.  The subrout
47f0: 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ine itself.    *
4800: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
4810: 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65   for popping the
4820: 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20   results off of 
4830: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
4840: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
4850: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
4860: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4870: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4880: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4890: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
48a0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
48b0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
48c0: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
48d0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
48e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
48f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4900: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4910: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4930: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
4940: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
4950: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
4960: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
4970: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
4980: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
4990: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
49a0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
49b0: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
49c0: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
49d0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
49e0: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
49f0: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4a00: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4a10: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4a20: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
4a30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
4a40: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
4a50: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
4a60: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
4a70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4a80: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4a90: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4aa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4ab0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4ac0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
4ad0: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
4ae0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
4af0: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
4b00: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
4b10: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
4b20: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
4b30: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
4b40: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
4b50: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
4b60: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
4b70: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
4b80: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
4b90: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
4ba0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
4bb0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
4bc0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
4bd0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
4be0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 53 65 6c  eSortTail(.  Sel
4bf0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4c00: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4c10: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
4c20: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
4c30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4c40: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
4c50: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4c60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4c70: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
4c80: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
4c90: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4ca0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
4cb0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
4cc0: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
4cd0: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
4ce0: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4cf0: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4d00: 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c 69 74 65  int end = sqlite
4d10: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4d20: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
4d30: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4d40: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
4d50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4d60: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c  p(v, OP_Sort, 0,
4d70: 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71   0);.  addr = sq
4d80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4d90: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4da0: 20 65 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e   end);.  if( p->
4db0: 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  nOffset>0 ){.   
4dc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4dd0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
4de0: 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 61 64 64 72  p->nOffset, addr
4df0: 2b 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  +4);.    sqliteV
4e00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4e10: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
4e20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4e30: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
4e40: 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dr);.  }.  if( p
4e50: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
4e60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4e70: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
4e80: 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 65 6e 64  , p->nLimit, end
4e90: 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  );.  }.  switch(
4ea0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
4eb0: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4ec0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   {.      sqliteV
4ed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4ee0: 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  ortCallback, nCo
4ef0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4f00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4f10: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4f20: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
4f30: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
4f40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4f50: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
4f60: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4f70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4f80: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
4f90: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4fa0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4fb0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
4fc0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4fd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4fe0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4ff0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
5000: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
5010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5020: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31  v, OP_IsNull, -1
5030: 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  , sqliteVdbeCurr
5040: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
5050: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5060: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
5070: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
5080: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5090: 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
50a0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
50b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
50c0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
50d0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
50e0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
50f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5100: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
5110: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
5120: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5130: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5140: 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 20  , 0, end);.     
5150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5160: 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f    case SRT_Subro
5170: 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
5180: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
5190: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
51a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
51b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
51c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69   OP_Column, -1-i
51d0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
51e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
51f0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
5200: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
5210: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5220: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
5230: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5240: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
5250: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
5260: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
5270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5280: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65    }.  sqliteVdbe
5290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
52a0: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  , 0, addr);.  sq
52b0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
52c0: 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20  abel(v, end);.  
52d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
52e0: 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c  v, OP_SortReset,
52f0: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
5300: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5310: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
5320: 65 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74  e VDBE the datat
5330: 79 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  ypes of.** colum
5340: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
5350: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   set..**.** This
5360: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65   routine only ge
5370: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20  nerates code if 
5380: 74 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77  the "PRAGMA show
5390: 5f 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a  _datatypes=on".*
53a0: 2a 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75  * has been execu
53b0: 74 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79  ted.  The dataty
53c0: 70 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  pes are reported
53d0: 20 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f   out in the azCo
53e0: 6c 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74  l.** parameter t
53f0: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
5400: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
5410: 72 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e  rst N azCol[] en
5420: 74 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65  tries.** are the
5430: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
5440: 6c 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73  lumns, and the s
5450: 65 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20  econd N entries 
5460: 61 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  are the.** datat
5470: 79 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  ypes for the col
5480: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  umns..**.** The 
5490: 22 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61  "datatype" for a
54a0: 20 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20   result that is 
54b0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79  a column of a ty
54c0: 70 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74  pe is the.** dat
54d0: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
54e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
54f0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5500: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54   statement..** T
5510: 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  he datatype for 
5520: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
5530: 20 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20   either TEXT or 
5540: 4e 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a  NUMERIC.  The.**
5550: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20   datatype for a 
5560: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
5570: 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69  NTEGER..*/.stati
5580: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
5590: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
55a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
55b0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
55c0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  ext */.  int bas
55d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
55e0: 56 44 42 45 20 63 75 72 73 6f 72 20 63 6f 72 72  VDBE cursor corr
55f0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 66 69 72  esponding to fir
5600: 73 74 20 65 6e 74 72 79 20 69 6e 20 70 54 61 62  st entry in pTab
5610: 4c 69 73 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  List */.  SrcLis
5620: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
5630: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
5640: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
5650: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
5660: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
5670: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5680: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5690: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
56a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
56b0: 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62  pParse->useCallb
56c0: 61 63 6b 20 26 26 20 28 70 50 61 72 73 65 2d 3e  ack && (pParse->
56d0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
56e0: 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 29 3d  TE_ReportTypes)=
56f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5700: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
5710: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5720: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
5730: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
5740: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 68  i].pExpr;.    ch
5750: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
5760: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
5770: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
5780: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
5790: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
57a0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
57b0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
57c0: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
57d0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ].pTab;.      in
57e0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
57f0: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 69  umn;.      if( i
5800: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
5810: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
5820: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
5830: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
5840: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
5850: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
5860: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
5870: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
5880: 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ER";.      }else
5890: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
58a0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
58b0: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
58c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
58d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
58e0: 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54 45  rType(p)==SQLITE
58f0: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
5900: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
5910: 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  T";.      }else{
5920: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
5930: 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20   "NUMERIC";.    
5940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
5950: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5960: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
5970: 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  i + pEList->nExp
5980: 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
5990: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
59a0: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50 33 5f 53   -1, zType, P3_S
59b0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  TATIC);.  }.}../
59c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
59d0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
59e0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
59f0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
5a00: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
5a10: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
5a20: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
5a30: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
5a40: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6f 6c 75 65  * azCol[] vaolue
5a50: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
5a60: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
5a70: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
5a80: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
5a90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5aa0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5ab0: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
5ac0: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
5ad0: 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
5ae0: 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e  ding to first en
5af0: 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20  try in pTabList 
5b00: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
5b10: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
5b20: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
5b30: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5b40: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
5b50: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
5b60: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
5b70: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5b80: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5b90: 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
5ba0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
5bb0: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
5bc0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
5bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
5be0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
5bf0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
5c00: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5c10: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
5c20: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  p;.    char *zTy
5c30: 70 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  pe = 0;.    int 
5c40: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20  showFullNames;. 
5c50: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
5c60: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
5c70: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
5c80: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
5c90: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
5ca0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
5cb0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
5cc0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
5cd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5ce0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
5cf0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
5d00: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5d10: 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  3(v, -1, zName, 
5d20: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
5d30: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5d40: 20 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 46 75      }.    showFu
5d50: 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72 73  llNames = (pPars
5d60: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
5d70: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
5d80: 65 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  es)!=0;.    if( 
5d90: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
5da0: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
5db0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
5dc0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5dd0: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
5de0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68  ].pTab;.      ch
5df0: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
5e00: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
5e10: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
5e20: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
5e30: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
5e40: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
5e50: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
5e60: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
5e70: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
5e80: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
5e90: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57      zCol = "_ROW
5ea0: 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7a 54  ID_";.        zT
5eb0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
5ec0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5ed0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
5ee0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
5ef0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 54 79  ame;.        zTy
5f00: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5f10: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
5f20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5f30: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
5f40: 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f  pan.z[0] && !sho
5f50: 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  wFullNames ){.  
5f60: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
5f70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5f80: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
5f90: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
5fa0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5fb0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70  eP3(v, -1, p->sp
5fc0: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5fd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5fe0: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
5ff0: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
6000: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
6010: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  List->nSrc>1 || 
6020: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b  showFullNames ){
6030: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
6040: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
6050: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
6060: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
6070: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54  TabList->a[p->iT
6080: 61 62 6c 65 20 2d 20 62 61 73 65 5d 2e 7a 41 6c  able - base].zAl
6090: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ias;.        if(
60a0: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 7c   showFullNames |
60b0: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
60c0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
60d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
60e0: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
60f0: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
6100: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
6110: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6120: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
6130: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
6140: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6150: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
6160: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
6170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
6180: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
6190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
61a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
61b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
61c0: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
61d0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
61e0: 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c 20  P3(v, -1, zCol, 
61f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6200: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
6210: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6220: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
6230: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
6240: 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c  beAddOp(v,OP_Col
6250: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
6260: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6270: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6280: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
6290: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  an.n);.      sql
62a0: 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53  iteVdbeCompressS
62b0: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
62c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
62d0: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
62e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
62f0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
6300: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
6310: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
6320: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
6330: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
6340: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6350: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
6360: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
6370: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6380: 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74  v, -1, zName, st
6390: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
63a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
63b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
63c0: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
63d0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
63e0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
63f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6400: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
6410: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
6420: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
6430: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
6440: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
6450: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
6460: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
6470: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
6480: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
6490: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
64a0: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
64b0: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
64c0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
64d0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
64e0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
64f0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
6500: 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn z;.}../*.** F
6510: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
6520: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
6530: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
6540: 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74  t(Parse*, Select
6550: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  *);../*.** Given
6560: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
6570: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
6580: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
6590: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
65a0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
65b0: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
65c0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
65d0: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
65e0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
65f0: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
6600: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
6610: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
6620: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  b;.  int i;.  Ex
6630: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
6640: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
6650: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
6660: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
6670: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6680: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
6690: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
66a0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
66b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
66c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
66d0: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
66e0: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
66f0: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
6700: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
6710: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
6720: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
6730: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
6740: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
6750: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
6760: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
6770: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
6780: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
6790: 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  l );.  for(i=0; 
67a0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
67b0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
67c0: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
67d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
67e0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
67f0: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
6800: 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  eStrDup(pEList->
6810: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
6820: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70 45   }else if( (p=pE
6830: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6840: 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  )->span.z && p->
6850: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
6860: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
6870: 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ing(&pTab->aCol[
6880: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61  i].zName, p->spa
6890: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20  n.z, p->span.n, 
68a0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
68b0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
68c0: 26 26 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20  && p->pRight && 
68d0: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
68e0: 2e 7a 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  .z &&.          
68f0: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
6900: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6910: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
6920: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  (&pTab->aCol[i].
6930: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
6940: 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f     p->pRight->to
6950: 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69 67 68 74  ken.z, p->pRight
6960: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
6970: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6980: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
6990: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
69a0: 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  f, "column%d", i
69b0: 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  +1);.      pTab-
69c0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  >aCol[i].zName =
69d0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42   sqliteStrDup(zB
69e0: 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  uf);.    }.  }. 
69f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
6a00: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
6a10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
6a20: 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
6a30: 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 68  statement, do th
6a40: 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a  ree things..**.*
6a50: 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20 69  *    (1)  Fill i
6a60: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
6a70: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
6a80: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
6a90: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
6aa0: 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74 20  defines the set 
6ab0: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
6ac0: 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65 64  hould be scanned
6ad0: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  . .**.**    (2) 
6ae0: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
6af0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6b00: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
6b10: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
6b20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
6b30: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
6b40: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
6b50: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
6b60: 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74 68      (3)  Scan th
6b70: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
6b80: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
6b90: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
6ba0: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
6bb0: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
6bc0: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
6bd0: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
6be0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
6bf0: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
6c00: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
6c10: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
6c20: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
6c30: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
6c40: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
6c50: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
6c60: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
6c70: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
6c80: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
6c90: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
6ca0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
6cb0: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
6cc0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
6cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6ce0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
6cf0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6d00: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
6d10: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
6d20: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6d30: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
6d40: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
6d50: 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d  *pTab;..  if( p=
6d60: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
6d70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
6d80: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
6d90: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
6da0: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c  >pEList;..  /* L
6db0: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
6dc0: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
6dd0: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  list..  */.  for
6de0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
6df0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
6e00: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6e10: 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20  a[i].pTab ){.   
6e20: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
6e30: 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
6e40: 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e!  No need to c
6e50: 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20  ontinue */.     
6e60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6e70: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
6e80: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
6e90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
6ea0: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
6eb0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
6ec0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
6ed0: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
6ee0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21  t->a[i].pSelect!
6ef0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
6f00: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6f10: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
6f20: 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61      char zFakeNa
6f30: 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20  me[60];.        
6f40: 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d  sprintf(zFakeNam
6f50: 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  e, "sqlite_subqu
6f60: 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20  ery_%p_",.      
6f70: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62       (void*)pTab
6f80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6f90: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
6fa0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 54  iteSetString(&pT
6fb0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6fc0: 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20  ias, zFakeName, 
6fd0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6fe0: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
6ff0: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
7000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65          sqliteRe
7010: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
7020: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
7030: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
7070: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
7080: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7090: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
70a0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
70b0: 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61       pTab->isTra
70c0: 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  nsient = 1;.    
70d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
70e0: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
70f0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
7100: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7110: 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 4c  e */.      pTabL
7120: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  ist->a[i].pTab =
7130: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
7140: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
7150: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
7160: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
7170: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
71a0: 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[i].zDatabase)
71b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
71c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
71d0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
71e0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
71f0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
7200: 20 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   ", .           
7210: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
7220: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
7230: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7240: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7250: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7260: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
7270: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
7280: 66 28 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  f( sqliteViewGet
7290: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
72a0: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
72b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
72c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
72d0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
72e0: 65 6c 65 74 65 28 70 54 61 62 4c 69 73 74 2d 3e  elete(pTabList->
72f0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
7300: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
7310: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[i].pSelect = 
7320: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
7330: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
7340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7350: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
7360: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
7370: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
7380: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
7390: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
73a0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
73b0: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
73c0: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
73d0: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
73e0: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
73f0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
7400: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
7410: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
7420: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
7430: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
7440: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
7450: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
7460: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
7470: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
7480: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
7490: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
74a0: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
74b0: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
74c0: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
74d0: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
74e0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
74f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
7500: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
7510: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
7520: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
7530: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
7540: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
7550: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
7560: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
7570: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
7580: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
7590: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
75a0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
75b0: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
75c0: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
75d0: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
75e0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
75f0: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
7600: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
7610: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
7620: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
7630: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
7640: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
7650: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
7660: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
7670: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
7680: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
7690: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
76a0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
76b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
76c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
76d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
76e0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
76f0: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
7700: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
7710: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
7720: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
7730: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
7740: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
7750: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
7760: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
7770: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
7780: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
7790: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
77a0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
77b0: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
77c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
77d0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
77e0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
77f0: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
7800: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
7810: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
7820: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
7830: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
7840: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
7850: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
7860: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
7870: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
7880: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
7890: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
78a0: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
78b0: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
78c0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
78d0: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
78e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
78f0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78   pNew = sqliteEx
7900: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
7910: 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30  w, a[k].pExpr, 0
7920: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
7930: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
7940: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
7950: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b  Name;.        a[
7960: 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
7970: 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
7980: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
7990: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
79a0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
79b0: 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
79c0: 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
79d0: 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
79e0: 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
79f0: 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
7a00: 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
7a10: 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
7a20: 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
7a30: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
7a40: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
7a50: 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
7a60: 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
7a70: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
7a80: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c  TK_DOT && pE->pL
7a90: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
7aa0: 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c   pName = &pE->pL
7ab0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
7ac0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7ad0: 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a       pName = 0;.
7ae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7af0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
7b00: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
7b10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
7b20: 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c  le *pTab = pTabL
7b30: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a  ist->a[i].pTab;.
7b40: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7b50: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c  zTabName = pTabL
7b60: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
7b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7b80: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
7b90: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
7ba0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
7bb0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
7bc0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7bd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7be0: 70 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  pName && (zTabNa
7bf0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
7c00: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7c20: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d  iteStrNICmp(pNam
7c30: 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  e->z, zTabName, 
7c40: 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a  pName->n)!=0 ||.
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d   zTabName[pName-
7c70: 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  >n]!=0) ){.     
7c80: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7c90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7ca0: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
7cb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
7cc0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
7cd0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
7ce0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7cf0: 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70  Expr, *pLeft, *p
7d00: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
7d10: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
7d20: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
7d30: 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20  Name;..         
7d40: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 28 70     if( i>0 && (p
7d50: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7d60: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
7d70: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
7d90: 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
7da0: 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20  t->a[i-1].pTab, 
7db0: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
7dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7dd0: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
7de0: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
7df0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
7e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
7e10: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
7e20: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
7e30: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7e50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
7e60: 30 20 26 26 20 73 71 6c 69 74 65 49 64 4c 69 73  0 && sqliteIdLis
7e70: 74 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d  tIndex(pTabList-
7e80: 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20  >a[i-1].pUsing, 
7e90: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
7ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7eb0: 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
7ec0: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
7ed0: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
7ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
7ef0: 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
7f00: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
7f10: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7f30: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7f40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7f50: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
7f60: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
7f70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7f80: 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20    if( pRight==0 
7f90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
7fa0: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7fb0: 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  en.z = zName;.  
7fc0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
7fd0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c  ->token.n = strl
7fe0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  en(zName);.     
7ff0: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
8000: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
8010: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
8020: 61 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69  abName && pTabLi
8030: 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
8040: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
8050: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
8060: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8080: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
8090: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
80a0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
80b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
80c0: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
80e0: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  eft->token.z = z
80f0: 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  TabName;.       
8100: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
8110: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
8120: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
8130: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
8140: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
8150: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8160: 74 65 53 65 74 53 74 72 69 6e 67 28 28 63 68 61  teSetString((cha
8170: 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e  r**)&pExpr->span
8180: 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e  .z, zTabName, ".
8190: 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", zName, 0);.  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
81b0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c  r->span.n = strl
81c0: 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  en(pExpr->span.z
81d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
81e0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
81f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
8200: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
8210: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .z = 0;.        
8220: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8230: 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.n = 0;.      
8240: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
8250: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
8260: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8280: 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
82a0: 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72  pr->span = pExpr
82b0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
82c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
82d0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
82e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
82f0: 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  New, pExpr, 0);.
8300: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8310: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8320: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
8330: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
8340: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
8350: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
8360: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8370: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74  rMsg, "no such t
8380: 61 62 6c 65 3a 20 22 2c 20 2d 31 2c 20 0a 20 20  able: ", -1, .  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d              pNam
83a0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
83b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
83c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
83d0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
83e0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
83f0: 67 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  g, "no tables sp
8400: 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
8410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8420: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
8430: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8440: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 78    }.    sqliteEx
8450: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
8460: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
8470: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
8480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8490: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
84a0: 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 20 75  ne recursively u
84b0: 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c 65 63  nlinks the Selec
84c0: 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20  t.pSrc.a[].pTab 
84d0: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61  pointers.** in a
84e0: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
84f0: 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65 74 73  e.  It just sets
8500: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
8510: 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20   NULL.  This.** 
8520: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63 75 72  routine is recur
8530: 73 69 76 65 20 69 6e 20 74 68 65 20 73 65 6e 73  sive in the sens
8540: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 53 65  e that if the Se
8550: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53  lect.pSrc.a[].pS
8560: 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  elect.** pointer
8570: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
8580: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8590: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
85a0: 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74 65 72   on that pointer
85b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
85c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
85d0: 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  n the Select str
85e0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
85f0: 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e  nes a.** VIEW in
8600: 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f 20 61   order to undo a
8610: 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f 20 74  ny bindings to t
8620: 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69 73 20  ables.  This is 
8630: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63  necessary.** bec
8640: 61 75 73 65 20 74 68 6f 73 65 20 74 61 62 6c 65  ause those table
8650: 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f 50 65  s might be DROPe
8660: 64 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e  d by a subsequen
8670: 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  t SQL command..*
8680: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65 6c  /.void sqliteSel
8690: 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65 63 74  ectUnbind(Select
86a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
86b0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
86c0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61 62 6c   p->pSrc;.  Tabl
86d0: 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70  e *pTab;.  if( p
86e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
86f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
8700: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
8710: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 53 72   if( (pTab = pSr
8720: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21 3d 30  c->a[i].pTab)!=0
8730: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
8740: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
8750: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8760: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  eDeleteTable(0, 
8770: 70 54 61 62 29 3b 0a 23 69 66 20 30 0a 20 20 20  pTab);.#if 0.   
8780: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
8790: 74 44 65 6c 65 74 65 28 70 53 72 63 2d 3e 61 5b  tDelete(pSrc->a[
87a0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
87b0: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e       pSrc->a[i].
87c0: 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 23 65 6e  pSelect = 0;.#en
87d0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
87e0: 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61    pSrc->a[i].pTa
87f0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
8800: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pSrc->a[i].pSel
8810: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
8820: 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e  qliteSelectUnbin
8830: 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  d(pSrc->a[i].pSe
8840: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
8850: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8860: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
8870: 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65  ssociates entrie
8880: 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s in an ORDER BY
8890: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
88a0: 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   with.** columns
88b0: 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46   in a result.  F
88c0: 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59  or each ORDER BY
88d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
88e0: 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68   opcode of.** th
88f0: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
8900: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
8910: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
8920: 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f   iColumn value o
8930: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
8940: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
8950: 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e  d in with column
8960: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
8970: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
8980: 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
8990: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
89a0: 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61  with iTable para
89b0: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  meter..**.** If 
89c0: 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20  there are prior 
89d0: 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20  SELECT clauses, 
89e0: 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73  they are process
89f0: 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74  ed first.  A mat
8a00: 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c  ch.** in an earl
8a10: 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73  ier SELECT takes
8a20: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
8a30: 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e   a later SELECT.
8a40: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79  .**.** Any entry
8a50: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
8a60: 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20  atch is flagged 
8a70: 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  as an error.  Th
8a80: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
8a90: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
8aa0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
8ab0: 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 63  utine does NOT c
8ac0: 6f 72 72 65 63 74 6c 79 20 69 6e 69 74 69 61 6c  orrectly initial
8ad0: 69 7a 65 20 74 68 65 20 45 78 70 72 2e 64 61 74  ize the Expr.dat
8ae0: 61 54 79 70 65 20 20 66 69 65 6c 64 0a 2a 2a 20  aType  field.** 
8af0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
8b00: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 54 68  expressions.  Th
8b10: 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72  e multiSelectSor
8b20: 74 4f 72 64 65 72 28 29 20 72 6f 75 74 69 6e 65  tOrder() routine
8b30: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  .** must be call
8b40: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 20 61 66  ed to do that af
8b50: 74 65 72 20 74 68 65 20 69 6e 64 69 76 69 64 75  ter the individu
8b60: 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  al select statem
8b70: 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 61 6c 6c  ents.** have all
8b80: 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 20   been analyzed. 
8b90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8ba0: 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 75   unable to compu
8bb0: 74 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65  te Expr.dataType
8bc0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 6d  .** because it m
8bd0: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
8be0: 66 6f 72 65 20 74 68 65 20 69 6e 64 69 76 69 64  fore the individ
8bf0: 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74 65  ual select state
8c00: 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 62 65  ments.** have be
8c10: 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a  en analyzed..*/.
8c20: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
8c30: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
8c40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8c50: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
8c60: 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65  place to leave e
8c70: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
8c80: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
8c90: 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ct,        /* Ma
8ca0: 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f  tch to result co
8cb0: 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45  lumns of this SE
8cc0: 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69  LECT */.  ExprLi
8cd0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
8ce0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
8cf0: 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63  Y values to matc
8d00: 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  h against column
8d10: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
8d20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
8d30: 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61  * Insert this va
8d40: 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f  lue in iTable */
8d50: 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c  .  int mustCompl
8d60: 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ete        /* If
8d70: 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20   TRUE all ORDER 
8d80: 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a  BYs must match *
8d90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  /.){.  int nErr 
8da0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
8db0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8dc0: 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c  ist;..  if( pSel
8dd0: 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72  ect==0 || pOrder
8de0: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  By==0 ) return 1
8df0: 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70  ;.  if( mustComp
8e00: 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  lete ){.    for(
8e10: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
8e20: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f  >nExpr; i++){ pO
8e30: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8e40: 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69  e = 0; }.  }.  i
8e50: 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c  f( fillInColumnL
8e60: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
8e70: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
8e80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
8e90: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
8ea0: 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68  ){.    if( match
8eb0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
8ec0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
8ed0: 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42  >pPrior, pOrderB
8ee0: 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b  y, iTable, 0) ){
8ef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
8f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
8f10: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
8f20: 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
8f30: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8f40: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
8f50: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
8f60: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8f70: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
8f80: 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  1;.    if( pOrde
8f90: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
8fa0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8fb0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  f( sqliteExprIsI
8fc0: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
8fd0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
8fe0: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
8ff0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
9000: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75          char zBu
9010: 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  f[200];.        
9020: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 4f 52  sprintf(zBuf,"OR
9030: 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20  DER BY position 
9040: 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74  %d should be bet
9050: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a  ween 1 and %d",.
9060: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c             iCol,
9070: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
9080: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
9090: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
90a0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 42 75 66 2c  ->zErrMsg, zBuf,
90b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
90c0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
90d0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
90e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
90f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d    }.      if( !m
9100: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f  ustComplete ) co
9110: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43  ntinue;.      iC
9120: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
9130: 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20  for(j=0; iCol<0 
9140: 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  && j<pEList->nEx
9150: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
9160: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  if( pEList->a[j]
9170: 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f  .zName && (pE->o
9180: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e  p==TK_ID || pE->
9190: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29  op==TK_STRING) )
91a0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
91b0: 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a  zName, *zLabel;.
91c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
91d0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
91e0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  me;.        asse
91f0: 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 20  rt( pE->token.z 
9200: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65  );.        zLabe
9210: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
9220: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
9230: 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  E->token.n);.   
9240: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
9250: 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  te(zLabel);.    
9260: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
9270: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61  rICmp(zName, zLa
9280: 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20  bel)==0 ){ .    
9290: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
92a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
92b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61    sqliteFree(zLa
92c0: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
92d0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
92e0: 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70  & sqliteExprComp
92f0: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
9300: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
9310: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
9320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9330: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
9340: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d  {.      pE->op =
9350: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
9360: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
9370: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e  iCol;.      pE->
9380: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
9390: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
93a0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a  >a[i].done = 1;.
93b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
93c0: 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70  ol<0 && mustComp
93d0: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 63 68  lete ){.      ch
93e0: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
93f0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
9400: 22 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20  "%d",i+1);.     
9410: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
9420: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
9430: 67 2c 20 22 4f 52 44 45 52 20 42 59 20 74 65 72  g, "ORDER BY ter
9440: 6d 20 6e 75 6d 62 65 72 20 22 2c 20 7a 42 75 66  m number ", zBuf
9450: 2c 20 0a 20 20 20 20 20 20 20 20 22 20 64 6f 65  , .        " doe
9460: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
9470: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20  result column", 
9480: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
9490: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
94a0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72  nErr++;.      br
94b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
94c0: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
94d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
94e0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
94f0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
9500: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
9510: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
9520: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
9530: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
9540: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
9550: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
9560: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
9570: 69 74 65 47 65 74 56 64 62 65 28 50 61 72 73 65  iteGetVdbe(Parse
9580: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
9590: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
95a0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
95b0: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
95c0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
95d0: 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61  teVdbeCreate(pPa
95e0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20  rse->db);.  }.  
95f0: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a  return v;.}../*.
9600: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9610: 73 65 74 73 20 74 68 65 20 45 78 70 72 2e 64 61  sets the Expr.da
9620: 74 61 54 79 70 65 20 66 69 65 6c 64 20 6f 6e 20  taType field on 
9630: 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a  all elements of.
9640: 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  ** the pOrderBy 
9650: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
9660: 20 20 54 68 65 20 70 4f 72 64 65 72 42 79 20 6c    The pOrderBy l
9670: 69 73 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ist will have be
9680: 65 6e 0a 2a 2a 20 73 65 74 20 75 70 20 62 79 20  en.** set up by 
9690: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
96a0: 6c 75 6d 6e 28 29 2e 20 20 48 65 6e 63 65 20 65  lumn().  Hence e
96b0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 68  ach expression h
96c0: 61 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d  as.** a TK_COLUM
96d0: 4e 20 61 73 20 69 74 73 20 72 6f 6f 74 20 6e 6f  N as its root no
96e0: 64 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  de.  The Expr.iC
96f0: 6f 6c 75 6d 6e 20 72 65 66 65 72 73 20 74 6f 20  olumn refers to 
9700: 61 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20  a .** column in 
9710: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
9720: 20 20 54 68 65 20 64 61 74 61 74 79 70 65 20 69    The datatype i
9730: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
9740: 53 4f 5f 54 45 58 54 0a 2a 2a 20 69 66 20 74 68  SO_TEXT.** if th
9750: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
9760: 63 6f 6c 75 6d 6e 20 69 6e 20 70 20 61 6e 64 20  column in p and 
9770: 65 76 65 72 79 20 53 45 4c 45 43 54 20 74 6f 20  every SELECT to 
9780: 74 68 65 20 6c 65 66 74 20 6f 66 0a 2a 2a 20 70  the left of.** p
9790: 20 68 61 73 20 61 20 64 61 74 61 74 79 70 65 20   has a datatype 
97a0: 6f 66 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  of SQLITE_SO_TEX
97b0: 54 2e 20 20 49 66 20 74 68 65 20 63 6f 6f 72 65  T.  If the coore
97c0: 73 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  ssponding column
97d0: 0a 2a 2a 20 69 6e 20 70 20 6f 72 20 61 6e 79 20  .** in p or any 
97e0: 6f 66 20 74 68 65 20 6c 65 66 74 20 53 45 4c 45  of the left SELE
97f0: 43 54 73 20 69 73 20 53 51 4c 49 54 45 5f 53 4f  CTs is SQLITE_SO
9800: 5f 4e 55 4d 2c 20 74 68 65 6e 20 74 68 65 20 64  _NUM, then the d
9810: 61 74 61 74 79 70 65 0a 2a 2a 20 6f 66 20 74 68  atatype.** of th
9820: 65 20 6f 72 64 65 72 2d 62 79 20 65 78 70 72 65  e order-by expre
9830: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
9840: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a  SQLITE_SO_NUM..*
9850: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  *.** Examples:.*
9860: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
9870: 54 41 42 4c 45 20 6f 6e 65 28 61 20 49 4e 54 45  TABLE one(a INTE
9880: 47 45 52 2c 20 62 20 54 45 58 54 29 3b 0a 2a 2a  GER, b TEXT);.**
9890: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
98a0: 45 20 74 77 6f 28 63 20 56 41 52 43 48 41 52 28  E two(c VARCHAR(
98b0: 35 29 2c 20 64 20 46 4c 4f 41 54 29 3b 0a 2a 2a  5), d FLOAT);.**
98c0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 62  .**     SELECT b
98d0: 2c 20 62 20 46 52 4f 4d 20 6f 6e 65 20 55 4e 49  , b FROM one UNI
98e0: 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46  ON SELECT d, c F
98f0: 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59  ROM two ORDER BY
9900: 20 31 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   1, 2;.**.** The
9910: 20 70 72 69 6d 61 72 79 20 73 6f 72 74 20 6b 65   primary sort ke
9920: 79 20 77 69 6c 6c 20 75 73 65 20 53 51 4c 49 54  y will use SQLIT
9930: 45 5f 53 4f 5f 4e 55 4d 20 62 65 63 61 75 73 65  E_SO_NUM because
9940: 20 74 68 65 20 22 64 22 20 69 6e 0a 2a 2a 20 74   the "d" in.** t
9950: 68 65 20 73 65 63 6f 6e 64 20 53 45 4c 45 43 54  he second SELECT
9960: 20 69 73 20 6e 75 6d 65 72 69 63 2e 20 20 54 68   is numeric.  Th
9970: 65 20 31 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  e 1st column of 
9980: 74 68 65 20 66 69 72 73 74 20 53 45 4c 45 43 54  the first SELECT
9990: 0a 2a 2a 20 69 73 20 74 65 78 74 20 62 75 74 20  .** is text but 
99a0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
99b0: 74 74 65 72 20 62 65 63 61 75 73 65 20 61 20 6e  tter because a n
99c0: 75 6d 65 72 69 63 20 61 6c 77 61 79 73 20 6f 76  umeric always ov
99d0: 65 72 72 69 64 65 73 0a 2a 2a 20 61 20 74 65 78  errides.** a tex
99e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  t..**.** The sec
99f0: 6f 6e 64 61 72 79 20 6b 65 79 20 77 69 6c 6c 20  ondary key will 
9a00: 75 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 53  use the SQLITE_S
9a10: 4f 5f 54 45 58 54 20 73 6f 72 74 20 6f 72 64 65  O_TEXT sort orde
9a20: 72 20 62 65 63 61 75 73 65 0a 2a 2a 20 62 6f 74  r because.** bot
9a30: 68 20 74 68 65 20 28 73 65 63 6f 6e 64 29 20 22  h the (second) "
9a40: 62 22 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  b" in the first 
9a50: 53 45 4c 45 43 54 20 61 6e 64 20 74 68 65 20 22  SELECT and the "
9a60: 63 22 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  c" in the second
9a70: 0a 2a 2a 20 53 45 4c 45 43 54 20 68 61 76 65 20  .** SELECT have 
9a80: 61 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 65  a datatype of te
9a90: 78 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  xt..*/ .static v
9aa0: 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 53  oid multiSelectS
9ab0: 6f 72 74 4f 72 64 65 72 28 53 65 6c 65 63 74 20  ortOrder(Select 
9ac0: 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *p, ExprList *pO
9ad0: 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69  rderBy){.  int i
9ae0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
9af0: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64  List;.  if( pOrd
9b00: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
9b10: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
9b20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9b30: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
9b40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  i++){.      pOrd
9b50: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
9b60: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c  ->dataType = SQL
9b70: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
9b80: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
9b90: 20 7d 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63 74   }.  multiSelect
9ba0: 53 6f 72 74 4f 72 64 65 72 28 70 2d 3e 70 50 72  SortOrder(p->pPr
9bb0: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  ior, pOrderBy);.
9bc0: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
9bd0: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
9be0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
9bf0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
9c00: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
9c10: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
9c20: 20 20 20 69 66 28 20 70 45 2d 3e 64 61 74 61 54     if( pE->dataT
9c30: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  ype==SQLITE_SO_N
9c40: 55 4d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  UM ) continue;. 
9c50: 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 69     assert( pE->i
9c60: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20  Column>=0 );.   
9c70: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
9c80: 70 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pr>pE->iColumn )
9c90: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 64 61 74 61  {.      pE->data
9ca0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 45 78 70  Type = sqliteExp
9cb0: 72 54 79 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b  rType(pEList->a[
9cc0: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pE->iColumn].pEx
9cd0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
9ce0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9cf0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
9d00: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
9d10: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
9d20: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
9d30: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
9d40: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
9d50: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
9d60: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
9d70: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
9d80: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
9d90: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
9da0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
9db0: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
9dc0: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
9dd0: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
9de0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
9df0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9e00: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9e10: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
9e20: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
9e30: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
9e40: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
9e50: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
9e60: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
9e70: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
9e80: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
9e90: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
9ea0: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
9eb0: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
9ec0: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
9ed0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
9ee0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
9ef0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
9f00: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
9f10: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
9f20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
9f30: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
9f40: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
9f50: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
9f60: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
9f70: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
9f80: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
9f90: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
9fa0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
9fc0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 63 20 46  --->  SELECT c F
9fd0: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
9fe0: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
9ff0: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
a000: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
a010: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
a020: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
a030: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a040: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
a050: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
a060: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
a070: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
a080: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
a090: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
a0a0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
a0b0: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
a0c0: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
a0d0: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
a0e0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
a0f0: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
a100: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
a110: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
a120: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
a130: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
a140: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
a150: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
a160: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
a170: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
a180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a190: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
a1a0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
a1b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
a1c0: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
a1d0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
a1e0: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
a1f0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
a200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
a210: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
a220: 69 73 20 56 44 42 45 20 2a 2f 0a 0a 20 20 2f 2a  is VDBE */..  /*
a230: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
a240: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
a250: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
a260: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74  SELECTs.  Only t
a270: 68 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45  he .  ** last SE
a280: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
a290: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
a2a0: 52 44 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20  RDER BY..  */.  
a2b0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
a2c0: 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
a2d0: 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  n 1;.  pPrior = 
a2e0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
a2f0: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
a300: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
a310: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
a320: 2d 3e 7a 45 72 72 4d 73 67 2c 22 4f 52 44 45 52  ->zErrMsg,"ORDER
a330: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
a340: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a  d come after ",.
a350: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
a360: 6d 65 28 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74  me(p->op), " not
a370: 20 62 65 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20   before", 0);.  
a380: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a390: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
a3a0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
a3b0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
a3c0: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
a3d0: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
a3e0: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
a3f0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
a400: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a410: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
a420: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  rn 1;..  /* Crea
a430: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
a440: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
a450: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
a460: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
a470: 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
a480: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
a490: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
a4a0: 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
a4b0: 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52  ;.    eDest = SR
a4c0: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
a4d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
a4e0: 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e   for the left an
a4f0: 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73  d right SELECT s
a500: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
a510: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
a520: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
a530: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
a540: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
a550: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
a560: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
a570: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
a580: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
a590: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a5a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
a5b0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
a5c0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  r = 0;.        r
a5d0: 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  c = sqliteSelect
a5e0: 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
a5f0: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
a600: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  0);.        p->p
a610: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
a620: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
a630: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a640: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a650: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
a660: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
a670: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
a680: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
a690: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
a6a0: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
a6b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
a6c0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
a6d0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
a6e0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
a6f0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
a700: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
a710: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
a720: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  t op;          /
a730: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
a740: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
a750: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
a760: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
a770: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
a780: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
a790: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
a7a0: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
a7b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a7c0: 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44  rBy;  /* The ORD
a7d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
a7e0: 20 74 68 65 20 72 69 67 68 74 20 53 45 4c 45 43   the right SELEC
a7f0: 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f  T */..      prio
a800: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
a810: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
a820: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
a830: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
a840: 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64  iorOp && p->pOrd
a850: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
a860: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
a870: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
a880: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
a890: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
a8a0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
a8b0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
a8c0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
a8d0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
a8e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
a8f0: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
a900: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
a910: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
a920: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
a930: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
a940: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
a950: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a960: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
a970: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
a980: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
a990: 42 79 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d  By .        && m
a9a0: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
a9b0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  umn(pParse, p, p
a9c0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f  ->pOrderBy, unio
a9d0: 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20 20 20  nTab, 1) ){.    
a9e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a9f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aa00: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
aa10: 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ALL ){.         
aa20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
aa30: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
aa40: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
aa50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
aa60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b  dbeAddOp(v, OP_K
aa70: 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54  eyAsData, unionT
aa80: 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ab, 1);.        
aa90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
aaa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
aab0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
aac0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
aad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
aae0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
aaf0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
ab00: 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
ab10: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
ab20: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
ab30: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
ab40: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
ab50: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nTab, 0, 0, 0);.
ab60: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
ab70: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
ab80: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
ab90: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
aba0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
abb0: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
abc0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63  op ){.         c
abd0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
abe0: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
abf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac00: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
ac10: 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69  :   op = SRT_Uni
ac20: 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  on;    break;.  
ac30: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41         case TK_A
ac40: 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54  LL:     op = SRT
ac50: 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b  _Table;    break
ac60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ac70: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
ac80: 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
ac90: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
aca0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
acb0: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
acc0: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
acd0: 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e  se, p, op, union
ace0: 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Tab, 0, 0, 0);. 
acf0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
ad00: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
ad10: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
ad20: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 69 66 28  derBy;.      if(
ad30: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
ad40: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
ad50: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
ad60: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
ad70: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
ad80: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
ad90: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
ada0: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
adb0: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
adc0: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
add0: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
ade0: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
adf0: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
ae00: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
ae10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ae20: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
ae30: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
ae40: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
ae50: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
ae60: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
ae70: 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 30 2c 20  se, p->base, 0, 
ae80: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
ae90: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
aea0: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
aeb0: 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53  , p->base, p->pS
aec0: 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  rc, p->pEList);.
aed0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aee0: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
aef0: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
af00: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
af10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
af20: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
af30: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
af40: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
af50: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
af60: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
af70: 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  rt = sqliteVdbeC
af80: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
af90: 20 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c 65         multiSele
afa0: 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20 70  ctSortOrder(p, p
afb0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
afc0: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
afd0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
afe0: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
aff0: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
b000: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
b030: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
b040: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
b070: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  eak);.        if
b080: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b  ( rc ) return 1;
b090: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b0a0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b0b0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
b0c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b0d0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  Op(v, OP_Next, u
b0e0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
b0f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b100: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b110: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
b120: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b130: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
b140: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
b150: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
b160: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
b170: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
b180: 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70  tTail(p, v, p->p
b190: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
b1a0: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
b1b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b1c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
b1e0: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
b1f0: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
b200: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
b210: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
b220: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
b230: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
b240: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
b250: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
b260: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
b270: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
b280: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
b290: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
b2a0: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
b2b0: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
b2c0: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
b2d0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
b2e0: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
b2f0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
b300: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
b310: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
b320: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
b330: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
b340: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
b350: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
b360: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
b370: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
b380: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
b390: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
b3a0: 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20 31 29  enTemp, tab1, 1)
b3b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b3c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
b3d0: 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31  yAsData, tab1, 1
b3e0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
b3f0: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
b400: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
b410: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
b420: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
b430: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b440: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
b450: 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f  pPrior, SRT_Unio
b460: 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30  n, tab1, 0, 0, 0
b470: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
b480: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
b490: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
b4a0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
b4b0: 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
b4c0: 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
b4d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b4e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b4f0: 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20  OpenTemp, tab2, 
b500: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b510: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b520: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32 2c  KeyAsData, tab2,
b530: 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   1);.      p->pP
b540: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
b550: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
b560: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
b570: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
b580: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d   0, 0);.      p-
b590: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
b5a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
b5b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
b5c0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
b5d0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
b5e0: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
b5f0: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
b600: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
b610: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
b620: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
b630: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
b640: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
b650: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
b660: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
b670: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62  mes(pParse, p->b
b680: 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  ase, 0, p->pELis
b690: 74 29 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  t);.        gene
b6a0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
b6b0: 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c  pParse, p->base,
b6c0: 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c   p->pSrc, p->pEL
b6d0: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
b6e0: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
b6f0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
b700: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
b710: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
b720: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
b730: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b740: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
b750: 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
b760: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
b770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b780: 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31  OP_FullKey, tab1
b790: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b7a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b7b0: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
b7c0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
b7d0: 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f  multiSelectSortO
b7e0: 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72 64 65  rder(p, p->pOrde
b7f0: 72 42 79 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rBy);.      rc =
b800: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
b810: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
b820: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
b830: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
b860: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
b870: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
b8a0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69  iBreak);.      i
b8b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 31  f( rc ) return 1
b8c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b8d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b8e0: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
b8f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b900: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
b910: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
b920: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
b930: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
b940: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
b950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b960: 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
b970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b980: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b990: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
b9a0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
b9b0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67  rBy ){.        g
b9c0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
b9d0: 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
b9e0: 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
b9f0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
ba00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ba10: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
ba20: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
ba30: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
ba40: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
ba50: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
ba60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
ba70: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
ba80: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
ba90: 72 4d 73 67 2c 20 22 53 45 4c 45 43 54 73 20 74  rMsg, "SELECTs t
baa0: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
bab0: 69 67 68 74 20 6f 66 20 22 2c 0a 20 20 20 20 20  ight of ",.     
bac0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
bad0: 3e 6f 70 29 2c 20 22 20 64 6f 20 6e 6f 74 20 68  >op), " do not h
bae0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
baf0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
bb00: 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a 20 20 20 20  lumns", 0);.    
bb10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
bb20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bb30: 7d 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61 20  }..  /* Issue a 
bb40: 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66  null callback if
bb50: 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74 68   that is what th
bb60: 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20 20  e user wants..  
bb70: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
bb80: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26 26 0a  SRT_Callback &&.
bb90: 20 20 20 20 28 70 50 61 72 73 65 2d 3e 75 73 65      (pParse->use
bba0: 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20 28  Callback==0 || (
bbb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
bbc0: 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43  s & SQLITE_NullC
bbd0: 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20 20 29  allback)!=0).  )
bbe0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
bbf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
bc00: 43 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 45 4c  Callback, p->pEL
bc10: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  ist->nExpr, 0);.
bc20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
bc30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
bc40: 76 65 6c 79 20 73 63 61 6e 20 74 68 72 6f 75 67  vely scan throug
bc50: 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  h an expression 
bc60: 74 72 65 65 2e 20 20 46 6f 72 20 65 76 65 72 79  tree.  For every
bc70: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
bc80: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
bc90: 6c 65 20 6e 75 6d 62 65 72 20 69 46 72 6f 6d 2c  le number iFrom,
bca0: 20 63 68 61 6e 67 65 20 74 68 61 74 20 72 65 66   change that ref
bcb0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a  erence to the.**
bcc0: 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 6e 20   same column in 
bcd0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 6f  table number iTo
bce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bcf0: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c   changeTablesInL
bd00: 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 20 69  ist(ExprList*, i
bd10: 6e 74 2c 20 69 6e 74 29 3b 20 20 2f 2a 20 46 6f  nt, int);  /* Fo
bd20: 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
bd30: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
bd40: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 45 78   changeTables(Ex
bd50: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69  pr *pExpr, int i
bd60: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
bd70: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
bd80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
bd90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
bda0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
bdb0: 61 62 6c 65 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  able==iFrom ){. 
bdc0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
bdd0: 20 3d 20 69 54 6f 3b 0a 20 20 7d 65 6c 73 65 7b   = iTo;.  }else{
bde0: 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65  .    changeTable
bdf0: 73 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  s(pExpr->pLeft, 
be00: 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20  iFrom, iTo);.   
be10: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45   changeTables(pE
be20: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 46 72  xpr->pRight, iFr
be30: 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63 68  om, iTo);.    ch
be40: 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74  angeTablesInList
be50: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69  (pExpr->pList, i
be60: 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 7d 0a  From, iTo);.  }.
be70: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  }.static void ch
be80: 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74  angeTablesInList
be90: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
bea0: 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
beb0: 20 69 54 6f 29 7b 0a 20 20 69 66 28 20 70 4c 69   iTo){.  if( pLi
bec0: 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  st ){.    int i;
bed0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bee0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
bef0: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  +){.      change
bf00: 54 61 62 6c 65 73 28 70 4c 69 73 74 2d 3e 61 5b  Tables(pList->a[
bf10: 69 5d 2e 70 45 78 70 72 2c 20 69 46 72 6f 6d 2c  i].pExpr, iFrom,
bf20: 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
bf30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
bf40: 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
bf50: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
bf60: 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
bf70: 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
bf80: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
bf90: 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
bfa0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
bfb0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
bfc0: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
bfd0: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
bfe0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
bff0: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
c000: 75 6e 63 68 61 6e 67 65 64 2e 29 20 20 57 68 65  unchanged.)  Whe
c010: 6e 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20  n making a copy 
c020: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
c030: 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 68 61 6e   in pEList, chan
c040: 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ge.** references
c050: 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
c060: 61 62 6c 65 20 69 53 75 62 20 69 6e 74 6f 20 72  able iSub into r
c070: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
c080: 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  le iTable..**.**
c090: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c0a0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
c0b0: 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
c0c0: 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
c0d0: 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
c0e0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
c0f0: 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
c100: 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
c110: 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
c120: 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
c130: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
c140: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
c150: 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
c160: 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
c170: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
c180: 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
c190: 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
c1a0: 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
c1b0: 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
c1c0: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
c1d0: 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
c1e0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
c1f0: 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
c200: 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
c210: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
c220: 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
c230: 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c  t(ExprList*,int,
c240: 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 29 3b 20  ExprList*,int); 
c250: 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c   /* Forward Decl
c260: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
c270: 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a  substExpr(Expr *
c280: 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c  pExpr, int iTabl
c290: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
c2a0: 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29 7b 0a  ist, int iSub){.
c2b0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
c2c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
c2d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
c2e0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
c2f0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
c300: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
c310: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  0 ){.    Expr *p
c320: 4e 65 77 3b 0a 20 20 20 20 61 73 73 65 72 74 28  New;.    assert(
c330: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
c340: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
c350: 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
c360: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
c370: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
c380: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
c390: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
c3a0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70   );.    pNew = p
c3b0: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
c3c0: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
c3d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
c3e0: 21 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72  !=0 );.    pExpr
c3f0: 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
c400: 0a 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61  .    pExpr->data
c410: 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74  Type = pNew->dat
c420: 61 54 79 70 65 3b 0a 20 20 20 20 61 73 73 65 72  aType;.    asser
c430: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
c440: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c450: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45  >pLeft = sqliteE
c460: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65  xprDup(pNew->pLe
c470: 66 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ft);.    assert(
c480: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
c490: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
c4a0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
c4b0: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
c4c0: 67 68 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ght);.    assert
c4d0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
c4e0: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
c4f0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  pList = sqliteEx
c500: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
c510: 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  pList);.    pExp
c520: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
c530: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 45  ->iTable;.    pE
c540: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
c550: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
c560: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
c570: 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20  pNew->iAgg;.    
c580: 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28  sqliteTokenCopy(
c590: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
c5a0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
c5b0: 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70    sqliteTokenCop
c5c0: 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20  y(&pExpr->span, 
c5d0: 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20  &pNew->span);.  
c5e0: 20 20 69 66 28 20 69 53 75 62 21 3d 69 54 61 62    if( iSub!=iTab
c5f0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 6e  le ){.      chan
c600: 67 65 54 61 62 6c 65 73 28 70 45 78 70 72 2c 20  geTables(pExpr, 
c610: 69 53 75 62 2c 20 69 54 61 62 6c 65 29 3b 0a 20  iSub, iTable);. 
c620: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
c630: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
c640: 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
c650: 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  , pEList, iSub);
c660: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
c670: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
c680: 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53  able, pEList, iS
c690: 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ub);.    substEx
c6a0: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
c6b0: 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
c6c0: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a  ist, iSub);.  }.
c6d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a 73  }.static void .s
c6e0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
c6f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
c700: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
c710: 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20  st *pEList, int 
c720: 69 53 75 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iSub){.  int i;.
c730: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c740: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
c750: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
c760: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
c770: 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  bstExpr(pList->a
c780: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
c790: 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29  e, pEList, iSub)
c7a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
c7b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
c7c0: 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
c7d0: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
c7e0: 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
c7f0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
c800: 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
c810: 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
c820: 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
c830: 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
c840: 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
c850: 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
c860: 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
c870: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
c880: 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
c890: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
c8a0: 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
c8b0: 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
c8c0: 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
c8d0: 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
c8e0: 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
c8f0: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
c900: 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
c910: 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
c920: 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
c930: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
c940: 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
c950: 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
c960: 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
c970: 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
c980: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
c990: 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
c9a0: 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
c9b0: 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
c9c0: 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
c9d0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c9e0: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
c9f0: 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
ca00: 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
ca10: 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
ca20: 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
ca30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ca40: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
ca50: 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
ca60: 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
ca70: 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
ca80: 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
ca90: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
caa0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
cab0: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
cac0: 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
cad0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
cae0: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
caf0: 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
cb00: 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
cb10: 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
cb20: 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
cb30: 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
cb40: 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
cb50: 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
cb60: 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
cb70: 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
cb80: 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
cb90: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
cba0: 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
cbb0: 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
cbc0: 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
cbd0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
cbe0: 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
cbf0: 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
cc00: 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
cc10: 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
cc20: 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
cc30: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
cc40: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
cc50: 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
cc60: 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
cc70: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
cc80: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
cc90: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
cca0: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
ccb0: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
ccc0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
ccd0: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
cce0: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
ccf0: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
cd00: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
cd10: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
cd20: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
cd30: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
cd40: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
cd50: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
cd60: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
cd70: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
cd80: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
cd90: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
cda0: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
cdb0: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
cdc0: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
cdd0: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
cde0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
cdf0: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
ce00: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
ce10: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
ce20: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
ce30: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
ce40: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ce50: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
ce60: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
ce70: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
ce80: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
ce90: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
cea0: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
ceb0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
cec0: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
ced0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
cee0: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
cef0: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
cf00: 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
cf10: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
cf20: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
cf30: 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
cf40: 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
cf50: 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
cf60: 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
cf70: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
cf80: 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
cf90: 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
cfa0: 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
cfb0: 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
cfc0: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
cfd0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
cfe0: 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
cff0: 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
d000: 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
d010: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
d020: 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
d030: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
d040: 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
d050: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
d060: 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
d070: 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 49 66 20 66  eturn 0..** If f
d080: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
d090: 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
d0a0: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
d0b0: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
d0c0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
d0d0: 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
d0e0: 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
d0f0: 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
d100: 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
d110: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
d120: 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
d130: 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
d140: 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
d150: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
d160: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
d170: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
d180: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
d190: 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
d1a0: 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
d1b0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
d1c0: 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
d1d0: 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
d1e0: 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
d1f0: 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
d200: 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
d210: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
d220: 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
d230: 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
d240: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
d250: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
d260: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
d270: 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
d280: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
d290: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ns */.){.  Selec
d2a0: 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
d2b0: 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
d2c0: 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
d2d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
d2e0: 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
d2f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
d300: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
d310: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
d320: 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
d330: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
d340: 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
d350: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
d360: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
d370: 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
d380: 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
d390: 74 20 69 3b 0a 20 20 69 6e 74 20 69 50 61 72 65  t i;.  int iPare
d3a0: 6e 74 2c 20 69 53 75 62 3b 0a 20 20 45 78 70 72  nt, iSub;.  Expr
d3b0: 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20   *pWhere;..  /* 
d3c0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
d3d0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
d3e0: 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
d3f0: 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
d400: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
d410: 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
d420: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
d430: 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
d440: 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
d450: 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
d460: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  b = pSrc->a[iFro
d470: 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m].pSelect;.  as
d480: 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
d490: 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
d4a0: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
d4b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d4c0: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
d4d0: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
d4e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62  return 0;.  pSub
d4f0: 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
d500: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
d510: 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75  Src );.  if( pSu
d520: 62 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  bSrc->nSrc!=1 ) 
d530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d540: 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63  (pSub->isDistinc
d550: 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  t || pSub->nLimi
d560: 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d  t>=0) &&  (pSrc-
d570: 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
d580: 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
d590: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
d5a0: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
d5b0: 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26  p->nLimit>=0) &&
d5c0: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
d5d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
d5e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
d5f0: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
d600: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
d610: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
d620: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
d630: 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
d640: 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
d650: 65 0a 20 20 2a 2a 20 69 2d 74 68 20 65 6e 74 72  e.  ** i-th entr
d660: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
d670: 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
d680: 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
d690: 69 50 61 72 65 6e 74 20 3d 20 70 2d 3e 62 61 73  iParent = p->bas
d6a0: 65 20 2b 20 69 46 72 6f 6d 3b 0a 20 20 69 53 75  e + iFrom;.  iSu
d6b0: 62 20 3d 20 70 53 75 62 2d 3e 62 61 73 65 3b 0a  b = pSub->base;.
d6c0: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
d6d0: 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
d6e0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
d6f0: 2c 20 69 53 75 62 29 3b 0a 20 20 70 4c 69 73 74  , iSub);.  pList
d700: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
d710: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
d720: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d730: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a     Expr *pExpr;.
d740: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
d750: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
d760: 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
d770: 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
d780: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
d790: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
d7a0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
d7b0: 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  p(pExpr->span.z,
d7c0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
d7d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d7e0: 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75   isAgg ){.    su
d7f0: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
d800: 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
d810: 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20  , pSub->pEList, 
d820: 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74  iSub);.    subst
d830: 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
d840: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
d850: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
d860: 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
d870: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
d880: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
d890: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
d8a0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
d8b0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70  >pOrderBy;.    p
d8c0: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
d8d0: 30 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62  0;.    changeTab
d8e0: 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 4f 72  lesInList(p->pOr
d8f0: 64 65 72 42 79 2c 20 69 53 75 62 2c 20 69 50 61  derBy, iSub, iPa
d900: 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  rent);.  }else i
d910: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
d920: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
d930: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
d940: 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
d950: 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20  pEList, iSub);. 
d960: 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
d970: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68  Where ){.    pWh
d980: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
d990: 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
d9a0: 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  );.    if( iPare
d9b0: 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20 20  nt!=iSub ){.    
d9c0: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
d9d0: 57 68 65 72 65 2c 20 69 53 75 62 2c 20 69 50 61  Where, iSub, iPa
d9e0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
d9f0: 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65  else{.    pWhere
da00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
da10: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
da20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
da30: 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
da40: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
da50: 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d  ->pWhere;.    p-
da60: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
da70: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
da80: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
da90: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
daa0: 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 69 66  t, iSub);.    if
dab0: 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 20  ( pSub->pHaving 
dac0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
dad0: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45  Having = sqliteE
dae0: 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61  xprDup(pSub->pHa
daf0: 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ving);.      if(
db00: 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29   iParent!=iSub )
db10: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 6e 67 65  {.        change
db20: 54 61 62 6c 65 73 28 70 48 61 76 69 6e 67 2c 20  Tables(pHaving, 
db30: 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a  iSub, iParent);.
db40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
db50: 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
db60: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69          p->pHavi
db70: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ng = sqliteExpr(
db80: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69  TK_AND, p->pHavi
db90: 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b  ng, pHaving, 0);
dba0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dbb0: 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67        p->pHaving
dbc0: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20   = pHaving;.    
dbd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
dbe0: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
dbf0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
dc00: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
dc10: 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
dc20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
dc30: 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d 69 53   if( iParent!=iS
dc40: 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61 6e  ub ){.      chan
dc50: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 70  geTablesInList(p
dc60: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 53 75 62  ->pGroupBy, iSub
dc70: 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , iParent);.    
dc80: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  }.  }else if( p-
dc90: 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20  >pWhere==0 ){.  
dca0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
dcb0: 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  here;.  }else{. 
dcc0: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
dcd0: 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
dce0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
dcf0: 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Sub);.    if( pW
dd00: 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  here ){.      p-
dd10: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
dd20: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e  Expr(TK_AND, p->
dd30: 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 2c 20  pWhere, pWhere, 
dd40: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
dd50: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
dd60: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
dd70: 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
dd80: 74 3b 0a 0a 20 20 69 66 28 20 70 53 75 62 2d 3e  t;..  if( pSub->
dd90: 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  nLimit>=0 ){.   
dda0: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30   if( p->nLimit<0
ddb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
ddc0: 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d  mit = pSub->nLim
ddd0: 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  it;.    }else if
dde0: 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e  ( p->nLimit+p->n
ddf0: 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e  Offset > pSub->n
de00: 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66  Limit+pSub->nOff
de10: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
de20: 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e  nLimit = pSub->n
de30: 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f  Limit + pSub->nO
de40: 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73  ffset - p->nOffs
de50: 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
de60: 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53  p->nOffset += pS
de70: 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20  ub->nOffset;..  
de80: 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
de90: 72 79 20 63 6f 6e 74 61 69 6e 73 20 73 75 62 71  ry contains subq
dea0: 75 65 72 69 65 73 20 6f 66 20 69 74 73 20 6f 77  ueries of its ow
deb0: 6e 2c 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  n, that were not
dec0: 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 65 64 2c  .  ** flattened,
ded0: 20 74 68 65 6e 20 63 6f 64 65 20 77 69 6c 6c 20   then code will 
dee0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
def0: 6e 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 70  n generated to p
df00: 75 74 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  ut.  ** the resu
df10: 6c 74 73 20 6f 66 20 74 68 6f 73 65 20 73 75 62  lts of those sub
df20: 2d 73 75 62 71 75 65 72 69 65 73 20 69 6e 74 6f  -subqueries into
df30: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 72 65   VDBE cursors re
df40: 6c 61 74 69 76 65 0a 20 20 2a 2a 20 74 6f 20 74  lative.  ** to t
df50: 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 57 65  he subquery.  We
df60: 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74 65 20   must translate 
df70: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
df80: 72 20 69 6e 74 6f 20 76 61 6c 75 65 73 0a 20 20  r into values.  
df90: 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
dfa0: 75 73 65 20 62 79 20 74 68 65 20 6f 75 74 65 72  use by the outer
dfb0: 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66   query..  */.  f
dfc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 75 62 53 72  or(i=0; i<pSubSr
dfd0: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
dfe0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
dff0: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  if( pSubSrc->a[i
e000: 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ].pSelect==0 ) c
e010: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 76 20 3d  ontinue;.    v =
e020: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
e030: 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  Parse);.    sqli
e040: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e050: 50 5f 52 65 6e 61 6d 65 43 75 72 73 6f 72 2c 20  P_RenameCursor, 
e060: 70 53 75 62 2d 3e 62 61 73 65 2b 69 2c 20 70 2d  pSub->base+i, p-
e070: 3e 62 61 73 65 2b 69 29 3b 0a 20 20 7d 0a 0a 20  >base+i);.  }.. 
e080: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 46 72   if( pSrc->a[iFr
e090: 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53 72 63  om].pTab && pSrc
e0a0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 2d  ->a[iFrom].pTab-
e0b0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
e0c0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
e0d0: 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61  Table(0, pSrc->a
e0e0: 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20  [iFrom].pTab);. 
e0f0: 20 7d 0a 20 20 70 53 72 63 2d 3e 61 5b 69 46 72   }.  pSrc->a[iFr
e100: 6f 6d 5d 2e 70 54 61 62 20 3d 20 70 53 75 62 53  om].pTab = pSubS
e110: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
e120: 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70   pSubSrc->a[0].p
e130: 54 61 62 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Tab = 0;.  asser
e140: 74 28 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  t( pSrc->a[iFrom
e150: 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 53 75 62 20  ].pSelect==pSub 
e160: 29 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  );.  pSrc->a[iFr
e170: 6f 6d 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  om].pSelect = pS
e180: 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  ubSrc->a[0].pSel
e190: 65 63 74 3b 0a 20 20 70 53 75 62 53 72 63 2d 3e  ect;.  pSubSrc->
e1a0: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30  a[0].pSelect = 0
e1b0: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
e1c0: 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
e1d0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
e1e0: 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
e1f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
e200: 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
e210: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
e220: 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
e230: 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
e240: 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
e250: 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
e260: 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
e270: 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
e280: 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
e290: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
e2a0: 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
e2b0: 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
e2c0: 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
e2d0: 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
e2e0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
e2f0: 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
e300: 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
e310: 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
e320: 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
e330: 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
e340: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
e350: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
e360: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
e370: 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
e380: 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
e390: 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
e3a0: 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
e3b0: 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
e3c0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
e3d0: 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
e3e0: 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
e3f0: 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
e400: 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
e410: 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
e420: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
e430: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
e440: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
e450: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
e460: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
e470: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
e480: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
e490: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
e4a0: 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
e4b0: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
e4c0: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
e4d0: 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
e4e0: 73 20 66 6f 72 20 73 71 6c 69 74 65 53 65 6c 65  s for sqliteSele
e4f0: 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65  ct()..** See the
e500: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
e510: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
e520: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
e530: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
e540: 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65  tatic int simple
e550: 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73  MinMaxQuery(Pars
e560: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
e570: 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c  t *p, int eDest,
e580: 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45   int iParm){.  E
e590: 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e  xpr *pExpr;.  in
e5a0: 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20  t iCol;.  Table 
e5b0: 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
e5c0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65  pIdx;.  int base
e5d0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
e5e0: 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74  nt seekOp;.  int
e5f0: 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73   cont;.  ExprLis
e600: 74 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  t eList;.  struc
e610: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e620: 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a  eListItem;..  /*
e630: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
e640: 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61   this query is a
e650: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
e660: 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52   max() query.  R
e670: 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20  eturn.  ** zero 
e680: 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20  if it is  not.. 
e690: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72   */.  if( p->pGr
e6a0: 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76  oupBy || p->pHav
e6b0: 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65  ing || p->pWhere
e6c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
e6d0: 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  f( p->pSrc->nSrc
e6e0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
e6f0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
e700: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
e710: 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20  rn 0;.  pExpr = 
e720: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
e730: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
e740: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
e750: 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
e760: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
e770: 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 78  >pList==0 || pEx
e780: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
e790: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
e7a0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
e7b0: 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
e7c0: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
e7d0: 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e  StrNICmp(pExpr->
e7e0: 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
e7f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
e800: 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
e810: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e820: 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d  eStrNICmp(pExpr-
e830: 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33  >token.z,"max",3
e840: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
e850: 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20  Op = OP_Last;.  
e860: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
e870: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
e880: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
e890: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
e8a0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
e8b0: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
e8c0: 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
e8d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
e8e0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
e8f0: 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20  [0].pTab;..  /* 
e900: 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72  If we get to her
e910: 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  e, it means the 
e920: 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20  query is of the 
e930: 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20  correct form..  
e940: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
e950: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e   sure we have an
e960: 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20   index and make 
e970: 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68  pIdx point to th
e980: 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61  e.  ** appropria
e990: 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  te index.  If th
e9a0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
e9b0: 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45   is on an INTEGE
e9c0: 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b  R PRIMARY.  ** k
e9d0: 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e  ey column, no in
e9e0: 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79  dex is necessary
e9f0: 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20   so set pIdx to 
ea00: 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a  NULL.  If no.  *
ea10: 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69  * usable index i
ea20: 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  s found, return 
ea30: 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43  0..  */.  if( iC
ea40: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78  ol<0 ){.    pIdx
ea50: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
ea60: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
ea70: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
ea80: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
ea90: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
eaa0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
eab0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
eac0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
ead0: 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a  ==iCol ) break;.
eae0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
eaf0: 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  dx==0 ) return 0
eb00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
eb10: 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
eb20: 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
eb30: 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  using the callba
eb40: 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
eb50: 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
eb60: 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
eb70: 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  going to a table
eb80: 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   or a memory cel
eb90: 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  l..  */.  v = sq
eba0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
ebb0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
ebc0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ebd0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
ebe0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
ebf0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
ec00: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
ec10: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
ec20: 4c 69 73 74 29 3b 0a 20 20 20 20 67 65 6e 65 72  List);.    gener
ec30: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
ec40: 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20  Parse, p->base, 
ec50: 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  p->pSrc, p->pELi
ec60: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
ec70: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
ec80: 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
ec90: 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
eca0: 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
ecb0: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
ecc0: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
ecd0: 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
ece0: 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
ecf0: 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
ed00: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
ed10: 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
ed20: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
ed30: 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
ed40: 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
ed50: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
ed60: 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
ed70: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 73    if( !pParse->s
ed80: 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 26 26  chemaVerified &&
ed90: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
eda0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
edb0: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
edc0: 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79  sqliteCodeVerify
edd0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 3b 0a  Schema(pParse);.
ede0: 20 20 7d 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e    }.  base = p->
edf0: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 56 64  base;.  sqliteVd
ee00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
ee10: 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62  teger, pTab->iDb
ee20: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  , 0);.  sqliteVd
ee30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
ee40: 65 6e 52 65 61 64 2c 20 62 61 73 65 2c 20 70 54  enRead, base, pT
ee50: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73 71 6c  ab->tnum);.  sql
ee60: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ee70: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
ee80: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
ee90: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
eea0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
eeb0: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
eec0: 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
eed0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
eee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
eef0: 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c  eger, pIdx->iDb,
ef00: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
ef10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
ef20: 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2b 31 2c  penRead, base+1,
ef30: 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pIdx->tnum);.  
ef40: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
ef50: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78  geP3(v, -1, pIdx
ef60: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
ef70: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
ef80: 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
ef90: 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  Op, base+1, 0);.
efa0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
efb0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63  dOp(v, OP_IdxRec
efc0: 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  no, base+1, 0);.
efd0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
efe0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
eff0: 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20   base+1, 0);.   
f000: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f010: 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62  (v, OP_MoveTo, b
f020: 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
f030: 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
f040: 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
f050: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
f060: 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
f070: 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
f080: 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
f090: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
f0a0: 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56    cont = sqliteV
f0b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
f0c0: 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
f0d0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65  op(pParse, p, &e
f0e0: 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  List, 0, 0, 0, -
f0f0: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
f100: 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b 0a 20 20   cont, cont);.  
f110: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
f120: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
f130: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
f140: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
f150: 62 61 73 65 2c 20 30 29 3b 0a 20 20 72 65 74 75  base, 0);.  retu
f160: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 1;.}../*.** G
f170: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
f180: 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43   the given SELEC
f190: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
f1a0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
f1b0: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
f1c0: 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
f1d0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
f1e0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73  ** value of eDes
f1f0: 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a  t and iParm..**.
f200: 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61 6c  **     eDest Val
f210: 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a  ue       Result.
f220: 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
f230: 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
f240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f260: 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61  --.**     SRT_Ca
f270: 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65  llback    Invoke
f280: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f   the callback fo
f290: 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68  r each row of th
f2a0: 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
f2b0: 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
f2c0: 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20      Store first 
f2d0: 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79  result in memory
f2e0: 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a   cell iParm.**.*
f2f0: 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
f300: 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
f310: 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 61  lts as keys of a
f320: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
f330: 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  or iParm.**.**  
f340: 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
f350: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
f360: 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
f370: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
f380: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
f390: 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
f3a0: 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 6f  emove results fo
f3b0: 72 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  rm the temporary
f3c0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
f3d0: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
f3e0: 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
f3f0: 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
f400: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
f410: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
f420: 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
f430: 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
f440: 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
f450: 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
f460: 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
f470: 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
f480: 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
f490: 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
f4a0: 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
f4b0: 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
f4c0: 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
f4d0: 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
f4e0: 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
f4f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f500: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
f510: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
f520: 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
f530: 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
f540: 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
f550: 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
f560: 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
f570: 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
f580: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
f590: 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
f5a0: 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
f5b0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
f5c0: 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
f5d0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
f5e0: 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
f5f0: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
f600: 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
f610: 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
f620: 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
f630: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
f640: 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
f650: 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
f660: 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
f670: 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
f680: 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
f690: 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
f6a0: 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
f6b0: 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
f6c0: 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
f6d0: 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
f6e0: 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
f6f0: 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
f700: 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
f710: 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
f720: 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
f730: 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
f740: 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
f750: 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
f760: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
f770: 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
f780: 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
f790: 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
f7a0: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
f7b0: 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
f7c0: 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
f7d0: 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
f7e0: 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
f810: 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
f820: 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
f870: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f880: 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
f890: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
f8a0: 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
f8b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
f8c0: 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
f8d0: 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
f8e0: 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
f8f0: 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
f900: 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
f910: 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
f920: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f930: 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
f940: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
f950: 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
f960: 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
f970: 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
f980: 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
f990: 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
f9a0: 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
f9b0: 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
f9c0: 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
f9d0: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
f9e0: 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
f9f0: 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
fa00: 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
fa10: 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
fa20: 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
fa30: 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
fa40: 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
fa50: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
fa60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
fa70: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
fa80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
fa90: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
faa0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
fab0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
fac0: 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74   coded. */.  int
fad0: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
fae0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
faf0: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
fb00: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
fb10: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
fb20: 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20   /* A parameter 
fb30: 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73  used by the eDes
fb40: 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  t disposal metho
fb50: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  d */.  Select *p
fb60: 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a  Parent,       /*
fb70: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
fb80: 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
fb90: 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  s a sub-query */
fba0: 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62  .  int parentTab
fbb0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ,         /* Ind
fbc0: 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70  ex in pParent->p
fbd0: 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72  Src of this quer
fbe0: 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72  y */.  int *pPar
fbf0: 65 6e 74 41 67 67 20 20 20 20 20 20 20 20 2f 2a  entAgg        /*
fc00: 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
fc10: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
fc20: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
fc30: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
fc40: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
fc50: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
fc60: 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20  sAgg = 0;       
fc70: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
fc80: 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
fc90: 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
fca0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
fcb0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
fcc0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
fcd0: 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
fce0: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
fcf0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
fd00: 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
fd10: 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
fd20: 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
fd30: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
fd40: 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
fd50: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
fd60: 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
fd70: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
fd80: 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
fd90: 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
fda0: 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
fdb0: 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
fdc0: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
fdd0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
fde0: 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
fdf0: 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
fe00: 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
fe10: 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
fe20: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
fe30: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
fe40: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
fe50: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
fe60: 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
fe70: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
fe80: 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
fe90: 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
fea0: 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  nt base;        
feb0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
fec0: 75 72 73 6f 72 20 61 76 61 69 6c 61 62 6c 65 20  ursor available 
fed0: 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74  for use */.  int
fee0: 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
fef0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
ff00: 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
ff10: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
ff20: 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
ff30: 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  c_failed || pPar
ff40: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30  se->nErr || p==0
ff50: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
ff60: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
ff70: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
ff80: 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 20  E_SELECT, 0, 0) 
ff90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
ffa0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
ffb0: 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
ffc0: 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
ffd0: 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
ffe0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
fff0: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
10000 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
10010 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
10020 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
10030 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
10040 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
10050 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
10060 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
10070 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
10080 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
10090 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 4f   p->pWhere;.  pO
100a0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
100b0 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70 42 79  erBy;.  pGroupBy
100c0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
100d0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
100e0 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74  Having;.  isDist
100f0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
10100 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  inct;..  /* Allo
10110 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
10120 56 44 42 45 20 63 75 72 73 6f 72 73 2c 20 6f 6e  VDBE cursors, on
10130 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  e for each table
10140 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
10150 75 73 65 2e 0a 20 20 2a 2a 20 54 68 65 20 57 48  use..  ** The WH
10160 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 72  ERE processing r
10170 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65  equires that the
10180 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65   cursors for the
10190 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
101a0 20 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   ** FROM clause 
101b0 62 65 20 63 6f 6e 73 65 63 75 74 69 76 65 2e 0a  be consecutive..
101c0 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20 70 2d    */.  base = p-
101d0 3e 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  >base = pParse->
101e0 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nTab;.  pParse->
101f0 6e 54 61 62 20 2b 3d 20 70 54 61 62 4c 69 73 74  nTab += pTabList
10200 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 0a 20  ->nSrc;..  /* . 
10210 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
10220 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
10230 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
10240 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
10250 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
10260 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
10270 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
10280 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
10290 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
102a0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
102b0 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22 20 74  Expand any "*" t
102c0 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75  erms in the resu
102d0 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20 65 78  lt set.  (For ex
102e0 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20 69 6e  ample the "*" in
102f0 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20  .  ** "SELECT * 
10300 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65 20 66  FROM t1")  The f
10310 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28  illInColumnlist(
10320 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  ) routine also d
10330 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74  oes some.  ** ot
10340 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69 6e 67  her housekeeping
10350 20 2d 20 73 65 65 20 74 68 65 20 68 65 61 64 65   - see the heade
10360 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65  r comment for de
10370 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tails..  */.  if
10380 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
10390 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  st(pParse, p) ){
103a0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
103b0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65  _end;.  }.  pWhe
103c0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
103d0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
103e0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
103f0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  st==0 ) goto sel
10400 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
10410 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
10420 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
10430 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
10440 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
10450 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
10460 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65  .  */.  if( (eDe
10470 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
10480 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26  Dest==SRT_Set) &
10490 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
104a0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  1 ){.    sqliteS
104b0 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
104c0 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79  ->zErrMsg, "only
104d0 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
104e0 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
104f0 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
10500 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
10510 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20  an expression", 
10520 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
10530 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
10540 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
10550 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
10560 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
10570 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
10580 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
10590 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
105a0 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20  se SRT_Union:.  
105b0 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
105c0 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  t:.    case SRT_
105d0 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70  Discard:.      p
105e0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
105f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
10600 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
10610 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  ak;.  }..  /* At
10620 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
10630 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
10640 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
10650 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
10660 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
10670 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
10680 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
10690 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  .  .  **.  ** Re
106a0 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
106b0 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20   names and do a 
106c0 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20  semantics check 
106d0 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  on all the expre
106e0 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ssions..  */.  f
106f0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
10700 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10710 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
10720 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
10730 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69  se, base, pTabLi
10740 73 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61  st, 0, pEList->a
10750 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
10760 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
10770 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
10780 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
10790 63 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  ck(pParse, pELis
107a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31  t->a[i].pExpr, 1
107b0 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20  , &isAgg) ){.   
107c0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
107d0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
107e0 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20  if( pWhere ){.  
107f0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10800 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
10810 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73  e, base, pTabLis
10820 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72  t, pEList, pWher
10830 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
10840 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
10850 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
10860 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
10870 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29  e, pWhere, 0, 0)
10880 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
10890 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
108a0 0a 20 20 20 20 73 71 6c 69 74 65 4f 72 61 63 6c  .    sqliteOracl
108b0 65 38 4a 6f 69 6e 46 69 78 75 70 28 62 61 73 65  e8JoinFixup(base
108c0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
108d0 72 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  re);.  }.  if( p
108e0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
108f0 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
10900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
10910 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
10920 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52 4f 55  zErrMsg, "a GROU
10930 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
10940 65 71 75 69 72 65 64 20 22 0a 20 20 20 20 20 20  equired ".      
10950 20 20 20 22 62 65 66 6f 72 65 20 48 41 56 49 4e     "before HAVIN
10960 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  G", 0);.      pP
10970 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
10980 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
10990 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
109a0 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
109b0 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
109c0 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
109d0 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29  pEList, pHaving)
109e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
109f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
10a00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
10a10 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
10a20 20 70 48 61 76 69 6e 67 2c 20 31 2c 20 26 69 73   pHaving, 1, &is
10a30 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  Agg) ){.      go
10a40 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
10a50 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
10a60 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66  OrderBy ){.    f
10a70 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
10a80 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
10a90 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  .      int iCol;
10aa0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
10ab0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10ac0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
10ad0 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  ( sqliteExprIsIn
10ae0 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
10af0 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43   && iCol>0 && iC
10b00 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol<=pEList->nExp
10b10 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
10b20 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45  iteExprDelete(pE
10b30 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20  );.        pE = 
10b40 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
10b50 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70  Expr = sqliteExp
10b60 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
10b70 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
10b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10b90 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
10ba0 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
10bb0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
10bc0 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
10bd0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
10be0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
10bf0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
10c00 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
10c10 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
10c20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
10c30 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10c40 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
10c50 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
10c60 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (pE) ){.        
10c70 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
10c80 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
10c90 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
10ca0 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
10cb0 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
10cc0 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Msg, .          
10cd0 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74       "ORDER BY t
10ce0 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65  erms must not be
10cf0 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e   non-integer con
10d00 73 74 61 6e 74 73 22 2c 20 30 29 3b 0a 20 20 20  stants", 0);.   
10d10 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
10d20 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
10d30 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
10d40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10d50 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
10d60 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
10d70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  r ){.          c
10d80 68 61 72 20 7a 42 75 66 5b 32 30 30 30 5d 3b 0a  har zBuf[2000];.
10d90 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74            sprint
10da0 66 28 7a 42 75 66 2c 22 4f 52 44 45 52 20 42 59  f(zBuf,"ORDER BY
10db0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25   column number %
10dc0 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  d out of range -
10dd0 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
10de0 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
10df0 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43  en 1 and %d", iC
10e00 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
10e10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
10e20 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
10e30 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
10e40 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  zBuf, 0);.      
10e50 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
10e60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ++;.          go
10e70 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
10e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10ea0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
10eb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
10ec0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
10ed0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
10ee0 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  l;.      Expr *p
10ef0 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
10f00 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
10f10 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
10f20 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
10f30 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20  l) && iCol>0 && 
10f40 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
10f50 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
10f60 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
10f70 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20  pE);.        pE 
10f80 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  = pGroupBy->a[i]
10f90 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45  .pExpr = sqliteE
10fa0 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61  xprDup(pEList->a
10fb0 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b  [iCol-1].pExpr);
10fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10fd0 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
10fe0 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
10ff0 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
11000 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20  pEList, pE) ){. 
11010 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
11020 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
11030 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11040 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
11050 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20  , pE, isAgg, 0) 
11060 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11070 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11080 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
11090 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61  liteExprIsConsta
110a0 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
110b0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
110c0 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
110d0 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
110e0 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
110f0 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
11100 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrMsg, .        
11110 20 20 20 20 20 20 20 22 47 52 4f 55 50 20 42 59         "GROUP BY
11120 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
11130 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
11140 6f 6e 73 74 61 6e 74 73 22 2c 20 30 29 3b 0a 20  onstants", 0);. 
11150 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
11160 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
11170 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11180 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
11190 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
111a0 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
111b0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
111c0 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 30 5d   char zBuf[2000]
111d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69  ;.          spri
111e0 6e 74 66 28 7a 42 75 66 2c 22 47 52 4f 55 50 20  ntf(zBuf,"GROUP 
111f0 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
11200 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
11210 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
11220 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74              "bet
11230 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
11240 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
11250 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
11260 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
11270 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
11280 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20  , zBuf, 0);.    
11290 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
112a0 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
112b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
112c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
112d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
112e0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
112f0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
11300 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28   a min() or max(
11310 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74  ) function by it
11320 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65  self.  ** in the
11330 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
11340 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69  /.  if( simpleMi
11350 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65  nMaxQuery(pParse
11360 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
11370 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  m) ){.    rc = 0
11380 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
11390 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
113a0 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
113b0 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
113c0 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
113d0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
113e0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
113f0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64  ct_end;..  /* Id
11400 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
11410 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
11420 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  e using them in 
11430 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  a callback.  Thi
11440 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
11450 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
11460 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
11470 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74   some other dest
11480 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  ination..  */.  
11490 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
114a0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
114b0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
114c0 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61  es(pParse, p->ba
114d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
114e0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
114f0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
11500 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
11510 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20  Limit<=0 ){.    
11520 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->nLimit = -1;.
11530 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
11540 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11550 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
11560 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
11570 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11580 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
11590 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  p->nLimit, 0);. 
115a0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
115b0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
115c0 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
115d0 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 69 4d 65   p->nLimit = iMe
115e0 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  m;.    if( p->nO
115f0 66 66 73 65 74 3c 3d 30 20 29 7b 0a 20 20 20 20  ffset<=0 ){.    
11600 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
11610 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11620 20 20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65     iMem = pParse
11630 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
11640 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11650 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
11660 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->nOffset, 0);.
11670 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11680 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
11690 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a  tore, iMem, 1);.
116a0 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
116b0 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20   = iMem;.    }. 
116c0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
116d0 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
116e0 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
116f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
11700 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
11710 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
11720 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  i++){.    if( pT
11730 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
11740 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
11750 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  ue;.    sqliteSe
11760 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
11770 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
11780 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62  ect, SRT_TempTab
11790 6c 65 2c 20 62 61 73 65 2b 69 2c 0a 20 20 20 20  le, base+i,.    
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
117b0 69 2c 20 26 69 73 41 67 67 29 3b 0a 20 20 20 20  i, &isAgg);.    
117c0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
117d0 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
117e0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
117f0 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
11800 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
11810 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11820 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
11830 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
11840 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
11850 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
11860 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
11870 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
11880 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nct;.  }..  /* C
11890 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
118a0 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
118b0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66  y that can be "f
118c0 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69  lattened" into i
118d0 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20  ts parent..  ** 
118e0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
118f0 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64   a possiblity, d
11900 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  o so and return 
11910 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20  immediately.  . 
11920 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
11930 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20  t && pParentAgg 
11940 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e  &&.      flatten
11950 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
11960 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
11970 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
11980 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
11990 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
119a0 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
119b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
119c0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
119d0 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
119e0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
119f0 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  a callback.  Thi
11a00 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
11a10 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
11a20 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
11a30 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f   a destination o
11a40 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  ther.  ** than a
11a50 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a   callback..  */.
11a60 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11a70 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
11a80 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
11a90 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ypes(pParse, p->
11aa0 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
11ab0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
11ac0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
11ad0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
11ae0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
11af0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
11b00 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
11b10 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
11b20 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
11b30 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11b40 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
11b50 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 0);.  }..  /*
11b60 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   Do an analysis 
11b70 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70  of aggregate exp
11b80 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
11b90 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
11ba0 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
11bb0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c  );.  if( isAgg |
11bc0 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  | pGroupBy ){.  
11bd0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
11be0 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20  ->nAgg==0 );.   
11bf0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
11c00 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
11c10 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11c20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11c30 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
11c40 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
11c50 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11c60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
11c70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11c80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11c90 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
11ca0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11cb0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
11cc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11cd0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e  if( sqliteExprAn
11ce0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
11cf0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
11d00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
11d10 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11d20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11d40 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76    }.    if( pHav
11d50 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45 78 70  ing && sqliteExp
11d60 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
11d70 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  es(pParse, pHavi
11d80 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
11d90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11da0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
11db0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
11dc0 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
11dd0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
11de0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
11df0 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
11e00 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
11e10 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
11e20 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
11e30 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
11e40 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
11e50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11e60 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20  .  /* Reset the 
11e70 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a  aggregator.  */.
11e80 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
11e90 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11ea0 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65  Op(v, OP_AggRese
11eb0 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 41  t, 0, pParse->nA
11ec0 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  gg);.    for(i=0
11ed0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
11ee0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75  ; i++){.      Fu
11ef0 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20  ncDef *pFunc;.  
11f00 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d      if( (pFunc =
11f10 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
11f20 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46  .pFunc)!=0 && pF
11f30 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d  unc->xFinalize!=
11f40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
11f50 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11f60 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20 69  OP_AggInit, 0, i
11f70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11f80 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
11f90 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 46 75 6e   -1, (char*)pFun
11fa0 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  c, P3_POINTER);.
11fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11fc0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
11fd0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11fe0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11ff0 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
12000 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12010 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46  AddOp(v, OP_AggF
12020 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ocus, 0, 0);.   
12030 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69   }.  }..  /* Ini
12040 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
12050 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a  ry cell to NULL.
12060 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
12070 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20  ==SRT_Mem ){.   
12080 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12090 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
120a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
120b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
120c0 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
120d0 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f   1);.  }..  /* O
120e0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
120f0 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  table to use for
12100 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
12110 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
12120 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
12130 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
12140 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
12150 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12160 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 64  , OP_OpenTemp, d
12170 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20 7d  istinct, 1);.  }
12180 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
12190 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ct = -1;.  }..  
121a0 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
121b0 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a  abase scan.  */.
121c0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
121d0 65 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  eWhereBegin(pPar
121e0 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 54 61  se, p->base, pTa
121f0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
12200 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12220 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20 26 70  GroupBy ? 0 : &p
12230 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
12240 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
12250 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
12260 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
12270 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69  ard inner loop i
12280 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61  f we are not dea
12290 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61  ling with.  ** a
122a0 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20  ggregates.  */. 
122b0 20 69 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20   if( !isAgg ){. 
122c0 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
122d0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
122e0 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
122f0 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
12300 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
12320 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43  Parm, pWInfo->iC
12330 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
12340 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20  >iBreak) ){.    
12350 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
12360 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
12370 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65   /* If we are de
12380 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65  aling with aggre
12390 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74  gates, then do t
123a0 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65  he special aggre
123b0 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73  gate.  ** proces
123c0 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65  sing.  .  */.  e
123d0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72  lse{.    if( pGr
123e0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
123f0 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66  nt lbl1;.      f
12400 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
12410 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
12420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
12430 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12440 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
12450 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
12460 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12470 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b  ddOp(v, OP_MakeK
12480 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ey, pGroupBy->nE
12490 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  xpr, 0);.      i
124a0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
124b0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20  ile_format>=4 ) 
124c0 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65  sqliteAddKeyType
124d0 28 76 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  (v, pGroupBy);. 
124e0 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
124f0 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
12500 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
12510 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12520 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c  AggFocus, 0, lbl
12530 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  1);.      for(i=
12540 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
12550 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
12560 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67   if( pParse->aAg
12570 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
12580 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73  tinue;.        s
12590 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
125a0 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e 61 41  arse, pParse->aA
125b0 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  gg[i].pExpr);.  
125c0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
125d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53  AddOp(v, OP_AggS
125e0 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20  et, 0, i);.     
125f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
12600 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12610 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a  v, lbl1);.    }.
12620 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12630 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
12640 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
12650 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  E;.      int j;.
12660 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
12670 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
12680 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12690 20 20 20 70 45 20 3d 20 70 50 61 72 73 65 2d 3e     pE = pParse->
126a0 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  aAgg[i].pExpr;. 
126b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
126c0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
126d0 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  TION );.      if
126e0 28 20 70 45 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pE->pList ){. 
126f0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
12700 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  j<pE->pList->nEx
12710 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
12720 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
12730 64 65 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  de(pParse, pE->p
12740 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
12750 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12760 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12770 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12780 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
12790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
127a0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
127b0 46 75 6e 63 2c 20 30 2c 20 70 45 2d 3e 70 4c 69  Func, 0, pE->pLi
127c0 73 74 20 3f 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  st ? pE->pList->
127d0 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
127e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
127f0 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 21  ->aAgg[i].pFunc!
12800 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
12810 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67  rt( pParse->aAgg
12820 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70  [i].pFunc->xStep
12830 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
12840 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
12850 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 50  v, -1, (char*)pP
12860 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
12870 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  unc, P3_POINTER)
12880 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12890 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
128a0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
128b0 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65 72 65  */.  sqliteWhere
128c0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
128d0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72 6f  /* If we are pro
128e0 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
128f0 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  es, we need to s
12900 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c  et up a second l
12910 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c  oop.  ** over al
12920 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  l of the aggrega
12930 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72  te values and pr
12940 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f  ocess them..  */
12950 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
12960 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d      int endagg =
12970 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
12980 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
12990 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73   startagg;.    s
129a0 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65  tartagg = sqlite
129b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
129c0 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61  AggNext, 0, enda
129d0 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  gg);.    pParse-
129e0 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20  >useAgg = 1;.   
129f0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
12a00 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
12a10 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
12a20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67  pHaving, startag
12a30 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g, 1);.    }.   
12a40 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
12a50 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
12a60 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
12a70 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
12a80 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
12aa0 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e  rm, startagg, en
12ab0 64 61 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67  dagg) ){.      g
12ac0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12ad0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12ae0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12af0 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67  Goto, 0, startag
12b00 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  g);.    sqliteVd
12b10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
12b20 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73  , endagg);.    s
12b30 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12b40 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29  , OP_Noop, 0, 0)
12b50 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73  ;.    pParse->us
12b60 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  eAgg = 0;.  }.. 
12b70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
12b80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
12b90 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
12ba0 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
12bb0 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
12bc0 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
12bd0 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
12be0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
12bf0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
12c00 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
12c10 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
12c20 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
12c30 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49  m);.  }...  /* I
12c40 73 73 75 65 20 61 20 6e 75 6c 6c 20 63 61 6c 6c  ssue a null call
12c50 62 61 63 6b 20 69 66 20 74 68 61 74 20 69 73 20  back if that is 
12c60 77 68 61 74 20 74 68 65 20 75 73 65 72 20 77 61  what the user wa
12c70 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nts..  */.  if( 
12c80 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
12c90 61 63 6b 20 26 26 0a 20 20 20 20 28 70 50 61 72  ack &&.    (pPar
12ca0 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 3d  se->useCallback=
12cb0 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 64  =0 || (pParse->d
12cc0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
12cd0 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21  E_NullCallback)!
12ce0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  =0).  ){.    sql
12cf0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12d00 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c  OP_NullCallback,
12d10 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
12d20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
12d30 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
12d40 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
12d50 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
12d60 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
12d70 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
12d80 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
12d90 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
12da0 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
12db0 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
12dc0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
12dd0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
12de0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
12df0 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
12e00 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
12e10 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67 67 72  nd:.  sqliteAggr
12e20 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70  egateInfoReset(p
12e30 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  Parse);.  return
12e40 20 72 63 3b 0a 7d 0a                              rc;.}.