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

Artifact 92a66f0122f321688569e108feceaf74f5f4e63a:


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 33 33  select.c,v 1.133
0200: 20 32 30 30 33 2f 30 34 2f 32 32 20 32 30 3a 33   2003/04/22 20:3
0210: 30 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a 2a  0:39 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 45 72 72 6f 72 4d 73     sqliteErrorMs
0e70: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
0e80: 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c   "RIGHT and FULL
0e90: 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65   OUTER JOINs are
0ea0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73   not currently s
0eb0: 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20  upported");.    
0ec0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
0ed0: 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NER;.  }.  retur
0ee0: 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f  n jointype;.}../
0ef0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0f00: 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d  index of a colum
0f10: 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52  n in a table.  R
0f20: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
0f30: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74  column.** is not
0f40: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
0f50: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
0f60: 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64  ic int columnInd
0f70: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ex(Table *pTab, 
0f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0f90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
0fa0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
0fb0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
0fc0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
0fd0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
0fe0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
0ff0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1000: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1010: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
1020: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
1030: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
1040: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
1050: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
1060: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
1070: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
1080: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
1090: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
10a0: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
10b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
10c0: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
10d0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
10e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
10f0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1100: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1110: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1120: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1130: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1140: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20   Expr **ppExpr  
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1160: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
1170: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
1180: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f  ssion */.){.  To
1190: 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70  ken dummy;.  Exp
11a0: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
11b0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
11c0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
11d0: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
11e0: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c    dummy.z = zCol
11f0: 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74  ;.  dummy.n = st
1200: 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75  rlen(zCol);.  du
1210: 6d 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70  mmy.dyn = 0;.  p
1220: 45 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72  E1a = sqliteExpr
1230: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1240: 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20  ummy);.  pE2a = 
1250: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
1260: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1270: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1280: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b1->zName;.  dum
1290: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
12a0: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d  mmy.z);.  pE1b =
12b0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
12c0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
12d0: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
12e0: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
12f0: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
1300: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
1310: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
1320: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1330: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1340: 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  teExpr(TK_DOT, p
1350: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1360: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78   pE2c = sqliteEx
1370: 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  pr(TK_DOT, pE2b,
1380: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1390: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
13a0: 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20  EQ, pE1c, pE2c, 
13b0: 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  0);.  ExprSetPro
13c0: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
13d0: 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20 2a 70  mJoin);.  if( *p
13e0: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70  pExpr ){.    *pp
13f0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70  Expr = sqliteExp
1400: 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70  r(TK_AND, *ppExp
1410: 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c  r, pE, 0);.  }el
1420: 73 65 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20  se{.    *ppExpr 
1430: 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = pE;.  }.}../*.
1440: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1450: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1460: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1470: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1480: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
1490: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
14a0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
14b0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
14c0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
14d0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
14e0: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
14f0: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1500: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1510: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1520: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
1530: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
1540: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
1550: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
1560: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
1570: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
1580: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
1590: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
15a0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
15b0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
15c0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
15d0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
15e0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
15f0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1600: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1610: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
1620: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
1630: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69  (Expr *p){.  whi
1640: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
1650: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
1660: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1670: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
1680: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d  >pLeft);.    p =
1690: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16b0: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
16c0: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
16d0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
16e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
16f0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1700: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1710: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1720: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1730: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
1740: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
1750: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
1760: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
1770: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1780: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1790: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
17a0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
17c0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
17d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
17e0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
17f0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  st *pSrc;.  int 
1800: 69 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70  i, j;.  pSrc = p
1810: 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
1820: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
1830: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  1; i++){.    str
1840: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1850: 20 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d   *pTerm = &pSrc-
1860: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
1870: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1880: 70 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e  pOther = &pSrc->
1890: 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28  a[i+1];..    if(
18a0: 20 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20   pTerm->pTab==0 
18b0: 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d  || pOther->pTab=
18c0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
18d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
18e0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
18f0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
1900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1910: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
1920: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
1930: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
1940: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
1950: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1960: 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  erm->jointype & 
1970: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
1980: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1990: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
19a0: 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e  ->pOn || pTerm->
19b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
19c0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
19d0: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
19e0: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
19f0: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
1a00: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
1a10: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
1a20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a40: 70 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54  pTab = pTerm->pT
1a50: 61 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ab;.      for(j=
1a60: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1a70: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
1a80: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
1a90: 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61  Other->pTab, pTa
1aa0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1ab0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1ac0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
1ad0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1ae0: 6d 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72  me, pTab, pOther
1af0: 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ->pTab, &p->pWhe
1b00: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
1b10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b20: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
1b30: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
1b40: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
1b50: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
1b60: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1b70: 4f 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73  On && pTerm->pUs
1b80: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
1b90: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
1ba0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
1bb0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1bc0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
1bd0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1be0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
1bf0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1c00: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
1c10: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
1c20: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
1c30: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
1c40: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
1c50: 64 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  d AND operator..
1c60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c70: 54 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  Term->pOn ){.   
1c80: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
1c90: 54 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Term->pOn);.    
1ca0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d    if( p->pWhere=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
1cc0: 3e 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d  >pWhere = pTerm-
1cd0: 3e 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  >pOn;.      }els
1ce0: 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57  e{.        p->pW
1cf0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
1d00: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
1d10: 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c  ere, pTerm->pOn,
1d20: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1d30: 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20     pTerm->pOn = 
1d40: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1d50: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
1d60: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
1d70: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
1d80: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
1d90: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
1da0: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
1db0: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
1dc0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1dd0: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
1de0: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
1df0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
1e00: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
1e10: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
1e20: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
1e30: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
1e40: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
1e50: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
1e60: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
1e70: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
1e80: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1e90: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
1ea0: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
1eb0: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
1ec0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1ed0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1ee0: 66 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67  f( pTerm->pUsing
1ef0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
1f00: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69   *pList;.      i
1f10: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1f20: 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  rt( i<pSrc->nSrc
1f30: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  -1 );.      pLis
1f40: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e  t = pTerm->pUsin
1f50: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
1f60: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
1f70: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1f80: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ( columnIndex(pT
1f90: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74  erm->pTab, pList
1fa0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20  ->a[j].zName)<0 
1fb0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ||.            c
1fc0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65  olumnIndex(pOthe
1fd0: 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e  r->pTab, pList->
1fe0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b  a[j].zName)<0 ){
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2000: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
2010: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
2020: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
2030: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
2040: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
2050: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
2060: 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  s", pList->a[j].
2070: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2080: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
20a0: 64 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74  dWhereTerm(pList
20b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[j].zName, pT
20c0: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65  erm->pTab, pOthe
20d0: 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68  r->pTab, &p->pWh
20e0: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2110: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
2120: 65 6e 74 73 20 61 20 6d 69 6e 69 6d 61 6c 20 4f  ents a minimal O
2130: 72 61 63 6c 65 38 20 6a 6f 69 6e 20 73 79 6e 74  racle8 join synt
2140: 61 78 20 69 6d 6d 75 6c 61 74 69 6f 6e 2e 0a 2a  ax immulation..*
2150: 2a 20 54 68 65 20 70 72 65 63 69 73 65 20 6f 72  * The precise or
2160: 61 63 6c 65 38 20 73 79 6e 74 61 78 20 69 73 20  acle8 syntax is 
2170: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  not implemented 
2180: 2d 20 69 74 20 69 73 20 65 61 73 79 20 65 6e 6f  - it is easy eno
2190: 75 67 68 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ugh.** to get th
21a0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 66 75  is routine confu
21b0: 73 65 64 2e 20 20 42 75 74 20 74 68 69 73 20 72  sed.  But this r
21c0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6d 61 6b 65  outine does make
21d0: 20 69 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   it possible.** 
21e0: 74 6f 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  to write a singl
21f0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2200: 74 68 61 74 20 64 6f 65 73 20 61 20 6c 65 66 74  that does a left
2210: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 6e 20 62   outer join in b
2220: 6f 74 68 0a 2a 2a 20 6f 72 61 63 6c 65 38 20 61  oth.** oracle8 a
2230: 6e 64 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a  nd in SQLite..**
2240: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2250: 20 6c 6f 6f 6b 73 20 66 6f 72 20 54 4b 5f 43 4f   looks for TK_CO
2260: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
2270: 6e 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 6d  nodes that are m
2280: 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  arked.** with th
2290: 65 20 45 50 5f 4f 72 61 63 6c 65 38 4a 6f 69 6e  e EP_Oracle8Join
22a0: 20 70 72 6f 70 65 72 74 79 2e 20 20 53 75 63 68   property.  Such
22b0: 20 6e 6f 64 65 73 20 61 72 65 20 67 65 6e 65 72   nodes are gener
22c0: 61 74 65 64 20 62 79 20 61 0a 2a 2a 20 63 6f 6c  ated by a.** col
22d0: 75 6d 6e 20 6e 61 6d 65 20 28 65 69 74 68 65 72  umn name (either
22e0: 20 22 63 6f 6c 75 6d 6e 22 20 6f 72 20 22 74 61   "column" or "ta
22f0: 62 6c 65 2e 63 6f 6c 75 6d 6e 22 29 20 74 68 61  ble.column") tha
2300: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t is followed by
2310: 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 61 6c 20  .** the special 
2320: 22 28 2b 29 22 20 6f 70 65 72 61 74 6f 72 2e 20  "(+)" operator. 
2330: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 66   If the table of
2340: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6d 61 72 6b   the column mark
2350: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 28  ed with.** the (
2360: 2b 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74  +) operator is t
2370: 68 65 20 73 65 63 6f 6e 64 20 61 72 65 20 73 75  he second are su
2380: 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 20 69  bsequent table i
2390: 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 0a 2a  n a join, then.*
23a0: 2a 20 74 68 61 74 20 74 61 62 6c 65 20 62 65 63  * that table bec
23b0: 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 20 74 61  omes the left ta
23c0: 62 6c 65 20 69 6e 20 61 20 4c 45 46 54 20 4f 55  ble in a LEFT OU
23d0: 54 45 52 20 4a 4f 49 4e 2e 20 20 54 68 65 20 65  TER JOIN.  The e
23e0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61  xpression.** tha
23f0: 74 20 75 73 65 73 20 74 68 61 74 20 74 61 62 6c  t uses that tabl
2400: 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f  e becomes part o
2410: 66 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  f the ON clause 
2420: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 2e 0a 2a 2a  for the join..**
2430: 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
2440: 61 6e 74 20 74 6f 20 65 6e 70 68 61 73 69 7a 65  ant to enphasize
2450: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f   that this is no
2460: 74 20 65 78 61 63 74 6c 79 20 68 6f 77 20 6f 72  t exactly how or
2470: 61 63 6c 65 38 0a 2a 2a 20 77 6f 72 6b 73 2e 20  acle8.** works. 
2480: 20 42 75 74 20 69 74 20 69 73 20 63 6c 6f 73 65   But it is close
2490: 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
24a0: 6f 6e 65 20 63 61 6e 20 63 6f 6e 73 74 72 75 63  one can construc
24b0: 74 20 71 75 65 72 69 65 73 20 74 68 61 74 0a 2a  t queries that.*
24c0: 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 63 6f 72 72  * will work corr
24d0: 65 63 74 6c 79 20 66 6f 72 20 62 6f 74 68 20 53  ectly for both S
24e0: 51 4c 69 74 65 20 61 6e 64 20 4f 72 61 63 6c 65  QLite and Oracle
24f0: 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  8..*/.static int
2500: 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a 6f   sqliteOracle8Jo
2510: 69 6e 46 69 78 75 70 28 0a 20 20 69 6e 74 20 62  inFixup(.  int b
2520: 61 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ase,         /* 
2530: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
2540: 65 72 20 66 6f 72 20 66 69 72 73 74 20 74 61 62  er for first tab
2550: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
2560: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
2570: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
2580: 6c 65 73 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  les being joined
2590: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
25a0: 72 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  re      /* The W
25b0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
25c0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
25d0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
25e0: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78  rc = 0;.  if( Ex
25f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
2600: 68 65 72 65 2c 20 45 50 5f 4f 72 61 63 6c 65 38  here, EP_Oracle8
2610: 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
2620: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
2630: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2640: 70 57 68 65 72 65 2d 3e 69 54 61 62 6c 65 20 2d  pWhere->iTable -
2650: 20 62 61 73 65 3b 0a 20 20 20 20 61 73 73 65 72   base;.    asser
2660: 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2670: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
2680: 20 20 20 69 66 28 20 69 64 78 3e 30 20 29 7b 0a     if( idx>0 ){.
2690: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 64        pSrc->a[id
26a0: 78 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 3d  x-1].jointype &=
26b0: 20 7e 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 20 20   ~JT_INNER;.    
26c0: 20 20 70 53 72 63 2d 3e 61 5b 69 64 78 2d 31 5d    pSrc->a[idx-1]
26d0: 2e 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f  .jointype |= JT_
26e0: 4f 55 54 45 52 7c 4a 54 5f 4c 45 46 54 3b 0a 20  OUTER|JT_LEFT;. 
26f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2700: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2710: 57 68 65 72 65 2d 3e 70 52 69 67 68 74 20 29 7b  Where->pRight ){
2720: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2730: 4f 72 61 63 6c 65 38 4a 6f 69 6e 46 69 78 75 70  Oracle8JoinFixup
2740: 28 62 61 73 65 2c 20 70 53 72 63 2c 20 70 57 68  (base, pSrc, pWh
2750: 65 72 65 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  ere->pRight);.  
2760: 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 2d 3e  }.  if( pWhere->
2770: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 72 63 20  pLeft ){.    rc 
2780: 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38  |= sqliteOracle8
2790: 4a 6f 69 6e 46 69 78 75 70 28 62 61 73 65 2c 20  JoinFixup(base, 
27a0: 70 53 72 63 2c 20 70 57 68 65 72 65 2d 3e 70 4c  pSrc, pWhere->pL
27b0: 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
27c0: 70 57 68 65 72 65 2d 3e 70 4c 69 73 74 20 29 7b  pWhere->pList ){
27d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
27e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
27f0: 3d 20 70 57 68 65 72 65 2d 3e 70 4c 69 73 74 3b  = pWhere->pList;
2800: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2810: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20  pList->nExpr && 
2820: 72 63 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  rc==0; i++){.   
2830: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 4f     rc |= sqliteO
2840: 72 61 63 6c 65 38 4a 6f 69 6e 46 69 78 75 70 28  racle8JoinFixup(
2850: 62 61 73 65 2c 20 70 53 72 63 2c 20 70 4c 69 73  base, pSrc, pLis
2860: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
2870: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2880: 72 63 3d 3d 31 20 26 26 20 28 70 57 68 65 72 65  rc==1 && (pWhere
2890: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20  ->op==TK_AND || 
28a0: 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 45  pWhere->op==TK_E
28b0: 51 29 20 29 7b 0a 20 20 20 20 73 65 74 4a 6f 69  Q) ){.    setJoi
28c0: 6e 45 78 70 72 28 70 57 68 65 72 65 29 3b 0a 20  nExpr(pWhere);. 
28d0: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
28e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2900: 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72  given Select str
2910: 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f  ucture and all o
2920: 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  f its substructu
2930: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
2940: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
2950: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
2960: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
2970: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73  .  sqliteExprLis
2980: 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69 73  tDelete(p->pELis
2990: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72 63 4c  t);.  sqliteSrcL
29a0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 72  istDelete(p->pSr
29b0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  c);.  sqliteExpr
29c0: 44 65 6c 65 74 65 28 70 2d 3e 70 57 68 65 72 65  Delete(p->pWhere
29d0: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c  );.  sqliteExprL
29e0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72  istDelete(p->pGr
29f0: 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  oupBy);.  sqlite
2a00: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48  ExprDelete(p->pH
2a10: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
2a20: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2a30: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
2a40: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
2a50: 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  e(p->pPrior);.  
2a60: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 53  sqliteFree(p->zS
2a70: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2a80: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2a90: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67 67  * Delete the agg
2aa0: 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2ab0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  on from the pars
2ac0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2ae0: 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
2af0: 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  eset(Parse *pPar
2b00: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  se){.  sqliteFre
2b10: 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b  e(pParse->aAgg);
2b20: 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20  .  pParse->aAgg 
2b30: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
2b40: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
2b50: 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 7d  e->useAgg = 0;.}
2b60: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2b70: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2b80: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2b90: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2ba0: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2bb0: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2bc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2bd0: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2be0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2bf0: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2c00: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
2c10: 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65 72  char *zSortOrder
2c20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a 53 6f  ;.  int i;.  zSo
2c30: 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65  rtOrder = sqlite
2c40: 4d 61 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42 79  Malloc( pOrderBy
2c50: 2d 3e 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a 20  ->nExpr + 1 );. 
2c60: 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72 3d   if( zSortOrder=
2c70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
2c80: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
2c90: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
2ca0: 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 20 3d  .    int order =
2cb0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2cc0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69  sortOrder;.    i
2cd0: 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 69 6e 74  nt type;.    int
2ce0: 20 63 3b 0a 20 20 20 20 69 66 28 20 28 6f 72 64   c;.    if( (ord
2cf0: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
2d00: 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  YPEMASK)==SQLITE
2d10: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
2d20: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2d30: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  SO_TEXT;.    }el
2d40: 73 65 20 69 66 28 20 28 6f 72 64 65 72 20 26 20  se if( (order & 
2d50: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
2d60: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  SK)==SQLITE_SO_N
2d70: 55 4d 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65  UM ){.      type
2d80: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
2d90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2da0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
2db0: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
2dc0: 20 20 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74      type = sqlit
2dd0: 65 45 78 70 72 54 79 70 65 28 70 4f 72 64 65 72  eExprType(pOrder
2de0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2df0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e00: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2e10: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 0a 20 20  SO_NUM;.    }.  
2e20: 20 20 69 66 28 20 28 6f 72 64 65 72 20 26 20 53    if( (order & S
2e30: 51 4c 49 54 45 5f 53 4f 5f 44 49 52 4d 41 53 4b  QLITE_SO_DIRMASK
2e40: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  )==SQLITE_SO_ASC
2e50: 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 74 79   ){.      c = ty
2e60: 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45  pe==SQLITE_SO_TE
2e70: 58 54 20 3f 20 27 41 27 20 3a 20 27 2b 27 3b 0a  XT ? 'A' : '+';.
2e80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e90: 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54   c = type==SQLIT
2ea0: 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 44 27 20  E_SO_TEXT ? 'D' 
2eb0: 3a 20 27 2d 27 3b 0a 20 20 20 20 7d 0a 20 20 20  : '-';.    }.   
2ec0: 20 7a 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d   zSortOrder[i] =
2ed0: 20 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78   c;.    sqliteEx
2ee0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2ef0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f00: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 7a 53 6f 72  xpr);.  }.  zSor
2f10: 74 4f 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d  tOrder[pOrderBy-
2f20: 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 73  >nExpr] = 0;.  s
2f30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2f40: 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79  , OP_SortMakeKey
2f50: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
2f60: 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56  r, 0);.  sqliteV
2f70: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
2f80: 31 2c 20 7a 53 6f 72 74 4f 72 64 65 72 2c 20 73  1, zSortOrder, s
2f90: 74 72 6c 65 6e 28 7a 53 6f 72 74 4f 72 64 65 72  trlen(zSortOrder
2fa0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  ));.  sqliteFree
2fb0: 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20  (zSortOrder);.  
2fc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2fd0: 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30  v, OP_SortPut, 0
2fe0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
2ff0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
3000: 20 61 20 50 33 20 61 72 67 75 6d 65 6e 74 20 74   a P3 argument t
3010: 6f 20 74 68 65 20 6c 61 73 74 20 56 44 42 45 20  o the last VDBE 
3020: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 61 73 0a  opcode that was.
3030: 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20 54 68 65  ** inserted. The
3040: 20 50 33 20 61 72 67 75 6d 65 6e 74 20 61 64 64   P3 argument add
3050: 65 64 20 69 73 20 61 20 73 74 72 69 6e 67 20 73  ed is a string s
3060: 75 69 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  uitable for the 
3070: 0a 2a 2a 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 6f  .** OP_MakeKey o
3080: 72 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  r OP_MakeIdxKey 
3090: 6f 70 63 6f 64 65 73 2e 20 20 54 68 65 20 73 74  opcodes.  The st
30a0: 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f 66  ring consists of
30b0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 27  .** characters '
30c0: 74 27 20 6f 72 20 27 6e 27 20 64 65 70 65 6e 64  t' or 'n' depend
30d0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
30e0: 72 20 6e 6f 74 20 74 68 65 20 76 61 72 69 6f 75  r not the variou
30f0: 73 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74  s.** fields of t
3100: 68 65 20 6b 65 79 20 74 6f 20 62 65 20 67 65 6e  he key to be gen
3110: 65 72 61 74 65 64 20 73 68 6f 75 6c 64 20 62 65  erated should be
3120: 20 74 72 65 61 74 65 64 20 61 73 20 6e 75 6d 65   treated as nume
3130: 72 69 63 0a 2a 2a 20 6f 72 20 61 73 20 74 65 78  ric.** or as tex
3140: 74 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d  t.  See the OP_M
3150: 61 6b 65 4b 65 79 20 61 6e 64 20 4f 50 5f 4d 61  akeKey and OP_Ma
3160: 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 0a  keIdxKey opcode.
3170: 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ** documentation
3180: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
3190: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
31a0: 74 20 74 68 65 20 50 33 20 73 74 72 69 6e 67 2e  t the P3 string.
31b0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
31c0: 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79   sqliteAddIdxKey
31d0: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
31e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
31f0: 64 4b 65 79 54 79 70 65 28 56 64 62 65 20 2a 76  dKeyType(Vdbe *v
3200: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
3210: 73 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  st){.  int nColu
3220: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
3230: 70 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  pr;.  char *zTyp
3240: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3250: 28 20 6e 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ( nColumn+1 );. 
3260: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 54   int i;.  if( zT
3270: 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ype==0 ) return;
3280: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
3290: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
32a0: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 73 71 6c 69   zType[i] = sqli
32b0: 74 65 45 78 70 72 54 79 70 65 28 70 45 4c 69 73  teExprType(pELis
32c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d  t->a[i].pExpr)==
32d0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 3f 20  SQLITE_SO_NUM ? 
32e0: 27 6e 27 20 3a 20 27 74 27 3b 0a 20 20 7d 0a 20  'n' : 't';.  }. 
32f0: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 30 3b 0a 20   zType[i] = 0;. 
3300: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
3310: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65  eP3(v, -1, zType
3320: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71  , nColumn);.  sq
3330: 6c 69 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b  liteFree(zType);
3340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3350: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
3360: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
3370: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
3380: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
3390: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
33a0: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
33b0: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
33c0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
33d0: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
33e0: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
33f0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
3400: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
3410: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
3420: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
3430: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
3440: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
3450: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
3460: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
3470: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
3480: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
3490: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
34a0: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
34b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
34c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
34d0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
34e0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3500: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
3510: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3520: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
3530: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
3540: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
3550: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
3560: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
3570: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
3580: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
3590: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
35a0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
35b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
35c0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
35d0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  in the source ta
35e0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
35f0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3600: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
3610: 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73   sort results us
3620: 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a  ing this key */.
3630: 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20    int distinct, 
3640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
3650: 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72  >=0, make sure r
3660: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69  esults are disti
3670: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  nct */.  int eDe
3680: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
3690: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
36a0: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
36b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
36c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
36d0: 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  * An argument to
36e0: 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65   the disposal me
36f0: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  thod */.  int iC
3700: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
3710: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3720: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
3730: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
3740: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
3750: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
3760: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
3770: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
3780: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
3790: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
37a0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  e;.  int i;..  i
37b0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
37c0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   0;.  assert( pE
37d0: 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  List!=0 );..  /*
37e0: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
37f0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
3800: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
3810: 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68  ment, then do th
3820: 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20  e check.  ** to 
3830: 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20  see if this row 
3840: 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74  should be output
3850: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
3860: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
3870: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
3880: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
3890: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  dr = sqliteVdbeC
38a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
38b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
38c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
38d0: 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 2c 20  cr, p->nOffset, 
38e0: 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 73  addr+2);.      s
38f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3900: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
3910: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
3920: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69      if( p->nLimi
3930: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t>=0 ){.      sq
3940: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3950: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
3960: 6e 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  nLimit, iBreak);
3970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3980: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
3990: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
39a0: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
39b0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
39c0: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
39d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
39e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
39f0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
3a00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
3a10: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
3a20: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3a30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
3a40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3a50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
3a60: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3a70: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3a80: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3a90: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3aa0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3ab0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3ac0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3ad0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3ae0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3af0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3b00: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3b10: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3b20: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3b30: 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e  .  if( distinct>
3b40: 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26 26 20  =0 && pEList && 
3b50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
3b60: 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41  ){.#if NULL_ALWA
3b70: 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  YS_DISTINCT.    
3b80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3b90: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70  v, OP_IsNull, -p
3ba0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71  EList->nExpr, sq
3bb0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
3bc0: 64 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69  ddr(v)+7);.#endi
3bd0: 66 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  f.    sqliteVdbe
3be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3bf0: 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Key, pEList->nEx
3c00: 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
3c10: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
3c20: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c  _format>=4 ) sql
3c30: 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 76 2c  iteAddKeyType(v,
3c40: 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
3c50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3c60: 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69   OP_Distinct, di
3c70: 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65 56 64  stinct, sqliteVd
3c80: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3c90: 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  +3);.    sqliteV
3ca0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3cb0: 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  op, pEList->nExp
3cc0: 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  r+1, 0);.    sql
3cd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3ce0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
3cf0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
3d00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3d10: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3d20: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3d30: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3d40: 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  rKey, distinct, 
3d50: 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  0);.  }..  switc
3d60: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
3d70: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
3d80: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
3d90: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
3da0: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
3db0: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
3dc0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3dd0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
3de0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
3df0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3e00: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3e10: 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41  olumn, NULL_ALWA
3e20: 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20  YS_DISTINCT);.  
3e30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3e40: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3e50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
3e60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3e70: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3e80: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3ea0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
3eb0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
3ec0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
3ed0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
3ee0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
3ef0: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
3f00: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
3f10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f20: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3f30: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3f40: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3f50: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
3f60: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3f70: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3f90: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3fa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
3fb0: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
3fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3fd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3fe0: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
3ff0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4000: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
4010: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
4020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4030: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4040: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
4050: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
4060: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
4070: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
4080: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
4090: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
40a0: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
40b0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
40c0: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
40d0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
40e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
40f0: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
4100: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4110: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
4120: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4130: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4140: 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59  lumn, NULL_ALWAY
4150: 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20  S_DISTINCT);.   
4160: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4170: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
4180: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
4190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
41a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
41b0: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29  elete, iParm, 0)
41c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
41d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
41e0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
41f0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
4200: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
4210: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
4220: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
4230: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
4240: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
4250: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
4260: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
4270: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
4280: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
4290: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
42a0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
42b0: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
42c0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
42d0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
42e0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
42f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4300: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
4310: 4e 75 6c 6c 2c 20 2d 31 2c 20 6c 62 6c 29 3b 0a  Null, -1, lbl);.
4320: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4330: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
4340: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4350: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
4360: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4380: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4390: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
43a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
43b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
43c0: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
43d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
43e0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
43f0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
4400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4410: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
4420: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
4430: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
4440: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
4450: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
4460: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
4470: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
4480: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
4490: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
44a0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
44b0: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
44c0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
44d0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
44e0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
44f0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4500: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
4510: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4520: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
4530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
4550: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4560: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4570: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4580: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4590: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
45a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
45b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
45c0: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
45d0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
45e0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ck function..   
45f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4600: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
4610: 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20  ase SRT_Sorter: 
4620: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
4630: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4640: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4650: 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65  v, OP_SortMakeRe
4660: 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  c, nColumn, 0);.
4670: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4680: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4690: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
46a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
46b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
46c0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b  =SRT_Callback );
46d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
46e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
46f0: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
4700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
4710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4720: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
4730: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
4740: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c  handle the resul
4750: 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74  ts.  The subrout
4760: 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ine itself.    *
4770: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
4780: 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65   for popping the
4790: 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20   results off of 
47a0: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
47b0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
47c0: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
47d0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
47e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
47f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4800: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4810: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4820: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4830: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
4840: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
4850: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4860: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4870: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4880: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
48a0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
48b0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
48c0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
48d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
48e0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
48f0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
4900: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
4910: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
4920: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
4930: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
4940: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4950: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
4960: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4970: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4980: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4990: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
49a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
49b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
49c0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
49d0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
49e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
49f0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4a00: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4a10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4a20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4a30: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
4a40: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
4a50: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
4a60: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
4a70: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
4a80: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
4a90: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
4aa0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
4ab0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
4ac0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
4ad0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
4ae0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
4af0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
4b00: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
4b10: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
4b20: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
4b30: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
4b40: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
4b50: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 53 65 6c  eSortTail(.  Sel
4b60: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4b70: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4b80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
4b90: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
4ba0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4bb0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
4bc0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4bd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4be0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
4bf0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
4c00: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4c10: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
4c20: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
4c30: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
4c40: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
4c50: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4c60: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4c70: 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c 69 74 65  int end = sqlite
4c80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4c90: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
4ca0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4cb0: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
4cc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4cd0: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c  p(v, OP_Sort, 0,
4ce0: 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71   0);.  addr = sq
4cf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4d00: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4d10: 20 65 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e   end);.  if( p->
4d20: 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  nOffset>0 ){.   
4d30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4d40: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
4d50: 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 61 64 64 72  p->nOffset, addr
4d60: 2b 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  +4);.    sqliteV
4d70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4d80: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
4d90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4da0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
4db0: 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dr);.  }.  if( p
4dc0: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
4dd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4de0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
4df0: 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 65 6e 64  , p->nLimit, end
4e00: 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  );.  }.  switch(
4e10: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
4e20: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4e30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   {.      sqliteV
4e40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4e50: 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  ortCallback, nCo
4e60: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4e70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4e80: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4e90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
4ea0: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
4eb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4ec0: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
4ed0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4ee0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4ef0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
4f00: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4f10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4f20: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
4f30: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4f40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4f50: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4f60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4f70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4f80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4f90: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31  v, OP_IsNull, -1
4fa0: 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  , sqliteVdbeCurr
4fb0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4fc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4fd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
4fe0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
4ff0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5000: 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
5010: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
5020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5030: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
5040: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5050: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5060: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5070: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
5080: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
5090: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
50a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
50b0: 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 20  , 0, end);.     
50c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
50d0: 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f    case SRT_Subro
50e0: 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
50f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
5100: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
5110: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
5120: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5130: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69   OP_Column, -1-i
5140: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
5150: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5160: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
5170: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
5180: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5190: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
51a0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
51b0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
51c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
51d0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
51e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
51f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65    }.  sqliteVdbe
5200: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5210: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  , 0, addr);.  sq
5220: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5230: 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20  abel(v, end);.  
5240: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5250: 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c  v, OP_SortReset,
5260: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
5270: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5280: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
5290: 65 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74  e VDBE the datat
52a0: 79 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  ypes of.** colum
52b0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
52c0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   set..**.** This
52d0: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65   routine only ge
52e0: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20  nerates code if 
52f0: 74 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77  the "PRAGMA show
5300: 5f 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a  _datatypes=on".*
5310: 2a 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75  * has been execu
5320: 74 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79  ted.  The dataty
5330: 70 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  pes are reported
5340: 20 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f   out in the azCo
5350: 6c 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74  l.** parameter t
5360: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
5370: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
5380: 72 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e  rst N azCol[] en
5390: 74 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65  tries.** are the
53a0: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
53b0: 6c 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73  lumns, and the s
53c0: 65 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20  econd N entries 
53d0: 61 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  are the.** datat
53e0: 79 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  ypes for the col
53f0: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  umns..**.** The 
5400: 22 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61  "datatype" for a
5410: 20 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20   result that is 
5420: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79  a column of a ty
5430: 70 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74  pe is the.** dat
5440: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
5450: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5460: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5470: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54   statement..** T
5480: 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  he datatype for 
5490: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
54a0: 20 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20   either TEXT or 
54b0: 4e 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a  NUMERIC.  The.**
54c0: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20   datatype for a 
54d0: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
54e0: 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69  NTEGER..*/.stati
54f0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
5500: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
5510: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5520: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5530: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  ext */.  int bas
5540: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
5550: 56 44 42 45 20 63 75 72 73 6f 72 20 63 6f 72 72  VDBE cursor corr
5560: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 66 69 72  esponding to fir
5570: 73 74 20 65 6e 74 72 79 20 69 6e 20 70 54 61 62  st entry in pTab
5580: 4c 69 73 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  List */.  SrcLis
5590: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
55a0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
55b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
55c0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
55d0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
55e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
55f0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5600: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5620: 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62  pParse->useCallb
5630: 61 63 6b 20 26 26 20 28 70 50 61 72 73 65 2d 3e  ack && (pParse->
5640: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5650: 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 29 3d  TE_ReportTypes)=
5660: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5670: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
5680: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5690: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
56a0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
56b0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 68  i].pExpr;.    ch
56c0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
56d0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
56e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
56f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
5700: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
5710: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
5720: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5730: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
5740: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ].pTab;.      in
5750: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
5760: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 69  umn;.      if( i
5770: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
5780: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
5790: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
57a0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
57b0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
57c0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
57d0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
57e0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
57f0: 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ER";.      }else
5800: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
5810: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
5820: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
5830: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5840: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
5850: 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54 45  rType(p)==SQLITE
5860: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
5870: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
5880: 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  T";.      }else{
5890: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
58a0: 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20   "NUMERIC";.    
58b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
58c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
58d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
58e0: 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  i + pEList->nExp
58f0: 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
5900: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
5910: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50 33 5f 53   -1, zType, P3_S
5920: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  TATIC);.  }.}../
5930: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
5940: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
5950: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
5960: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
5970: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
5980: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
5990: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
59a0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
59b0: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6f 6c 75 65  * azCol[] vaolue
59c0: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
59d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
59e0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
59f0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
5a00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5a10: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5a20: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
5a30: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
5a40: 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
5a50: 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e  ding to first en
5a60: 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20  try in pTabList 
5a70: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
5a80: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
5a90: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
5aa0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5ab0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
5ac0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
5ad0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
5ae0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5af0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5b00: 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
5b10: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
5b20: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
5b30: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
5b40: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
5b50: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
5b60: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
5b70: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5b80: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
5b90: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  p;.    char *zTy
5ba0: 70 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  pe = 0;.    int 
5bb0: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20  showFullNames;. 
5bc0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
5bd0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
5be0: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
5bf0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
5c00: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
5c10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
5c20: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
5c30: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
5c40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5c50: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
5c60: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
5c70: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5c80: 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  3(v, -1, zName, 
5c90: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
5ca0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5cb0: 20 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 46 75      }.    showFu
5cc0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72 73  llNames = (pPars
5cd0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
5ce0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
5cf0: 65 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  es)!=0;.    if( 
5d00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
5d10: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
5d20: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
5d30: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5d40: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
5d50: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68  ].pTab;.      ch
5d60: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
5d70: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
5d80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
5d90: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
5da0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
5db0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
5dc0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
5dd0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
5de0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
5df0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
5e00: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57      zCol = "_ROW
5e10: 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7a 54  ID_";.        zT
5e20: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
5e30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5e40: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
5e50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
5e60: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 54 79  ame;.        zTy
5e70: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5e80: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
5e90: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5ea0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
5eb0: 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f  pan.z[0] && !sho
5ec0: 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  wFullNames ){.  
5ed0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
5ee0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5ef0: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
5f00: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
5f10: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5f20: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70  eP3(v, -1, p->sp
5f30: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5f40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5f50: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
5f60: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
5f70: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
5f80: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  List->nSrc>1 || 
5f90: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b  showFullNames ){
5fa0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5fb0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
5fc0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
5fd0: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
5fe0: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54  TabList->a[p->iT
5ff0: 61 62 6c 65 20 2d 20 62 61 73 65 5d 2e 7a 41 6c  able - base].zAl
6000: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ias;.        if(
6010: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 7c   showFullNames |
6020: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
6030: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
6050: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
6060: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
6070: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
6080: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6090: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
60a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
60b0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
60c0: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
60d0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
60e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
60f0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
6100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6110: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6120: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
6130: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
6140: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6150: 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c 20  P3(v, -1, zCol, 
6160: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6170: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
6180: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6190: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
61a0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
61b0: 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c  beAddOp(v,OP_Col
61c0: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
61d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
61e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
61f0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
6200: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  an.n);.      sql
6210: 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53  iteVdbeCompressS
6220: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
6230: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6240: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
6250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6260: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
6270: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
6280: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
6290: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
62a0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
62b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
62c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
62d0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
62e0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
62f0: 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74  v, -1, zName, st
6300: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
6310: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
6320: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
6330: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
6340: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
6350: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
6360: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6370: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
6380: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
6390: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
63a0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
63b0: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
63c0: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
63d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
63e0: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
63f0: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
6400: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6410: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
6420: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
6430: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
6440: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
6450: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
6460: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
6470: 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn z;.}../*.** F
6480: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
6490: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
64a0: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
64b0: 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74  t(Parse*, Select
64c0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  *);../*.** Given
64d0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
64e0: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
64f0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
6500: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
6510: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
6520: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
6530: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
6540: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
6550: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
6560: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
6570: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
6580: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
6590: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  b;.  int i;.  Ex
65a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
65b0: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
65c0: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
65d0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
65e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
65f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
6600: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
6610: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
6620: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6630: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
6640: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
6650: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
6660: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
6670: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
6680: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
6690: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
66a0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
66b0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
66c0: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
66d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
66e0: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
66f0: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
6700: 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  l );.  for(i=0; 
6710: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
6720: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
6730: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
6740: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
6750: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
6760: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
6770: 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  eStrDup(pEList->
6780: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
6790: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70 45   }else if( (p=pE
67a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
67b0: 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  )->span.z && p->
67c0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
67d0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
67e0: 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ing(&pTab->aCol[
67f0: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61  i].zName, p->spa
6800: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20  n.z, p->span.n, 
6810: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
6820: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
6830: 26 26 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20  && p->pRight && 
6840: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
6850: 2e 7a 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  .z &&.          
6860: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
6870: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6880: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
6890: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  (&pTab->aCol[i].
68a0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
68b0: 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f     p->pRight->to
68c0: 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69 67 68 74  ken.z, p->pRight
68d0: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
68e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
68f0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
6900: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
6910: 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  f, "column%d", i
6920: 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  +1);.      pTab-
6930: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  >aCol[i].zName =
6940: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42   sqliteStrDup(zB
6950: 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  uf);.    }.  }. 
6960: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
6970: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
6980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
6990: 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
69a0: 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 68  statement, do th
69b0: 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a  ree things..**.*
69c0: 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20 69  *    (1)  Fill i
69d0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
69e0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
69f0: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
6a00: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
6a10: 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74 20  defines the set 
6a20: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
6a30: 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65 64  hould be scanned
6a40: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  . .**.**    (2) 
6a50: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
6a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6a70: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
6a80: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
6a90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
6aa0: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
6ab0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
6ac0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
6ad0: 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74 68      (3)  Scan th
6ae0: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
6af0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
6b00: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
6b10: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
6b20: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
6b30: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
6b40: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
6b50: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
6b60: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
6b70: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
6b80: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
6b90: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
6ba0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
6bb0: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
6bc0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
6bd0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
6be0: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
6bf0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
6c00: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
6c10: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
6c20: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
6c30: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
6c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6c50: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
6c60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6c70: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
6c80: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
6c90: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6ca0: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
6cb0: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
6cc0: 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d  *pTab;..  if( p=
6cd0: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
6ce0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
6cf0: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
6d00: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
6d10: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c  >pEList;..  /* L
6d20: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
6d30: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
6d40: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  list..  */.  for
6d50: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
6d60: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
6d70: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6d80: 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20  a[i].pTab ){.   
6d90: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
6da0: 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
6db0: 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e!  No need to c
6dc0: 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20  ontinue */.     
6dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6de0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
6df0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
6e00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
6e10: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
6e20: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
6e30: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
6e40: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
6e50: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21  t->a[i].pSelect!
6e60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
6e70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6e80: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
6e90: 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61      char zFakeNa
6ea0: 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20  me[60];.        
6eb0: 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d  sprintf(zFakeNam
6ec0: 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  e, "sqlite_subqu
6ed0: 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20  ery_%p_",.      
6ee0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62       (void*)pTab
6ef0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6f00: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
6f10: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 54  iteSetString(&pT
6f20: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6f30: 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20  ias, zFakeName, 
6f40: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6f50: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
6f60: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
6f70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65          sqliteRe
6f80: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
6f90: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
6fa0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
6fe0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
6ff0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7000: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7010: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7020: 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61       pTab->isTra
7030: 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  nsient = 1;.    
7040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
7050: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
7060: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
7070: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7080: 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 4c  e */.      pTabL
7090: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  ist->a[i].pTab =
70a0: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
70b0: 20 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61 62   sqliteLocateTab
70c0: 6c 65 28 70 50 61 72 73 65 2c 70 54 61 62 4c 69  le(pParse,pTabLi
70d0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70  st->a[i].zName,p
70e0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44  TabList->a[i].zD
70f0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
7100: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
7110: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7130: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
7140: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
7150: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
7160: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
7170: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
7180: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71a0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
71b0: 74 65 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  te(pTabList->a[i
71c0: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
71d0: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
71e0: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
71f0: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 54 61  iteSelectDup(pTa
7200: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
7210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7220: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
7230: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
7240: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
7250: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
7260: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
7270: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
7280: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
7290: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
72a0: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
72b0: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
72c0: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
72d0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
72e0: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
72f0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
7300: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
7310: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
7320: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
7330: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
7340: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
7350: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
7360: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
7370: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
7380: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
7390: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
73a0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
73b0: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
73c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
73d0: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
73e0: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
73f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
7400: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
7410: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
7420: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
7430: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
7440: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
7450: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
7460: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
7470: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
7480: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
7490: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
74a0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
74b0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
74c0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
74d0: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
74e0: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
74f0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
7500: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
7510: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
7520: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
7530: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
7540: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
7550: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
7560: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
7570: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
7580: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
7590: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
75a0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
75b0: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
75c0: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
75d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
75e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
75f0: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
7600: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
7610: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
7620: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
7630: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
7640: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
7650: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
7660: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
7670: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
7680: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7690: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
76a0: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
76b0: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
76c0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
76d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
76e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
76f0: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
7700: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
7710: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
7720: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
7730: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
7740: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
7750: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
7760: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
7770: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
7780: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
7790: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
77a0: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
77b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
77c0: 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  ew = sqliteExprL
77d0: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
77e0: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
77f0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
7800: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
7810: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
7820: 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  e;.        a[k].
7830: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
7840: 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
7850: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
7860: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
7870: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7880: 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
7890: 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
78a0: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
78b0: 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
78c0: 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
78d0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
78e0: 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
78f0: 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
7900: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d       Token *pNam
7910: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
7920: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
7930: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
7940: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
7950: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
7960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7970: 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74  ame = &pE->pLeft
7980: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
7990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
79a0: 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    pName = 0;.   
79b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
79c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
79d0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
79e0: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
79f0: 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74  *pTab = pTabList
7a00: 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[i].pTab;.   
7a10: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
7a20: 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74  bName = pTabList
7a30: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[i].zAlias;. 
7a40: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
7a50: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
7a60: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20  Name[0]==0 ){ . 
7a70: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
7a80: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
7a90: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
7aa0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61           if( pNa
7ab0: 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d  me && (zTabName=
7ac0: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
7ad0: 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ]==0 || .       
7ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7af0: 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e  StrNICmp(pName->
7b00: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61  z, zTabName, pNa
7b10: 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20  me->n)!=0 ||.   
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
7b30: 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d  abName[pName->n]
7b40: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
7b50: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7b70: 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
7b80: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
7b90: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
7ba0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
7bb0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7bc0: 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  r, *pLeft, *pRig
7bd0: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
7be0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
7bf0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
7c00: 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
7c10: 69 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62  if( i>0 && (pTab
7c20: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69  List->a[i-1].joi
7c30: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
7c40: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
7c50: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
7c60: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
7c70: 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61  a[i-1].pTab, zNa
7c80: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7ca0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
7cb0: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
7cc0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
7ce0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7cf0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
7d00: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7d10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7d20: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7d30: 26 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e  & sqliteIdListIn
7d40: 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  dex(pTabList->a[
7d50: 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61  i-1].pUsing, zNa
7d60: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7d70: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7d80: 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
7d90: 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
7da0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
7dc0: 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
7dd0: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
7de0: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
7df0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7e00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7e10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
7e20: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70  ight = sqliteExp
7e30: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
7e40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
7e50: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62  f( pRight==0 ) b
7e60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7e70: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7e80: 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  z = zName;.     
7e90: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
7ea0: 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  oken.n = strlen(
7eb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
7ec0: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
7ed0: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
7ee0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
7ef0: 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d  ame && pTabList-
7f00: 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
7f10: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
7f20: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
7f30: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
7f40: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7f50: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
7f60: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
7f70: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
7f80: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
7f90: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7fb0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62  ->token.z = zTab
7fc0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7fd0: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
7fe0: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62  .n = strlen(zTab
7ff0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
8000: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
8010: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
8020: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
8030: 65 74 53 74 72 69 6e 67 28 28 63 68 61 72 2a 2a  etString((char**
8040: 29 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  )&pExpr->span.z,
8050: 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c 20   zTabName, ".", 
8060: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
8070: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8080: 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  span.n = strlen(
8090: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a  pExpr->span.z);.
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
80b0: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
80c0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
80d0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
80e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
80f0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
8100: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
8110: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
8120: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
8130: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8140: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8150: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
8160: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8170: 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74  >span = pExpr->t
8180: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
8190: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
81a0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70  pNew = sqliteExp
81b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
81c0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
81d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
81e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
81f0: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
8200: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
8210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8220: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
8230: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
8240: 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61 6d  table: %T", pNam
8250: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
8260: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
8270: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
8280: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
8290: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
82a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
82b0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
82c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
82d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
82e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
82f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
8300: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
8310: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8330: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
8340: 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c   unlinks the Sel
8350: 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61  ect.pSrc.a[].pTa
8360: 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e  b pointers.** in
8370: 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63 74   a select struct
8380: 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65  ure.  It just se
8390: 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ts the pointers 
83a0: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a  to NULL.  This.*
83b0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63  * routine is rec
83c0: 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73 65  ursive in the se
83d0: 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65 20  nse that if the 
83e0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
83f0: 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74  pSelect.** point
8400: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
8410: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8420: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
8430: 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74  ly on that point
8440: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
8450: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8460: 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73   on the Select s
8470: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
8480: 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20  fines a.** VIEW 
8490: 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f  in order to undo
84a0: 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f   any bindings to
84b0: 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69   tables.  This i
84c0: 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62  s necessary.** b
84d0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61 62  ecause those tab
84e0: 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f  les might be DRO
84f0: 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71 75  Ped by a subsequ
8500: 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e  ent SQL command.
8510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
8520: 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65  electUnbind(Sele
8530: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
8540: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
8550: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61   = p->pSrc;.  Ta
8560: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
8570: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
8580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
8590: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
85a0: 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70     if( (pTab = p
85b0: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21  Src->a[i].pTab)!
85c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
85d0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
85e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
85f0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
8600: 2c 20 70 54 61 62 29 3b 0a 23 69 66 20 30 0a 20  , pTab);.#if 0. 
8610: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c         sqliteSel
8620: 65 63 74 44 65 6c 65 74 65 28 70 53 72 63 2d 3e  ectDelete(pSrc->
8630: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
8640: 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69         pSrc->a[i
8650: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 23  ].pSelect = 0;.#
8660: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
8670: 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70      pSrc->a[i].p
8680: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Tab = 0;.      i
8690: 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  f( pSrc->a[i].pS
86a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
86b0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62   sqliteSelectUnb
86c0: 69 6e 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  ind(pSrc->a[i].p
86d0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
86e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
86f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8700: 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72   associates entr
8710: 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ies in an ORDER 
8720: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  BY expression li
8730: 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d  st with.** colum
8740: 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20  ns in a result. 
8750: 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20   For each ORDER 
8760: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  BY expression, t
8770: 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20  he opcode of.** 
8780: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
8790: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
87a0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
87b0: 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  he iColumn value
87c0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
87d0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
87e0: 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75  led in with colu
87f0: 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  mn number and th
8800: 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  e iTable.** valu
8810: 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  e of the top-lev
8820: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
8830: 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61  d with iTable pa
8840: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  rameter..**.** I
8850: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f  f there are prio
8860: 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73  r SELECT clauses
8870: 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65  , they are proce
8880: 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d  ssed first.  A m
8890: 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61  atch.** in an ea
88a0: 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b  rlier SELECT tak
88b0: 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76  es precedence ov
88c0: 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43  er a later SELEC
88d0: 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74  T..**.** Any ent
88e0: 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ry that does not
88f0: 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65   match is flagge
8900: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  d as an error.  
8910: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
8920: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
8930: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
8940: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
8950: 20 63 6f 72 72 65 63 74 6c 79 20 69 6e 69 74 69   correctly initi
8960: 61 6c 69 7a 65 20 74 68 65 20 45 78 70 72 2e 64  alize the Expr.d
8970: 61 74 61 54 79 70 65 20 20 66 69 65 6c 64 0a 2a  ataType  field.*
8980: 2a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  * of the ORDER B
8990: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  Y expressions.  
89a0: 54 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 53  The multiSelectS
89b0: 6f 72 74 4f 72 64 65 72 28 29 20 72 6f 75 74 69  ortOrder() routi
89c0: 6e 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63 61  ne.** must be ca
89d0: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 61 74 20  lled to do that 
89e0: 61 66 74 65 72 20 74 68 65 20 69 6e 64 69 76 69  after the indivi
89f0: 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74  dual select stat
8a00: 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 61  ements.** have a
8a10: 6c 6c 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64  ll been analyzed
8a20: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8a30: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  is unable to com
8a40: 70 75 74 65 20 45 78 70 72 2e 64 61 74 61 54 79  pute Expr.dataTy
8a50: 70 65 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74  pe.** because it
8a60: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
8a70: 62 65 66 6f 72 65 20 74 68 65 20 69 6e 64 69 76  before the indiv
8a80: 69 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61  idual select sta
8a90: 74 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20  tements.** have 
8aa0: 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a  been analyzed..*
8ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
8ac0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8ad0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
8ae0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8af0: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
8b00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
8b10: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
8b20: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
8b30: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
8b40: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
8b50: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
8b60: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8b70: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
8b80: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
8b90: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
8ba0: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
8bb0: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
8bc0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
8bd0: 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20  value in iTable 
8be0: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d  */.  int mustCom
8bf0: 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20  plete        /* 
8c00: 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45  If TRUE all ORDE
8c10: 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68  R BYs must match
8c20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
8c30: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  r = 0;.  int i, 
8c40: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
8c50: 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  EList;..  if( pS
8c60: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
8c70: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
8c80: 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f   1;.  if( mustCo
8c90: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f  mplete ){.    fo
8ca0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8cb0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20  y->nExpr; i++){ 
8cc0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8cd0: 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20  one = 0; }.  }. 
8ce0: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
8cf0: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
8d00: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
8d10: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
8d20: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
8d30: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
8d40: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8d50: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
8d60: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
8d70: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
8d80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8d90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
8da0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
8db0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
8dc0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8dd0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8de0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
8df0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8e00: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
8e10: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
8e20: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8e30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8e40: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
8e50: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
8e60: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
8e70: 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
8e80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
8e90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8ea0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8eb0: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
8ec0: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
8ed0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
8ee0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
8ef0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
8f00: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
8f10: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
8f20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8f30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8f40: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
8f50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
8f60: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
8f70: 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30   for(j=0; iCol<0
8f80: 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45   && j<pEList->nE
8f90: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
8fa0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
8fb0: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
8fc0: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
8fd0: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
8fe0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8ff0: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
9000: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
9010: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
9020: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
9030: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
9040: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
9050: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
9060: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
9070: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
9080: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
9090: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
90a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
90b0: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
90c0: 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20  abel)==0 ){ .   
90d0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
90e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
90f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c     sqliteFree(zL
9100: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  abel);.      }. 
9110: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
9120: 26 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d  && sqliteExprCom
9130: 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d  pare(pE, pEList-
9140: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[j].pExpr) ){.
9150: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
9160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9170: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
9180: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
9190: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
91a0: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
91b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
91c0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
91d0: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
91e0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
91f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
9200: 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d  Col<0 && mustCom
9210: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73  plete ){.      s
9220: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
9230: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
9240: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
9250: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
9260: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
9270: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
9280: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
9290: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
92a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
92b0: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rr;  .}../*.** G
92c0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
92d0: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
92e0: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
92f0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9300: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
9310: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9320: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
9330: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
9340: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
9350: 65 20 2a 73 71 6c 69 74 65 47 65 74 56 64 62 65  e *sqliteGetVdbe
9360: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
9370: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
9380: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
9390: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
93a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
93b0: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72 65 61  = sqliteVdbeCrea
93c0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
93d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
93e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
93f0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 45  utine sets the E
9400: 78 70 72 2e 64 61 74 61 54 79 70 65 20 66 69 65  xpr.dataType fie
9410: 6c 64 20 6f 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e  ld on all elemen
9420: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 4f 72  ts of.** the pOr
9430: 64 65 72 42 79 20 65 78 70 72 65 73 73 69 6f 6e  derBy expression
9440: 20 6c 69 73 74 2e 20 20 54 68 65 20 70 4f 72 64   list.  The pOrd
9450: 65 72 42 79 20 6c 69 73 74 20 77 69 6c 6c 20 68  erBy list will h
9460: 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 65 74 20  ave been.** set 
9470: 75 70 20 62 79 20 6d 61 74 63 68 4f 72 64 65 72  up by matchOrder
9480: 62 79 54 6f 43 6f 6c 75 6d 6e 28 29 2e 20 20 48  byToColumn().  H
9490: 65 6e 63 65 20 65 61 63 68 20 65 78 70 72 65 73  ence each expres
94a0: 73 69 6f 6e 20 68 61 73 0a 2a 2a 20 61 20 54 4b  sion has.** a TK
94b0: 5f 43 4f 4c 55 4d 4e 20 61 73 20 69 74 73 20 72  _COLUMN as its r
94c0: 6f 6f 74 20 6e 6f 64 65 2e 20 20 54 68 65 20 45  oot node.  The E
94d0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 72 65 66 65  xpr.iColumn refe
94e0: 72 73 20 74 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75  rs to a .** colu
94f0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
9500: 20 73 65 74 2e 20 20 20 54 68 65 20 64 61 74 61   set.   The data
9510: 74 79 70 65 20 69 73 20 73 65 74 20 74 6f 20 53  type is set to S
9520: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a  QLITE_SO_TEXT.**
9530: 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   if the correspo
9540: 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  nding column in 
9550: 70 20 61 6e 64 20 65 76 65 72 79 20 53 45 4c 45  p and every SELE
9560: 43 54 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  CT to the left o
9570: 66 0a 2a 2a 20 70 20 68 61 73 20 61 20 64 61 74  f.** p has a dat
9580: 61 74 79 70 65 20 6f 66 20 53 51 4c 49 54 45 5f  atype of SQLITE_
9590: 53 4f 5f 54 45 58 54 2e 20 20 49 66 20 74 68 65  SO_TEXT.  If the
95a0: 20 63 6f 6f 72 65 73 73 70 6f 6e 64 69 6e 67 20   cooressponding 
95b0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f  column.** in p o
95c0: 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6c 65 66  r any of the lef
95d0: 74 20 53 45 4c 45 43 54 73 20 69 73 20 53 51 4c  t SELECTs is SQL
95e0: 49 54 45 5f 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e  ITE_SO_NUM, then
95f0: 20 74 68 65 20 64 61 74 61 74 79 70 65 0a 2a 2a   the datatype.**
9600: 20 6f 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   of the order-by
9610: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73   expression is s
9620: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f  et to SQLITE_SO_
9630: 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  NUM..**.** Examp
9640: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  les:.**.**     C
9650: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
9660: 61 20 49 4e 54 45 47 45 52 2c 20 62 20 54 45 58  a INTEGER, b TEX
9670: 54 29 3b 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  T);.**     CREAT
9680: 45 20 54 41 42 4c 45 20 74 77 6f 28 63 20 56 41  E TABLE two(c VA
9690: 52 43 48 41 52 28 35 29 2c 20 64 20 46 4c 4f 41  RCHAR(5), d FLOA
96a0: 54 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  T);.**.**     SE
96b0: 4c 45 43 54 20 62 2c 20 62 20 46 52 4f 4d 20 6f  LECT b, b FROM o
96c0: 6e 65 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  ne UNION SELECT 
96d0: 64 2c 20 63 20 46 52 4f 4d 20 74 77 6f 20 4f 52  d, c FROM two OR
96e0: 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 2a 2a 0a  DER BY 1, 2;.**.
96f0: 2a 2a 20 54 68 65 20 70 72 69 6d 61 72 79 20 73  ** The primary s
9700: 6f 72 74 20 6b 65 79 20 77 69 6c 6c 20 75 73 65  ort key will use
9710: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 62   SQLITE_SO_NUM b
9720: 65 63 61 75 73 65 20 74 68 65 20 22 64 22 20 69  ecause the "d" i
9730: 6e 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  n.** the second 
9740: 53 45 4c 45 43 54 20 69 73 20 6e 75 6d 65 72 69  SELECT is numeri
9750: 63 2e 20 20 54 68 65 20 31 73 74 20 63 6f 6c 75  c.  The 1st colu
9760: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
9770: 53 45 4c 45 43 54 0a 2a 2a 20 69 73 20 74 65 78  SELECT.** is tex
9780: 74 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  t but that does 
9790: 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
97a0: 73 65 20 61 20 6e 75 6d 65 72 69 63 20 61 6c 77  se a numeric alw
97b0: 61 79 73 20 6f 76 65 72 72 69 64 65 73 0a 2a 2a  ays overrides.**
97c0: 20 61 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54   a text..**.** T
97d0: 68 65 20 73 65 63 6f 6e 64 61 72 79 20 6b 65 79  he secondary key
97e0: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 53 51   will use the SQ
97f0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 73 6f 72  LITE_SO_TEXT sor
9800: 74 20 6f 72 64 65 72 20 62 65 63 61 75 73 65 0a  t order because.
9810: 2a 2a 20 62 6f 74 68 20 74 68 65 20 28 73 65 63  ** both the (sec
9820: 6f 6e 64 29 20 22 62 22 20 69 6e 20 74 68 65 20  ond) "b" in the 
9830: 66 69 72 73 74 20 53 45 4c 45 43 54 20 61 6e 64  first SELECT and
9840: 20 74 68 65 20 22 63 22 20 69 6e 20 74 68 65 20   the "c" in the 
9850: 73 65 63 6f 6e 64 0a 2a 2a 20 53 45 4c 45 43 54  second.** SELECT
9860: 20 68 61 76 65 20 61 20 64 61 74 61 74 79 70 65   have a datatype
9870: 20 6f 66 20 74 65 78 74 2e 0a 2a 2f 20 0a 73 74   of text..*/ .st
9880: 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 53  atic void multiS
9890: 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 53  electSortOrder(S
98a0: 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69  elect *p, ExprLi
98b0: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
98c0: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
98d0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 69 66  st *pEList;.  if
98e0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
98f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 3d  return;.  if( p=
9900: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
9910: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
9920: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9930: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
9940: 2e 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65  .pExpr->dataType
9950: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
9960: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  T;.    }.    ret
9970: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69  urn;.  }.  multi
9980: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
9990: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  p->pPrior, pOrde
99a0: 72 42 79 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rBy);.  pEList =
99b0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
99c0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
99d0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
99e0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
99f0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9a00: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
9a10: 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54  >dataType==SQLIT
9a20: 45 5f 53 4f 5f 4e 55 4d 20 29 20 63 6f 6e 74 69  E_SO_NUM ) conti
9a30: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
9a40: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   pE->iColumn>=0 
9a50: 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  );.    if( pELis
9a60: 74 2d 3e 6e 45 78 70 72 3e 70 45 2d 3e 69 43 6f  t->nExpr>pE->iCo
9a70: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 45  lumn ){.      pE
9a80: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 73 71 6c  ->dataType = sql
9a90: 69 74 65 45 78 70 72 54 79 70 65 28 70 45 4c 69  iteExprType(pELi
9aa0: 73 74 2d 3e 61 5b 70 45 2d 3e 69 43 6f 6c 75 6d  st->a[pE->iColum
9ab0: 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  n].pExpr);.    }
9ac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9ad0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9ae0: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
9af0: 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20  a query that is 
9b00: 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e  really the union
9b10: 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74  .** or intersect
9b20: 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ion of two or mo
9b30: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
9b40: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  ies..**.** "p" p
9b50: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
9b60: 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
9b70: 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
9b80: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
9b90: 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
9ba0: 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
9bb0: 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
9bc0: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
9bd0: 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
9be0: 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
9bf0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
9c00: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
9c10: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
9c20: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
9c30: 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
9c40: 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
9c50: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
9c60: 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
9c70: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
9c80: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
9c90: 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
9ca0: 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
9cb0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
9cc0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
9cd0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
9ce0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
9cf0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
9d00: 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
9d10: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
9d20: 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
9d30: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
9d40: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
9d50: 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
9d60: 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
9d70: 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
9d90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9da0: 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
9db0: 43 54 20 63 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT c FROM t1.**.
9dc0: 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
9dd0: 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
9de0: 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
9df0: 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
9e00: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
9e10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9e20: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
9e30: 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
9e40: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
9e50: 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
9e60: 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
9e70: 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
9e80: 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
9e90: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
9ea0: 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
9eb0: 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
9ec0: 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
9ed0: 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
9ee0: 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
9ef0: 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
9f00: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
9f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
9f20: 75 6c 74 69 53 65 6c 65 63 74 28 50 61 72 73 65  ultiSelect(Parse
9f30: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9f40: 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
9f50: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e  int iParm){.  in
9f60: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
9f70: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
9f80: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
9f90: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
9fa0: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20  *pPrior;     /* 
9fb0: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
9fc0: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
9fd0: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
9fe0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
9ff0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
a000: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
a010: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
a020: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
a030: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20  ER BY clause on 
a040: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
a050: 4f 6e 6c 79 20 74 68 65 20 0a 20 20 2a 2a 20 6c  Only the .  ** l
a060: 61 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68  ast SELECT in th
a070: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
a080: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  e an ORDER BY.. 
a090: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   */.  if( p==0 |
a0a0: 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  | p->pPrior==0 )
a0b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50 72   return 1;.  pPr
a0c0: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
a0d0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
a0e0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
a0f0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
a100: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
a110: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
a120: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
a130: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
a140: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
a150: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
a160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
a170: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
a180: 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69  valid query engi
a190: 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65  ne.  If not, cre
a1a0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
a1b0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
a1c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a1d0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
a1e0: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72  turn 1;..  /* Cr
a1f0: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
a200: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
a210: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
a220: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  y.  */.  if( eDe
a230: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
a240: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
a250: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
a260: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
a270: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
a280: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
a290: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
a2a0: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
a2b0: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
a2c0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
a2d0: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
a2e0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a2f0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
a300: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
a310: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a320: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
a330: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44  arse, pPrior, eD
a340: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
a350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
a360: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a370: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
a380: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
a390: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
a3a0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
a3b0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
a3c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  , 0);.        p-
a3d0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
a3e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
a3f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a410: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
a420: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
a430: 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68  ORDER BY fall th
a440: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
a450: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
a460: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
a470: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
a480: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
a490: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
a4a0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
a4b0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
a4c0: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
a4d0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
a4e0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
a4f0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
a500: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
a510: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
a520: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
a530: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
a540: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
a550: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
a560: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
a570: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
a580: 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f  derBy;  /* The O
a590: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
a5a0: 6f 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c  or the right SEL
a5b0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72  ECT */..      pr
a5c0: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
a5d0: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
a5e0: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
a5f0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
a600: 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f  priorOp && p->pO
a610: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
a620: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
a630: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
a640: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
a650: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
a660: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
a670: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
a680: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
a690: 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20  b = iParm;.     
a6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a6b0: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
a6c0: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
a6d0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
a6e0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
a6f0: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
a700: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
a710: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a720: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
a730: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a740: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
a750: 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26  erBy .        &&
a760: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
a770: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
a780: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e   p->pOrderBy, un
a790: 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20  ionTab, 1) ){.  
a7a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a7b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a7c0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
a7d0: 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  K_ALL ){.       
a7e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a7f0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
a800: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b  p, unionTab, 1);
a810: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a820: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a830: 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f  _KeyAsData, unio
a840: 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20  nTab, 1);.      
a850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a860: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a870: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
a880: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  p, unionTab, 0);
a890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a8a0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
a8b0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
a8c0: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
a8d0: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
a8e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
a8f0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
a900: 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  ior, priorOp, un
a910: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29  ionTab, 0, 0, 0)
a920: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
a930: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
a940: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
a950: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
a960: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
a970: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
a980: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
a990: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
a9a0: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
a9b0: 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
a9c0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
a9d0: 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
a9e0: 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
a9f0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
aa00: 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
aa10: 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
aa20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aa30: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
aa40: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
aa50: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
aa60: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
aa70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
aa80: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
aa90: 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69  arse, p, op, uni
aaa0: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b  onTab, 0, 0, 0);
aab0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
aac0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
aad0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
aae0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 69  OrderBy;.      i
aaf0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ab00: 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  c;..      /* Con
ab10: 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
ab20: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
ab30: 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
ab40: 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
ab50: 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
ab60: 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
ab70: 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20       */      .  
ab80: 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70      if( eDest!=p
ab90: 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54  riorOp || unionT
aba0: 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20  ab!=iParm ){.   
abb0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
abc0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
abd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abe0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
abf0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
ac00: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
ac10: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
ac20: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
ac30: 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 30  arse, p->base, 0
ac40: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
ac50: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
ac60: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
ac70: 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e  se, p->base, p->
ac80: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
ac90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aca0: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
acb0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
acc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
acd0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
ace0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
acf0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ad00: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
ad10: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
ad20: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
ad30: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62  tart = sqliteVdb
ad40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
ad50: 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 53 65  .        multiSe
ad60: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c  lectSortOrder(p,
ad70: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
ad80: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
ad90: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
ada0: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
adb0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
adc0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f             p->pO
adf0: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
ae00: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
ae30: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
ae40: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ae50: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
ae60: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
ae70: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
ae80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ae90: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
aea0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
aeb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
aec0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
aed0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
aee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
aef0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
af00: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
af10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
af20: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
af30: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53         generateS
af40: 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d  ortTail(p, v, p-
af50: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
af60: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
af70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
af80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
af90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
afa0: 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20  INTERSECT: {.   
afb0: 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
afc0: 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  2;.      int iCo
afd0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
afe0: 72 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  rt;..      /* IN
aff0: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
b000: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
b010: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
b020: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
b030: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
b040: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
b050: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
b060: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
b070: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
b080: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
b090: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
b0a0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
b0b0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b0c0: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
b0d0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
b0e0: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
b0f0: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
b100: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
b110: 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74  ,p,p->pOrderBy,t
b120: 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  ab1,1) ){.      
b130: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b140: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b150: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b160: 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20  OpenTemp, tab1, 
b170: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b180: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b190: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c  KeyAsData, tab1,
b1a0: 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   1);..      /* C
b1b0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
b1c0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
b1d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b1e0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
b1f0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
b200: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
b210: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
b220: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
b230: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
b240: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
b250: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
b260: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
b270: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
b280: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
b290: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
b2a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b2b0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32  P_OpenTemp, tab2
b2c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
b2d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b2e0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
b2f0: 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  2, 1);.      p->
b300: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
b310: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
b320: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53  ect(pParse, p, S
b330: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20  RT_Union, tab2, 
b340: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b350: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
b360: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  or;.      if( rc
b370: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
b380: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
b390: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
b3a0: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
b3b0: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
b3c0: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
b3d0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
b3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
b3f0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
b400: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
b410: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
b420: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b430: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Names(pParse, p-
b440: 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c  >base, 0, p->pEL
b450: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 67 65  ist);.        ge
b460: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
b470: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
b480: 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70  e, p->pSrc, p->p
b490: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
b4a0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
b4b0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
b4c0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
b4d0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
b4e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b4f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b500: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
b510: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
b520: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
b530: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b540: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
b550: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
b560: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b570: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
b580: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
b590: 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72    multiSelectSor
b5a0: 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72  tOrder(p, p->pOr
b5b0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 72 63  derBy);.      rc
b5c0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
b5d0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
b5e0: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
b5f0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
b600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
b620: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
b630: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
b660: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
b670: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b680: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
b690: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b6a0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
b6b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b6c0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  p(v, OP_Next, ta
b6d0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
b6e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
b6f0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
b700: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
b710: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b720: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
b730: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
b740: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b750: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
b760: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
b770: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
b780: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
b790: 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  l(p, v, p->pELis
b7a0: 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
b7b0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d   iParm);.      }
b7c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b7d0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
b7e0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
b7f0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
b800: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
b810: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
b820: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
b830: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
b840: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
b850: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
b860: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
b870: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
b880: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
b890: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
b8a0: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
b8b0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
b8c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
b8d0: 20 7d 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61   }..  /* Issue a
b8e0: 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69   null callback i
b8f0: 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74  f that is what t
b900: 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20  he user wants.. 
b910: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
b920: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26 26  =SRT_Callback &&
b930: 0a 20 20 20 20 28 70 50 61 72 73 65 2d 3e 75 73  .    (pParse->us
b940: 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20  eCallback==0 || 
b950: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
b960: 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c  gs & SQLITE_Null
b970: 43 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20 20  Callback)!=0).  
b980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
b990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
b9a0: 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 45  lCallback, p->pE
b9b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
b9c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
b9e0: 69 76 65 6c 79 20 73 63 61 6e 20 74 68 72 6f 75  ively scan throu
b9f0: 67 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  gh an expression
ba00: 20 74 72 65 65 2e 20 20 46 6f 72 20 65 76 65 72   tree.  For ever
ba10: 79 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  y reference.** t
ba20: 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  o a column in ta
ba30: 62 6c 65 20 6e 75 6d 62 65 72 20 69 46 72 6f 6d  ble number iFrom
ba40: 2c 20 63 68 61 6e 67 65 20 74 68 61 74 20 72 65  , change that re
ba50: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
ba60: 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 6e  * same column in
ba70: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
ba80: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
ba90: 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e  d changeTablesIn
baa0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 20  List(ExprList*, 
bab0: 69 6e 74 2c 20 69 6e 74 29 3b 20 20 2f 2a 20 46  int, int);  /* F
bac0: 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
bad0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
bae0: 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 45  d changeTables(E
baf0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
bb00: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
bb10: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
bb20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
bb30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
bb40: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
bb50: 54 61 62 6c 65 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Table==iFrom ){.
bb60: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
bb70: 65 20 3d 20 69 54 6f 3b 0a 20 20 7d 65 6c 73 65  e = iTo;.  }else
bb80: 7b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c  {.    changeTabl
bb90: 65 73 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  es(pExpr->pLeft,
bba0: 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20   iFrom, iTo);.  
bbb0: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
bbc0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 46  Expr->pRight, iF
bbd0: 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63  rom, iTo);.    c
bbe0: 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73  hangeTablesInLis
bbf0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
bc00: 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 7d  iFrom, iTo);.  }
bc10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
bc20: 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73  hangeTablesInLis
bc30: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
bc40: 74 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  t, int iFrom, in
bc50: 74 20 69 54 6f 29 7b 0a 20 20 69 66 28 20 70 4c  t iTo){.  if( pL
bc60: 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ist ){.    int i
bc70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
bc80: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
bc90: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67  ++){.      chang
bca0: 65 54 61 62 6c 65 73 28 70 4c 69 73 74 2d 3e 61  eTables(pList->a
bcb0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 46 72 6f 6d  [i].pExpr, iFrom
bcc0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
bcd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  }.}../*.** Scan 
bce0: 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
bcf0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
bd00: 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
bd10: 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
bd20: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
bd30: 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
bd40: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
bd50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
bd60: 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
bd70: 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
bd80: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
bd90: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
bda0: 20 75 6e 63 68 61 6e 67 65 64 2e 29 20 20 57 68   unchanged.)  Wh
bdb0: 65 6e 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  en making a copy
bdc0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
bdd0: 6e 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 68 61  n in pEList, cha
bde0: 6e 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  nge.** reference
bdf0: 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
be00: 74 61 62 6c 65 20 69 53 75 62 20 69 6e 74 6f 20  table iSub into 
be10: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
be20: 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a  ble iTable..**.*
be30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
be40: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
be50: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
be60: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
be70: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
be80: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
be90: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
bea0: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
beb0: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
bec0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
bed0: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
bee0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
bef0: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
bf00: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
bf10: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
bf20: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
bf30: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
bf40: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
bf50: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
bf60: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
bf70: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
bf80: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
bf90: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
bfa0: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
bfb0: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
bfc0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
bfd0: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
bfe0: 2c 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 29 3b  ,ExprList*,int);
bff0: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63    /* Forward Dec
c000: 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l */.static void
c010: 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20   substExpr(Expr 
c020: 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62  *pExpr, int iTab
c030: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
c040: 4c 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29 7b  List, int iSub){
c050: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c060: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
c070: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
c080: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
c090: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
c0a0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
c0b0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =0 ){.    Expr *
c0c0: 70 4e 65 77 3b 0a 20 20 20 20 61 73 73 65 72 74  pNew;.    assert
c0d0: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
c0e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
c0f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
c100: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
c110: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
c120: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
c130: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
c140: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 );.    pNew = 
c150: 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
c160: 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
c170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
c180: 77 21 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70  w!=0 );.    pExp
c190: 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
c1a0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74  ;.    pExpr->dat
c1b0: 61 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61  aType = pNew->da
c1c0: 74 61 54 79 70 65 3b 0a 20 20 20 20 61 73 73 65  taType;.    asse
c1d0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
c1e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72  ==0 );.    pExpr
c1f0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
c200: 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ExprDup(pNew->pL
c210: 65 66 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  eft);.    assert
c220: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
c230: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c240: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
c250: 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52  ExprDup(pNew->pR
c260: 69 67 68 74 29 3b 0a 20 20 20 20 61 73 73 65 72  ight);.    asser
c270: 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
c280: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c290: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45  >pList = sqliteE
c2a0: 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d  xprListDup(pNew-
c2b0: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  >pList);.    pEx
c2c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
c2d0: 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70  w->iTable;.    p
c2e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
c2f0: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
c300: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
c310: 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
c320: 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79   sqliteTokenCopy
c330: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
c340: 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
c350: 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f     sqliteTokenCo
c360: 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  py(&pExpr->span,
c370: 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20   &pNew->span);. 
c380: 20 20 20 69 66 28 20 69 53 75 62 21 3d 69 54 61     if( iSub!=iTa
c390: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ble ){.      cha
c3a0: 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70 72 2c  ngeTables(pExpr,
c3b0: 20 69 53 75 62 2c 20 69 54 61 62 6c 65 29 3b 0a   iSub, iTable);.
c3c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c3d0: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78     substExpr(pEx
c3e0: 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
c3f0: 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29  e, pEList, iSub)
c400: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
c410: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
c420: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69  Table, pEList, i
c430: 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45  Sub);.    substE
c440: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
c450: 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
c460: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d  List, iSub);.  }
c470: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a  .}.static void .
c480: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
c490: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
c4a0: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
c4b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74  ist *pEList, int
c4c0: 20 69 53 75 62 29 7b 0a 20 20 69 6e 74 20 69 3b   iSub){.  int i;
c4d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c4e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
c4f0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
c500: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
c510: 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
c520: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
c530: 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62  le, pEList, iSub
c540: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
c550: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
c560: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
c570: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
c580: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
c590: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
c5a0: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
c5b0: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
c5c0: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
c5d0: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
c5e0: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
c5f0: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
c600: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
c610: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
c620: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
c630: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
c640: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
c650: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
c660: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
c670: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
c680: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
c690: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
c6a0: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
c6b0: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
c6c0: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
c6d0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
c6e0: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
c6f0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
c700: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
c710: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
c720: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
c730: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
c740: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
c750: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
c760: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
c770: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c780: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
c790: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
c7a0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
c7b0: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
c7c0: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
c7d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
c7e0: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
c7f0: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
c800: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
c810: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
c820: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
c830: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
c840: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
c850: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
c860: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
c870: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
c880: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
c890: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
c8a0: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
c8b0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
c8c0: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
c8d0: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
c8e0: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
c8f0: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
c900: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
c910: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
c920: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
c930: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
c940: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
c950: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
c960: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
c970: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
c980: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
c990: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
c9a0: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
c9b0: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
c9c0: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
c9d0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
c9e0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
c9f0: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
ca00: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
ca10: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
ca20: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
ca30: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ca40: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
ca50: 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
ca60: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
ca70: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
ca80: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
ca90: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
caa0: 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
cab0: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
cac0: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
cad0: 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
cae0: 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
caf0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
cb00: 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
cb10: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
cb20: 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
cb30: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cb40: 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
cb50: 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
cb60: 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
cb70: 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
cb80: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
cb90: 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
cba0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
cbb0: 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
cbc0: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
cbd0: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
cbe0: 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
cbf0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
cc00: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
cc10: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
cc20: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
cc30: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
cc40: 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
cc50: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
cc60: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
cc70: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
cc80: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
cc90: 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
cca0: 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
ccb0: 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
ccc0: 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
ccd0: 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
cce0: 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
ccf0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
cd00: 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
cd10: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
cd20: 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
cd30: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
cd40: 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
cd50: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
cd60: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
cd70: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
cd80: 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
cd90: 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
cda0: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
cdb0: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
cdc0: 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
cdd0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
cde0: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
cdf0: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
ce00: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
ce10: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
ce20: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
ce30: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
ce40: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
ce50: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
ce60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
ce70: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
ce80: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
ce90: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
cea0: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
ceb0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
cec0: 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
ced0: 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
cee0: 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
cef0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
cf00: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
cf10: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
cf20: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
cf30: 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
cf40: 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
cf50: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
cf60: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
cf70: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
cf80: 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
cf90: 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
cfa0: 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
cfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cfc0: 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
cfd0: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
cfe0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
cff0: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
d000: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* 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 20 66 75 6e 63 74   aggregate funct
d030: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
d040: 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
d050: 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
d060: 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
d070: 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
d080: 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
d090: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
d0a0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d0b0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d0c0: 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
d0d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
d0e0: 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
d0f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d100: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
d110: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
d120: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
d130: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 50 61  int i;.  int iPa
d140: 72 65 6e 74 2c 20 69 53 75 62 3b 0a 20 20 45 78  rent, iSub;.  Ex
d150: 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f  pr *pWhere;..  /
d160: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
d170: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
d180: 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
d190: 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
d1a0: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
d1b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
d1c0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
d1d0: 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
d1e0: 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
d1f0: 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
d200: 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46  Sub = pSrc->a[iF
d210: 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  rom].pSelect;.  
d220: 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
d230: 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
d240: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
d250: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d260: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
d270: 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
d280: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
d290: 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
d2a0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
d2b0: 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70  ubSrc );.  if( p
d2c0: 53 75 62 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  SubSrc->nSrc!=1 
d2d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d2e0: 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
d2f0: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69  nct || pSub->nLi
d300: 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72  mit>=0) &&  (pSr
d310: 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
d320: 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
d330: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
d340: 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  (p->isDistinct |
d350: 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20  | p->nLimit>=0) 
d360: 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
d370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d380: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
d390: 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
d3a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d3b0: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
d3c0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
d3d0: 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
d3e0: 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
d3f0: 74 68 65 0a 20 20 2a 2a 20 69 2d 74 68 20 65 6e  the.  ** i-th en
d400: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
d410: 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
d420: 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
d430: 20 20 69 50 61 72 65 6e 74 20 3d 20 70 2d 3e 62    iParent = p->b
d440: 61 73 65 20 2b 20 69 46 72 6f 6d 3b 0a 20 20 69  ase + iFrom;.  i
d450: 53 75 62 20 3d 20 70 53 75 62 2d 3e 62 61 73 65  Sub = pSub->base
d460: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
d470: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  t(p->pEList, iPa
d480: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
d490: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 70 4c 69  st, iSub);.  pLi
d4a0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
d4b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
d4c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
d4d0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
d4e0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
d4f0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26  >a[i].zName==0 &
d500: 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74  & (pExpr = pList
d510: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
d520: 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  pan.z!=0 ){.    
d530: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
d540: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
d550: 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  Dup(pExpr->span.
d560: 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
d570: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
d580: 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
d590: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
d5a0: 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
d5b0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
d5c0: 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62  , iSub);.    sub
d5d0: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
d5e0: 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
d5f0: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
d600: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
d610: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
d620: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
d630: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
d640: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
d650: 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
d660: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
d670: 3d 20 30 3b 0a 20 20 20 20 63 68 61 6e 67 65 54  = 0;.    changeT
d680: 61 62 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70  ablesInList(p->p
d690: 4f 72 64 65 72 42 79 2c 20 69 53 75 62 2c 20 69  OrderBy, iSub, i
d6a0: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  Parent);.  }else
d6b0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
d6c0: 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
d6d0: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
d6e0: 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
d6f0: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
d700: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
d710: 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
d720: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78  Where = sqliteEx
d730: 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
d740: 72 65 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  re);.    if( iPa
d750: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
d760: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
d770: 28 70 57 68 65 72 65 2c 20 69 53 75 62 2c 20 69  (pWhere, iSub, i
d780: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  Parent);.    }. 
d790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
d7a0: 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
d7b0: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
d7c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d7d0: 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
d7e0: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
d7f0: 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
d800: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
d810: 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
d820: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
d830: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
d840: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
d850: 69 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  if( pSub->pHavin
d860: 67 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  g ){.      Expr 
d870: 2a 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  *pHaving = sqlit
d880: 65 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  eExprDup(pSub->p
d890: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69  Having);.      i
d8a0: 66 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62  f( iParent!=iSub
d8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 6e   ){.        chan
d8c0: 67 65 54 61 62 6c 65 73 28 70 48 61 76 69 6e 67  geTables(pHaving
d8d0: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
d8e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d8f0: 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
d900: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
d910: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70  ving = sqliteExp
d920: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61  r(TK_AND, p->pHa
d930: 76 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30  ving, pHaving, 0
d940: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d950: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69          p->pHavi
d960: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
d970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d980: 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
d990: 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  pBy==0 );.    p-
d9a0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
d9b0: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 53  teExprListDup(pS
d9c0: 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  ub->pGroupBy);. 
d9d0: 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d     if( iParent!=
d9e0: 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68  iSub ){.      ch
d9f0: 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74  angeTablesInList
da00: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 53  (p->pGroupBy, iS
da10: 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20  ub, iParent);.  
da20: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
da30: 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a  p->pWhere==0 ){.
da40: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
da50: 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b  pWhere;.  }else{
da60: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
da70: 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
da80: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c  t, pSub->pEList,
da90: 20 69 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   iSub);.    if( 
daa0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
dab0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
dac0: 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  teExpr(TK_AND, p
dad0: 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
dae0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
daf0: 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
db00: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
db10: 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
db20: 6e 63 74 3b 0a 0a 20 20 69 66 28 20 70 53 75 62  nct;..  if( pSub
db30: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
db40: 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74     if( p->nLimit
db50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  <0 ){.      p->n
db60: 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c  Limit = pSub->nL
db70: 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  imit;.    }else 
db80: 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d  if( p->nLimit+p-
db90: 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d  >nOffset > pSub-
dba0: 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f  >nLimit+pSub->nO
dbb0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
dbc0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
dbd0: 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e  >nLimit + pSub->
dbe0: 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66  nOffset - p->nOf
dbf0: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fset;.    }.  }.
dc00: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20    p->nOffset += 
dc10: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a  pSub->nOffset;..
dc20: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
dc30: 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 73 75  uery contains su
dc40: 62 71 75 65 72 69 65 73 20 6f 66 20 69 74 73 20  bqueries of its 
dc50: 6f 77 6e 2c 20 74 68 61 74 20 77 65 72 65 20 6e  own, that were n
dc60: 6f 74 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 65  ot.  ** flattene
dc70: 64 2c 20 74 68 65 6e 20 63 6f 64 65 20 77 69 6c  d, then code wil
dc80: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
dc90: 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 74 6f  een generated to
dca0: 20 70 75 74 0a 20 20 2a 2a 20 74 68 65 20 72 65   put.  ** the re
dcb0: 73 75 6c 74 73 20 6f 66 20 74 68 6f 73 65 20 73  sults of those s
dcc0: 75 62 2d 73 75 62 71 75 65 72 69 65 73 20 69 6e  ub-subqueries in
dcd0: 74 6f 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  to VDBE cursors 
dce0: 72 65 6c 61 74 69 76 65 0a 20 20 2a 2a 20 74 6f  relative.  ** to
dcf0: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
dd00: 57 65 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74  We must translat
dd10: 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
dd20: 62 65 72 20 69 6e 74 6f 20 76 61 6c 75 65 73 0a  ber into values.
dd30: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
dd40: 72 20 75 73 65 20 62 79 20 74 68 65 20 6f 75 74  r use by the out
dd50: 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
dd60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 75 62   for(i=0; i<pSub
dd70: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
dd80: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
dd90: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 61    if( pSubSrc->a
dda0: 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
ddb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 76   continue;.    v
ddc0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
ddd0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
dde0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ddf0: 20 4f 50 5f 52 65 6e 61 6d 65 43 75 72 73 6f 72   OP_RenameCursor
de00: 2c 20 70 53 75 62 2d 3e 62 61 73 65 2b 69 2c 20  , pSub->base+i, 
de10: 70 2d 3e 62 61 73 65 2b 69 29 3b 0a 20 20 7d 0a  p->base+i);.  }.
de20: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69  .  if( pSrc->a[i
de30: 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53  From].pTab && pS
de40: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
de50: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
de60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  {.    sqliteDele
de70: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d  teTable(0, pSrc-
de80: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b  >a[iFrom].pTab);
de90: 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 61 5b 69  .  }.  pSrc->a[i
dea0: 46 72 6f 6d 5d 2e 70 54 61 62 20 3d 20 70 53 75  From].pTab = pSu
deb0: 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  bSrc->a[0].pTab;
dec0: 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d  .  pSubSrc->a[0]
ded0: 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 61 73 73  .pTab = 0;.  ass
dee0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 46 72  ert( pSrc->a[iFr
def0: 6f 6d 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 53 75  om].pSelect==pSu
df00: 62 20 29 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 69  b );.  pSrc->a[i
df10: 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 20 3d 20  From].pSelect = 
df20: 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  pSubSrc->a[0].pS
df30: 65 6c 65 63 74 3b 0a 20 20 70 53 75 62 53 72 63  elect;.  pSubSrc
df40: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
df50: 20 30 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65   0;.  sqliteSele
df60: 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
df70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
df80: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
df90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
dfa0: 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
dfb0: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
dfc0: 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
dfd0: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
dfe0: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
dff0: 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
e000: 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
e010: 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
e020: 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
e030: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e040: 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
e050: 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
e060: 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
e070: 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
e080: 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
e090: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
e0a0: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
e0b0: 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
e0c0: 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
e0d0: 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
e0e0: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
e0f0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
e100: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
e110: 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
e120: 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
e130: 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
e140: 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
e150: 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
e160: 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
e170: 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
e180: 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
e190: 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
e1a0: 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
e1b0: 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
e1c0: 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
e1d0: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
e1e0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
e1f0: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
e200: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
e210: 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
e220: 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
e230: 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
e240: 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
e250: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
e260: 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
e270: 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
e280: 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 53 65   as for sqliteSe
e290: 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74  lect()..** See t
e2a0: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
e2b0: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
e2c0: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
e2d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
e2e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70  .static int simp
e2f0: 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61  leMinMaxQuery(Pa
e300: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
e310: 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73  ect *p, int eDes
e320: 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
e330: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
e340: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c  int iCol;.  Tabl
e350: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
e360: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61   *pIdx;.  int ba
e370: 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  se;.  Vdbe *v;. 
e380: 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69   int seekOp;.  i
e390: 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c  nt cont;.  ExprL
e3a0: 69 73 74 20 65 4c 69 73 74 3b 0a 20 20 73 74 72  ist eList;.  str
e3b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e3c0: 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20 20  m eListItem;..  
e3d0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
e3e0: 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
e3f0: 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
e400: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
e410: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
e420: 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
e430: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e440: 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
e450: 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
e460: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
e470: 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53   if( p->pSrc->nS
e480: 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
e490: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
e4a0: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
e4b0: 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20  turn 0;.  pExpr 
e4c0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
e4d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
e4e0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
e4f0: 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
e500: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
e510: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  r->pList==0 || p
e520: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
e530: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
e540: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
e550: 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
e560: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
e570: 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72  teStrNICmp(pExpr
e580: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c  ->token.z,"min",
e590: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
e5a0: 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
e5b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
e5c0: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70  iteStrNICmp(pExp
e5d0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
e5e0: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
e5f0: 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  ekOp = OP_Last;.
e600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
e610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78  urn 0;.  }.  pEx
e620: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  pr = pExpr->pLis
e630: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
e640: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
e650: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
e660: 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70  rn 0;.  iCol = p
e670: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
e680: 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
e690: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
e6a0: 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
e6b0: 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
e6c0: 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
e6d0: 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
e6e0: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
e6f0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
e700: 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
e710: 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
e720: 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
e730: 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
e740: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
e750: 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
e760: 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
e770: 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
e780: 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
e790: 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
e7a0: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
e7b0: 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
e7c0: 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
e7d0: 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
e7e0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
e7f0: 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
e800: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
e810: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e820: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e830: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
e840: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
e850: 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
e860: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e870: 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b  0]==iCol ) break
e880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e890: 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
e8a0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64   0;.  }..  /* Id
e8b0: 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
e8c0: 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
e8d0: 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c  e using the call
e8e0: 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
e8f0: 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
e900: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
e910: 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
e920: 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
e930: 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ell..  */.  v = 
e940: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
e950: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
e960: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
e970: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
e980: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
e990: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
e9a0: 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61  es(pParse, p->ba
e9b0: 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e  se, p->pSrc, p->
e9c0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 67 65 6e  pEList);.    gen
e9d0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
e9e0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
e9f0: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
ea00: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
ea10: 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   Generating code
ea20: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e   to find the min
ea30: 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61   or the max.  Ba
ea40: 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68  sically all we h
ea50: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
ea60: 73 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  s find the first
ea70: 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74   or the last ent
ea80: 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e  ry in the chosen
ea90: 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a   index.  If.  **
eaa0: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
eab0: 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e  x() is on the IN
eac0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ead0: 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65  Y, then find the
eae0: 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c   first.  ** or l
eaf0: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
eb00: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a   main table..  *
eb10: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
eb20: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
eb30: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
eb40: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
eb50: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
eb60: 20 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69    sqliteCodeVeri
eb70: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  fySchema(pParse)
eb80: 3b 0a 20 20 7d 0a 20 20 62 61 73 65 20 3d 20 70  ;.  }.  base = p
eb90: 2d 3e 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  ->base;.  sqlite
eba0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ebb0: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
ebc0: 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
ebd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ebe0: 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2c 20  OpenRead, base, 
ebf0: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73  pTab->tnum);.  s
ec00: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
ec10: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
ec20: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
ec30: 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  ;.  cont = sqlit
ec40: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
ec50: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
ec60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
ec70: 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
ec80: 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  p, base, 0);.  }
ec90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
eca0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ecb0: 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69  Integer, pIdx->i
ecc0: 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
ecd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ece0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65  P_OpenRead, base
ecf0: 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b  +1, pIdx->tnum);
ed00: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
ed10: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
ed20: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
ed30: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
ed40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  teVdbeAddOp(v, s
ed50: 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30  eekOp, base+1, 0
ed60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
ed70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
ed80: 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30  Recno, base+1, 0
ed90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
eda0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
edb0: 73 65 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  se, base+1, 0);.
edc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
edd0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f  dOp(v, OP_MoveTo
ede0: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a  , base, 0);.  }.
edf0: 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20    eList.nExpr = 
ee00: 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69  1;.  memset(&eLi
ee10: 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  stItem, 0, sizeo
ee20: 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20  f(eListItem));. 
ee30: 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73   eList.a = &eLis
ee40: 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61  tItem;.  eList.a
ee50: 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
ee60: 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  r;.  selectInner
ee70: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
ee80: 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  &eList, 0, 0, 0,
ee90: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
eea0: 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b 0a  m, cont, cont);.
eeb0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
eec0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
eed0: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  );.  sqliteVdbeA
eee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
eef0: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 72 65  , base, 0);.  re
ef00: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
ef10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
ef20: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
ef30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
ef40: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
ef50: 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
ef60: 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
ef70: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
ef80: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
ef90: 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
efa0: 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
efb0: 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
efc0: 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
efd0: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f000: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
f010: 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
f020: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
f030: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
f040: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
f050: 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
f060: 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
f070: 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
f080: 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
f090: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
f0a0: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
f0b0: 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
f0c0: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 63 75   a table with cu
f0d0: 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  rsor iParm.**.**
f0e0: 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
f0f0: 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
f100: 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
f110: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f120: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
f130: 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
f140: 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
f150: 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  form the tempora
f160: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
f170: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
f180: 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
f190: 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
f1a0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
f1b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
f1c0: 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70   above is incomp
f1d0: 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61  lete.  Additiona
f1e0: 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61  l eDist value ha
f1f0: 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73  ve be added.** s
f200: 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e  ince this commen
f210: 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20  t was written.  
f220: 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e  See the selectIn
f230: 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69  nerLoop() functi
f240: 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70  on for.** a comp
f250: 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20  lete listing of 
f260: 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  the allowed valu
f270: 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  es of eDest and 
f280: 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a  their meanings..
f290: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f2a0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
f2b0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
f2c0: 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
f2d0: 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
f2e0: 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
f2f0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
f300: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
f310: 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
f320: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
f330: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
f340: 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
f350: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
f360: 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
f370: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
f380: 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
f390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
f3a0: 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61  nt, parentTab, a
f3b0: 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66  nd *pParentAgg f
f3c0: 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64  ields are filled
f3d0: 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53   in if this.** S
f3e0: 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75  ELECT is a subqu
f3f0: 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ery.  This routi
f400: 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f  ne may try to co
f410: 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43  mbine this SELEC
f420: 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61  T.** with its pa
f430: 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73  rent to form a s
f440: 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79  ingle flat query
f450: 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20  .  In so doing, 
f460: 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e  it might.** chan
f470: 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  ge the parent qu
f480: 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61  ery from a non-a
f490: 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61  ggregate to an a
f4a0: 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
f4b0: 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73  ** For that reas
f4c0: 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41  on, the pParentA
f4d0: 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65  gg flag is passe
f4e0: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20  d as a pointer, 
f4f0: 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20  so it.** can be 
f500: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
f510: 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20  xample 1:   The 
f520: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  meaning of the p
f530: 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
f540: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
f550: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  T * FROM t1 JOIN
f560: 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e   (SELECT x, coun
f570: 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f  t(*) FROM t2) JO
f580: 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20  IN t3;.**    \  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62      \_______ sub
f5b0: 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20  query _______/  
f5c0: 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c        /.**     \
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20        /.**      
f610: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
f620: 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
f630: 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
f640: 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69  _____/.**.** Thi
f650: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f660: 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65  led for the oute
f670: 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20  r query first.  
f680: 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a   For that call,.
f690: 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  ** pParent will 
f6a0: 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67  be NULL.  During
f6b0: 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
f6c0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
f6d0: 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75  ry, this .** rou
f6e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
f6f0: 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61  ecursively to ha
f700: 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72  ndle the subquer
f710: 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75  y.  For the recu
f720: 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70  rsive.** call, p
f730: 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e  Parent will poin
f740: 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  t to the outer q
f750: 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74  uery.  Because t
f760: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a  he subquery is.*
f770: 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  * the second ele
f780: 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d  ment in a three-
f790: 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61  way join, the pa
f7a0: 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65  rentTab paramete
f7b0: 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28  r will.** be 1 (
f7c0: 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66  the 2nd value of
f7d0: 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72   a 0-indexed arr
f7e0: 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ay.).*/.int sqli
f7f0: 74 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  teSelect(.  Pars
f800: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f810: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
f820: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
f830: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
f840: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
f850: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
f860: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
f870: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
f880: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
f890: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
f8a0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
f8b0: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
f8c0: 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
f8d0: 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
f8e0: 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
f8f0: 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
f900: 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
f910: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
f920: 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
f930: 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
f940: 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
f950: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
f960: 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
f970: 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
f980: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
f990: 61 72 65 6e 74 41 67 67 20 20 20 20 20 20 20 20  arentAgg        
f9a0: 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
f9b0: 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
f9c0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
f9d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
f9e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
f9f0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
fa00: 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20   isAgg = 0;     
fa10: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
fa20: 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
fa30: 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
fa40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
fa50: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
fa60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
fa70: 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
fa80: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
fa90: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
faa0: 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
fab0: 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
fac0: 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
fad0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
fae0: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
faf0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
fb00: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
fb10: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
fb20: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
fb30: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
fb40: 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
fb50: 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
fb60: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
fb70: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
fb80: 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
fb90: 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
fba0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
fbb0: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
fbc0: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
fbd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
fbe0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
fbf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
fc00: 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
fc10: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
fc20: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
fc30: 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
fc40: 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20   int base;      
fc50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
fc60: 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62 6c   cursor availabl
fc70: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20 69  e for use */.  i
fc80: 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
fc90: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
fca0: 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
fcb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
fcc0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
fcd0: 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
fce0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
fcf0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
fd00: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
fd10: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fd20: 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
fd30: 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
fd40: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
fd50: 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
fd60: 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
fd70: 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
fd80: 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
fd90: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
fda0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
fdb0: 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
fdc0: 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  p, eDest, iParm)
fdd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
fde0: 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
fdf0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
fe00: 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
fe10: 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
fe20: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68  = p->pSrc;.  pWh
fe30: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
fe40: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
fe50: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 47 72  >pOrderBy;.  pGr
fe60: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
fe70: 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
fe80: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
fe90: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
fea0: 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
feb0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63   Allocate a bloc
fec0: 6b 20 6f 66 20 56 44 42 45 20 63 75 72 73 6f 72  k of VDBE cursor
fed0: 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  s, one for each 
fee0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
fef0: 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 54  M clause..  ** T
ff00: 68 65 20 57 48 45 52 45 20 70 72 6f 63 65 73 73  he WHERE process
ff10: 69 6e 67 20 72 65 71 75 69 72 65 73 20 74 68 61  ing requires tha
ff20: 74 20 74 68 65 20 63 75 72 73 6f 72 73 20 66 6f  t the cursors fo
ff30: 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
ff40: 74 68 65 0a 20 20 2a 2a 20 46 52 4f 4d 20 63 6c  the.  ** FROM cl
ff50: 61 75 73 65 20 62 65 20 63 6f 6e 73 65 63 75 74  ause be consecut
ff60: 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65  ive..  */.  base
ff70: 20 3d 20 70 2d 3e 62 61 73 65 20 3d 20 70 50 61   = p->base = pPa
ff80: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61  rse->nTab;.  pPa
ff90: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 70 54 61  rse->nTab += pTa
ffa0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20  bList->nSrc;..  
ffb0: 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  /* .  ** Do not 
ffc0: 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  even attempt to 
ffd0: 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64  generate any cod
ffe0: 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72  e if we have alr
fff0: 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65  eady seen.  ** e
10000 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69  rrors before thi
10010 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
10020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10030 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f  rse->nErr>0 ) go
10040 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
10050 20 20 2f 2a 20 45 78 70 61 6e 64 20 61 6e 79 20    /* Expand any 
10060 22 2a 22 20 74 65 72 6d 73 20 69 6e 20 74 68 65  "*" terms in the
10070 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 28 46   result set.  (F
10080 6f 72 20 65 78 61 6d 70 6c 65 20 74 68 65 20 22  or example the "
10090 2a 22 20 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45  *" in.  ** "SELE
100a0 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 29 20 20  CT * FROM t1")  
100b0 54 68 65 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  The fillInColumn
100c0 6c 69 73 74 28 29 20 72 6f 75 74 69 6e 65 20 61  list() routine a
100d0 6c 73 6f 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20  lso does some.  
100e0 2a 2a 20 6f 74 68 65 72 20 68 6f 75 73 65 6b 65  ** other houseke
100f0 65 70 69 6e 67 20 2d 20 73 65 65 20 74 68 65 20  eping - see the 
10100 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
10110 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f  or details..  */
10120 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
10130 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
10140 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  p) ){.    goto s
10150 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
10160 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
10170 65 72 65 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  ere;.  pEList = 
10180 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
10190 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74   pEList==0 ) got
101a0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
101b0 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
101c0 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
101d0 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
101e0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
101f0 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
10200 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
10210 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
10220 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
10230 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  et) && pEList->n
10240 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71  Expr>1 ){.    sq
10250 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
10260 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
10270 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
10280 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
10290 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
102a0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
102b0 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
102c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
102d0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20    }..  /* ORDER 
102e0 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  BY is ignored fo
102f0 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69  r some destinati
10300 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  ons..  */.  swit
10310 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
10320 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
10330 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
10340 63 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53  cept:.    case S
10350 52 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20  RT_Discard:.    
10360 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
10370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10380 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
10390 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
103a0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
103b0 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  we should have a
103c0 6c 6c 6f 63 61 74 65 64 20 61 6c 6c 20 74 68 65  llocated all the
103d0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
103e0 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61  .  ** need to ha
103f0 6e 64 6c 65 20 73 75 62 71 75 65 72 79 73 20 61  ndle subquerys a
10400 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  nd temporary tab
10410 6c 65 73 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  les.  .  **.  **
10420 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c   Resolve the col
10430 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f  umn names and do
10440 20 61 20 73 65 6d 61 6e 74 69 63 73 20 63 68 65   a semantics che
10450 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78  ck on all the ex
10460 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
10470 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
10480 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
10490 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
104a0 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
104b0 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61  Parse, base, pTa
104c0 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74  bList, 0, pEList
104d0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
104e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
104f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
10500 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10510 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
10520 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10530 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a  , 1, &isAgg) ){.
10540 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10550 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
10560 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b  .  if( pWhere ){
10570 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
10580 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
10590 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62  arse, base, pTab
105a0 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 57  List, pEList, pW
105b0 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 67  here) ){.      g
105c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
105d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
105e0 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
105f0 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c  arse, pWhere, 0,
10600 20 30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   0) ){.      got
10610 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10620 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 4f 72    }.    sqliteOr
10630 61 63 6c 65 38 4a 6f 69 6e 46 69 78 75 70 28 62  acle8JoinFixup(b
10640 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  ase, pTabList, p
10650 57 68 65 72 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Where);.  }.  if
10660 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
10670 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30   if( pGroupBy==0
10680 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10690 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
106a0 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61   "a GROUP BY cla
106b0 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
106c0 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b  before HAVING");
106d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
106e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
106f0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10700 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
10710 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73  e, base, pTabLis
10720 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69  t, pEList, pHavi
10730 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
10740 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10750 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10760 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
10770 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c 20  se, pHaving, 1, 
10780 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20  &isAgg) ){.     
10790 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
107a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
107b0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
107c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
107d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
107e0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
107f0 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ol;.      Expr *
10800 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
10810 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
10820 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
10830 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
10840 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26  ol) && iCol>0 &&
10850 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
10860 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
10870 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
10880 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
10890 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
108a0 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
108b0 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
108c0 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
108d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
108e0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
108f0 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
10900 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c   base, pTabList,
10910 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a   pEList, pE) ){.
10920 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
10930 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
10940 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10950 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
10960 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30 29  e, pE, isAgg, 0)
10970 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
10980 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
10990 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
109a0 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
109b0 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20  ant(pE) ){.     
109c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
109d0 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
109e0 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iCol)==0 ){.    
109f0 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
10a00 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
10a10 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
10a20 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
10a30 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
10a40 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20  r constants");. 
10a50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
10a60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10a70 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
10a80 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
10a90 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
10aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
10ab0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44              "ORD
10ad0 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d  ER BY column num
10ae0 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61  ber %d out of ra
10af0 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
10b00 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
10b10 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
10b20 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d  ", iCol, pEList-
10b30 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
10b40 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10b50 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
10b60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10b70 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
10b80 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
10b90 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
10ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
10bb0 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78  t iCol;.      Ex
10bc0 70 72 20 2a 70 45 20 3d 20 70 47 72 6f 75 70 42  pr *pE = pGroupB
10bd0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
10be0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
10bf0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
10c00 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e   &iCol) && iCol>
10c10 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73  0 && iCol<=pELis
10c20 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
10c30 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
10c40 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
10c50 20 20 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d    pE = pGroupBy-
10c60 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
10c70 6c 69 74 65 45 78 70 72 44 75 70 28 70 45 4c 69  liteExprDup(pELi
10c80 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45  st->a[iCol-1].pE
10c90 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
10ca0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
10cb0 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
10cc0 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
10cd0 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  ist, pEList, pE)
10ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
10cf0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
10d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
10d10 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
10d20 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67 67  Parse, pE, isAgg
10d30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
10d40 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
10d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10d60 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 43  f( sqliteExprIsC
10d70 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20  onstant(pE) ){. 
10d80 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
10d90 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  eExprIsInteger(p
10da0 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a  E, &iCol)==0 ){.
10db0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10dc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 47 52  .            "GR
10de0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 6d 75 73  OUP BY terms mus
10df0 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74  t not be non-int
10e00 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 29  eger constants")
10e10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
10e20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
10e30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
10e40 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
10e50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
10e60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10e70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47  .             "G
10e90 52 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e  ROUP BY column n
10ea0 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20  umber %d out of 
10eb0 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
10ec0 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
10ed0 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
10ee0 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73  %d", iCol, pELis
10ef0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
10f00 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
10f10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
10f20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10f30 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
10f40 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
10f50 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
10f60 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
10f70 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
10f80 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
10f90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
10fa0 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
10fb0 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
10fc0 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
10fd0 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
10fe0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
10ff0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
11000 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
11010 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
11020 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11030 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
11040 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
11050 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
11060 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
11070 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
11080 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e  m in a callback.
11090 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
110a0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
110b0 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
110c0 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ng to some other
110d0 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
110e0 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
110f0 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
11100 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
11110 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
11120 70 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73  p->base, pTabLis
11130 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
11140 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
11150 6d 69 74 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28  miter.  */.  if(
11160 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30 20 29 7b   p->nLimit<=0 ){
11170 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d  .    p->nLimit =
11180 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6e 4f 66 66   -1;.    p->nOff
11190 73 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  set = 0;.  }else
111a0 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  {.    int iMem =
111b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
111c0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
111d0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
111e0 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20  er, -p->nLimit, 
111f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
11200 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
11210 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29  mStore, iMem, 1)
11220 3b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20  ;.    p->nLimit 
11230 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  = iMem;.    if( 
11240 70 2d 3e 6e 4f 66 66 73 65 74 3c 3d 30 20 29 7b  p->nOffset<=0 ){
11250 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65  .      p->nOffse
11260 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
11270 7b 0a 20 20 20 20 20 20 69 4d 65 6d 20 3d 20 70  {.      iMem = p
11280 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
11290 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
112a0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
112b0 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c  er, -p->nOffset,
112c0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
112d0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
112e0 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
112f0 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f   1);.      p->nO
11300 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
11310 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65    }.  }..  /* Ge
11320 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
11330 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
11340 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
11350 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  se.  */.  for(i=
11360 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
11370 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Src; i++){.    i
11380 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
11390 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ].pSelect==0 ) c
113a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
113b0 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
113c0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
113d0 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65  .pSelect, SRT_Te
113e0 6d 70 54 61 62 6c 65 2c 20 62 61 73 65 2b 69 2c  mpTable, base+i,
113f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11400 20 20 70 2c 20 69 2c 20 26 69 73 41 67 67 29 3b    p, i, &isAgg);
11410 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
11420 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68  p->pSrc;.    pWh
11430 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
11440 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
11450 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
11460 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
11470 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
11480 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79    }.    pGroupBy
11490 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
114a0 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d      pHaving = p-
114b0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73  >pHaving;.    is
114c0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
114d0 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20  Distinct;.  }.. 
114e0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
114f0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
11500 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
11510 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
11520 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
11530 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
11540 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
11550 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
11560 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
11570 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
11580 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e  Parent && pParen
11590 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c  tAgg &&.      fl
115a0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
115b0 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
115c0 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
115d0 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
115e0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
115f0 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
11600 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
11610 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  .  }..  /* Ident
11620 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73  ify column types
11630 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75   if we will be u
11640 73 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 2e  sing a callback.
11650 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70    This.  ** step
11660 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
11670 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
11680 6e 67 20 74 6f 20 61 20 64 65 73 74 69 6e 61 74  ng to a destinat
11690 69 6f 6e 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74  ion other.  ** t
116a0 68 61 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a  han a callback..
116b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
116c0 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
116d0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
116e0 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
116f0 2c 20 70 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c  , p->base, pTabL
11700 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
11710 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
11720 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
11730 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
11740 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
11750 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
11760 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
11770 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
11780 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11790 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
117a0 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a   iParm, 0);.  }.
117b0 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c  .  /* Do an anal
117c0 79 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74  ysis of aggregat
117d0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  e expressions.. 
117e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67 67 72   */.  sqliteAggr
117f0 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70  egateInfoReset(p
11800 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 73  Parse);.  if( is
11810 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20  Agg || pGroupBy 
11820 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
11830 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29  Parse->nAgg==0 )
11840 3b 0a 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b  ;.    isAgg = 1;
11850 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11860 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
11870 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
11880 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
11890 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
118a0 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
118b0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
118c0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
118d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
118e0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
118f0 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
11900 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
11910 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11920 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
11930 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
11940 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 47 72  ates(pParse, pGr
11950 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
11960 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
11970 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11980 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11990 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
119a0 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69   pHaving && sqli
119b0 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
119c0 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
119d0 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
119e0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
119f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
11a00 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
11a10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
11a20 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
11a30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11a40 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
11a50 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
11a60 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
11a70 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
11a80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11a90 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
11aa0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11ab0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
11ac0 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a   the aggregator.
11ad0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
11ae0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
11af0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
11b00 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61 72 73  gReset, 0, pPars
11b10 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f  e->nAgg);.    fo
11b20 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
11b30 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
11b40 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
11b50 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 46  c;.      if( (pF
11b60 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  unc = pParse->aA
11b70 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20  gg[i].pFunc)!=0 
11b80 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c  && pFunc->xFinal
11b90 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize!=0 ){.      
11ba0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11bb0 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c  p(v, OP_AggInit,
11bc0 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   0, i);.        
11bd0 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
11be0 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P3(v, -1, (char*
11bf0 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54  )pFunc, P3_POINT
11c00 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ER);.      }.   
11c10 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75   }.    if( pGrou
11c20 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
11c30 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11c40 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
11c50 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11c60 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11c70 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 30 29  _AggFocus, 0, 0)
11c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11c90 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
11ca0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
11cb0 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
11cc0 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29  eDest==SRT_Mem )
11cd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
11ce0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
11cf0 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
11d00 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11d10 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
11d20 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
11d30 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f   /* Open a tempo
11d40 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73  rary table to us
11d50 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
11d60 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
11d70 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
11d80 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
11d90 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11da0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11db0 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
11dc0 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20 31 29  mp, distinct, 1)
11dd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
11de0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
11df0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  }..  /* Begin th
11e00 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
11e10 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20    */.  pWInfo = 
11e20 73 71 6c 69 74 65 57 68 65 72 65 42 65 67 69 6e  sqliteWhereBegin
11e30 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
11e40 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
11e50 72 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  re, 0, .        
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30      pGroupBy ? 0
11e80 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20   : &pOrderBy);. 
11e90 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
11ea0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11eb0 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20  ;..  /* Use the 
11ec0 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
11ed0 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f  oop if we are no
11ee0 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20  t dealing with. 
11ef0 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20   ** aggregates. 
11f00 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
11f10 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65   ){.    if( sele
11f20 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
11f30 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
11f40 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64  , 0, pOrderBy, d
11f50 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a  istinct, eDest,.
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66      iParm, pWInf
11f80 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
11f90 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b  Info->iBreak) ){
11fa0 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
11fb0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11fc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
11fd0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
11fe0 61 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e  aggregates, then
11ff0 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   do the special 
12000 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70  aggregate.  ** p
12010 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a  rocessing.  .  *
12020 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 66  /.  else{.    if
12030 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
12040 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20      int lbl1;.  
12050 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12060 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
12070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
12080 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
12090 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
120a0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
120b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
120c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
120d0 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f 75 70 42  MakeKey, pGroupB
120e0 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
120f0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
12100 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
12110 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65  =4 ) sqliteAddKe
12120 79 54 79 70 65 28 76 2c 20 70 47 72 6f 75 70 42  yType(v, pGroupB
12130 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  y);.      lbl1 =
12140 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
12150 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
12160 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12170 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30  , OP_AggFocus, 0
12180 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 66  , lbl1);.      f
12190 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
121a0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
121b0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
121c0 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
121d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
121e0 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
121f0 64 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  de(pParse, pPars
12200 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
12210 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12220 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12230 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a  _AggSet, 0, i);.
12240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12250 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
12260 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20  abel(v, lbl1);. 
12270 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
12280 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
12290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
122a0 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e  pr *pE;.      in
122b0 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 21  t j;.      if( !
122c0 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
122d0 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
122e0 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 50 61  ;.      pE = pPa
122f0 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
12300 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
12310 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
12320 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
12330 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74     if( pE->pList
12340 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
12350 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74  j=0; j<pE->pList
12360 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
12370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
12380 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12390 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  pE->pList->a[j].
123a0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
123b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
123c0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
123d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
123e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
123f0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12400 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c 20 70 45  P_AggFunc, 0, pE
12410 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c  ->pList ? pE->pL
12420 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
12430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12440 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
12450 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  Func!=0 );.     
12460 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12470 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e  >aAgg[i].pFunc->
12480 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20  xStep!=0 );.    
12490 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
124a0 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
124b0 72 2a 29 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  r*)pParse->aAgg[
124c0 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49  i].pFunc, P3_POI
124d0 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  NTER);.    }.  }
124e0 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
124f0 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
12500 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
12510 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
12520 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
12530 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  e processing agg
12540 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64  regates, we need
12550 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63   to set up a sec
12560 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76  ond loop.  ** ov
12570 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67  er all of the ag
12580 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61  gregate values a
12590 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e  nd process them.
125a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67  .  */.  if( isAg
125b0 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64  g ){.    int end
125c0 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
125d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
125e0 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a    int startagg;.
125f0 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73      startagg = s
12600 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12610 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c  , OP_AggNext, 0,
12620 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 70 50   endagg);.    pP
12630 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 31  arse->useAgg = 1
12640 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
12650 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
12660 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
12670 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
12680 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20  artagg, 1);.    
12690 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  }.    if( select
126a0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
126b0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
126c0 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
126d0 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20  tinct, eDest,.  
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67    iParm, startag
12700 67 2c 20 65 6e 64 61 67 67 29 20 29 7b 0a 20 20  g, endagg) ){.  
12710 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12720 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
12730 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12740 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
12750 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
12760 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
12770 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a  bel(v, endagg);.
12780 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12790 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
127a0 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  0, 0);.    pPars
127b0 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 20  e->useAgg = 0;. 
127c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
127d0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
127e0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
127f0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
12800 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
12810 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
12820 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
12830 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
12840 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
12850 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
12860 54 61 69 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73  Tail(p, v, pELis
12870 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
12880 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20   iParm);.  }... 
12890 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c   /* Issue a null
128a0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61   callback if tha
128b0 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73  t is what the us
128c0 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20  er wants..  */. 
128d0 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
128e0 43 61 6c 6c 62 61 63 6b 20 26 26 0a 20 20 20 20  Callback &&.    
128f0 28 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c  (pParse->useCall
12900 62 61 63 6b 3d 3d 30 20 7c 7c 20 28 70 50 61 72  back==0 || (pPar
12910 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
12920 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
12930 61 63 6b 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20  ack)!=0).  ){.  
12940 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12950 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c  p(v, OP_NullCall
12960 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  back, pEList->nE
12970 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  xpr, 0);.  }..  
12980 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
12990 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
129a0 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
129b0 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
129c0 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
129d0 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
129e0 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
129f0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
12a00 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
12a10 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
12a20 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
12a30 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
12a40 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
12a50 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
12a60 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  ect_end:.  sqlit
12a70 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52 65  eAggregateInfoRe
12a80 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 72  set(pParse);.  r
12a90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.