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

Artifact dfc13cb62ba658c4463179713c40ee25a062b2ba:


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 34  select.c,v 1.134
0200: 20 32 30 30 33 2f 30 34 2f 32 34 20 30 31 3a 34   2003/04/24 01:4
0210: 35 3a 30 34 20 64 72 68 20 45 78 70 20 24 0a 2a  5:04 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 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
7030: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
7040: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
7050: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
7060: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
7070: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
7080: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
7090: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
70a0: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
70b0: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
70c0: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
70d0: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
70e0: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
70f0: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
7100: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
7110: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
7120: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
7130: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20  Transient = 1;. 
7140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7150: 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
7160: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
7170: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
7180: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54  ause */.      pT
7190: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
71a0: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
71b0: 20 20 20 20 73 71 6c 69 74 65 4c 6f 63 61 74 65      sqliteLocate
71c0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 54 61  Table(pParse,pTa
71d0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
71e0: 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  e,pTabList->a[i]
71f0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
7200: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7210: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7220: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7230: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
7240: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
7250: 66 28 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  f( sqliteViewGet
7260: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
7270: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
7280: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
72a0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44     sqliteSelectD
72b0: 65 6c 65 74 65 28 70 54 61 62 4c 69 73 74 2d 3e  elete(pTabList->
72c0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
72d0: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
72e0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[i].pSelect = 
72f0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
7300: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
7310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7320: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
7330: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
7340: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
7350: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
7360: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
7370: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
7380: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
7390: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
73a0: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
73b0: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
73c0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
73d0: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
73e0: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
73f0: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
7400: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
7410: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
7420: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
7430: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
7440: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
7450: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
7460: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
7470: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
7480: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
7490: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
74a0: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
74b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
74c0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
74d0: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
74e0: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
74f0: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
7500: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
7510: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
7520: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
7530: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
7540: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
7550: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
7560: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
7570: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
7580: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
7590: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
75a0: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
75b0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
75c0: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
75d0: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
75e0: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
75f0: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
7600: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
7610: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
7620: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
7630: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
7640: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
7650: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
7660: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
7670: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
7680: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
7690: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
76a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
76b0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
76c0: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
76d0: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
76e0: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
76f0: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
7700: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
7710: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
7720: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
7730: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
7740: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
7750: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
7760: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
7770: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
7780: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
7790: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
77a0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
77b0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
77c0: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
77d0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
77e0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
77f0: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
7800: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
7810: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
7820: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
7830: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
7840: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
7850: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
7860: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
7870: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
7880: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
7890: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
78a0: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
78b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
78c0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78   pNew = sqliteEx
78d0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
78e0: 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30  w, a[k].pExpr, 0
78f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
7900: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
7910: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
7920: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b  Name;.        a[
7930: 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
7940: 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
7950: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
7960: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
7970: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
7980: 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
7990: 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
79a0: 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
79b0: 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
79c0: 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
79d0: 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
79e0: 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
79f0: 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
7a00: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
7a10: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
7a20: 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
7a30: 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
7a40: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
7a50: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c  TK_DOT && pE->pL
7a60: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
7a70: 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c   pName = &pE->pL
7a80: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
7a90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7aa0: 20 20 20 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a       pName = 0;.
7ab0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ac0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
7ad0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
7ae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
7af0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c  le *pTab = pTabL
7b00: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a  ist->a[i].pTab;.
7b10: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7b20: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c  zTabName = pTabL
7b30: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
7b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7b50: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
7b60: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
7b70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
7b80: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
7b90: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7ba0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7bb0: 70 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  pName && (zTabNa
7bc0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
7bd0: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7bf0: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d  iteStrNICmp(pNam
7c00: 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  e->z, zTabName, 
7c10: 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a  pName->n)!=0 ||.
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d   zTabName[pName-
7c40: 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  >n]!=0) ){.     
7c50: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7c60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7c70: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
7c80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
7c90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
7ca0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
7cb0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7cc0: 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70  Expr, *pLeft, *p
7cd0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
7ce0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
7cf0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
7d00: 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20  Name;..         
7d10: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 28 70     if( i>0 && (p
7d20: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e  TabList->a[i-1].
7d30: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
7d40: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
7d60: 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
7d70: 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20  t->a[i-1].pTab, 
7d80: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
7d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7da0: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
7db0: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
7dc0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
7dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
7de0: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
7df0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
7e00: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7e20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
7e30: 30 20 26 26 20 73 71 6c 69 74 65 49 64 4c 69 73  0 && sqliteIdLis
7e40: 74 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d  tIndex(pTabList-
7e50: 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20  >a[i-1].pUsing, 
7e60: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
7e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7e80: 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
7e90: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
7ea0: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
7eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
7ec0: 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
7ed0: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
7ee0: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7f00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7f10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7f20: 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
7f30: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
7f40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7f50: 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20    if( pRight==0 
7f60: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
7f70: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
7f80: 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  en.z = zName;.  
7f90: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
7fa0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c  ->token.n = strl
7fb0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  en(zName);.     
7fc0: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
7fd0: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
7fe0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
7ff0: 61 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69  abName && pTabLi
8000: 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
8010: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
8020: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
8030: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8050: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
8060: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
8070: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
8080: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
8090: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
80b0: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  eft->token.z = z
80c0: 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  TabName;.       
80d0: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
80e0: 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ken.n = strlen(z
80f0: 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
8100: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
8110: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
8120: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8130: 74 65 53 65 74 53 74 72 69 6e 67 28 28 63 68 61  teSetString((cha
8140: 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e  r**)&pExpr->span
8150: 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e  .z, zTabName, ".
8160: 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", zName, 0);.  
8170: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8180: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c  r->span.n = strl
8190: 65 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  en(pExpr->span.z
81a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
81b0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
81c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
81d0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
81e0: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .z = 0;.        
81f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
8200: 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.n = 0;.      
8210: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
8220: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
8230: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8250: 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8270: 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72  pr->span = pExpr
8280: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
8290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
82a0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
82b0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
82c0: 4e 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  New, pExpr, 0);.
82d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
82e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
82f0: 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
8300: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
8310: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
8320: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
8330: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
8340: 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70  ch table: %T", p
8350: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
8360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8370: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
8380: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
8390: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
83a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
83b0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
83c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
83d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
83e0: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
83f0: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  e(pEList);.    p
8400: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
8410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8430: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
8440: 65 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  ely unlinks the 
8450: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
8460: 70 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  pTab pointers.**
8470: 20 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72   in a select str
8480: 75 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74  ucture.  It just
8490: 20 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65   sets the pointe
84a0: 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  rs to NULL.  Thi
84b0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
84c0: 72 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65  recursive in the
84d0: 20 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74   sense that if t
84e0: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61  he Select.pSrc.a
84f0: 5b 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f  [].pSelect.** po
8500: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
8510: 4c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  L, this routine 
8520: 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
8530: 69 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f  ively on that po
8540: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
8550: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8560: 6c 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63  led on the Selec
8570: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
8580: 20 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49   defines a.** VI
8590: 45 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75  EW in order to u
85a0: 6e 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73  ndo any bindings
85b0: 20 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69   to tables.  Thi
85c0: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a  s is necessary.*
85d0: 2a 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  * because those 
85e0: 74 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20  tables might be 
85f0: 44 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73  DROPed by a subs
8600: 65 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61  equent SQL comma
8610: 6e 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69  nd..** If the bi
8620: 6e 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72  ndings are not r
8630: 65 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65  emoved, then the
8640: 20 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b   Select.pSrc->a[
8650: 5d 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20  ].pTab field.** 
8660: 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69  will be left poi
8670: 6e 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c  nting to a deall
8680: 6f 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72  ocated Table str
8690: 75 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65  ucture after the
86a0: 0a 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63  .** DROP and a c
86b0: 6f 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63  oredump will occ
86c0: 75 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ur the next time
86d0: 20 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65   the VIEW is use
86e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
86f0: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65  eSelectUnbind(Se
8700: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
8710: 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  i;.  SrcList *pS
8720: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
8730: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
8740: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
8750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8760: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
8770: 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d  .    if( (pTab =
8780: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62   pSrc->a[i].pTab
8790: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
87a0: 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ( pTab->isTransi
87b0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ent ){.        s
87c0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
87d0: 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  (0, pTab);.     
87e0: 20 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61   }.      pSrc->a
87f0: 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20  [i].pTab = 0;.  
8800: 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
8810: 69 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  i].pSelect ){.  
8820: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65        sqliteSele
8830: 63 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61  ctUnbind(pSrc->a
8840: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
8850: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8860: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8870: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
8880: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
8890: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
88a0: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
88b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
88c0: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
88d0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
88e0: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
88f0: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
8900: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
8910: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
8920: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
8930: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
8940: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
8950: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
8960: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
8970: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
8980: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
8990: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
89a0: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
89b0: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
89c0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
89d0: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
89e0: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
89f0: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
8a00: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
8a10: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
8a20: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
8a30: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
8a40: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
8a50: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
8a60: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
8a70: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
8a80: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
8a90: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
8aa0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
8ab0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
8ac0: 73 20 4e 4f 54 20 63 6f 72 72 65 63 74 6c 79 20  s NOT correctly 
8ad0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 45  initialize the E
8ae0: 78 70 72 2e 64 61 74 61 54 79 70 65 20 20 66 69  xpr.dataType  fi
8af0: 65 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 52  eld.** of the OR
8b00: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8b10: 6e 73 2e 20 20 54 68 65 20 6d 75 6c 74 69 53 65  ns.  The multiSe
8b20: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 29 20  lectSortOrder() 
8b30: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
8b40: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  be called to do 
8b50: 74 68 61 74 20 61 66 74 65 72 20 74 68 65 20 69  that after the i
8b60: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
8b70: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68   statements.** h
8b80: 61 76 65 20 61 6c 6c 20 62 65 65 6e 20 61 6e 61  ave all been ana
8b90: 6c 79 7a 65 64 2e 20 20 54 68 69 73 20 72 6f 75  lyzed.  This rou
8ba0: 74 69 6e 65 20 69 73 20 75 6e 61 62 6c 65 20 74  tine is unable t
8bb0: 6f 20 63 6f 6d 70 75 74 65 20 45 78 70 72 2e 64  o compute Expr.d
8bc0: 61 74 61 54 79 70 65 0a 2a 2a 20 62 65 63 61 75  ataType.** becau
8bd0: 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  se it must be ca
8be0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  lled before the 
8bf0: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
8c00: 74 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  t statements.** 
8c10: 68 61 76 65 20 62 65 65 6e 20 61 6e 61 6c 79 7a  have been analyz
8c20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8c30: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
8c40: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
8c50: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8c60: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
8c70: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
8c80: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
8c90: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
8ca0: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
8cb0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
8cc0: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
8cd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
8ce0: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
8cf0: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
8d00: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
8d10: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
8d20: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
8d30: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
8d40: 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54  this value in iT
8d50: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
8d60: 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20  stComplete      
8d70: 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c    /* If TRUE all
8d80: 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20   ORDER BYs must 
8d90: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
8da0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e  t nErr = 0;.  in
8db0: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
8dc0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
8dd0: 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  f( pSelect==0 ||
8de0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
8df0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d  eturn 1;.  if( m
8e00: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
8e10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
8e20: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8e30: 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61  ++){ pOrderBy->a
8e40: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a  [i].done = 0; }.
8e50: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e    }.  if( fillIn
8e60: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
8e70: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
8e80: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
8e90: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
8ea0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
8eb0: 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  ( matchOrderbyTo
8ec0: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
8ed0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20  Select->pPrior, 
8ee0: 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
8ef0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
8f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
8f10: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
8f20: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
8f30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
8f40: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
8f50: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
8f60: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
8f70: 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69  pExpr;.    int i
8f80: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Col = -1;.    if
8f90: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
8fa0: 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  .done ) continue
8fb0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
8fc0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
8fd0: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
8fe0: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
8ff0: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
9000: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
9010: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
9020: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
9030: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
9040: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
9050: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
9060: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
9070: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
9080: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
9090: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
90a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
90b0: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
90c0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
90d0: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
90e0: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
90f0: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
9100: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
9110: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
9120: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
9130: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
9140: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
9150: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
9160: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
9170: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
9180: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
9190: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
91a0: 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74 6f    assert( pE->to
91b0: 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20  ken.z );.       
91c0: 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65   zLabel = sqlite
91d0: 53 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65  StrNDup(pE->toke
91e0: 6e 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pE->token.n
91f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9200: 65 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29  eDequote(zLabel)
9210: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
9220: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d  liteStrICmp(zNam
9230: 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b  e, zLabel)==0 ){
9240: 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c   .          iCol
9250: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
9260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
9270: 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ee(zLabel);.    
9280: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
9290: 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 45 78  ol<0 && sqliteEx
92a0: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45  prCompare(pE, pE
92b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
92c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
92d0: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  l = j;.      }. 
92e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
92f0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  l>=0 ){.      pE
9300: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
9310: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c  ;.      pE->iCol
9320: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
9330: 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pE->iTable = i
9340: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72  Table;.      pOr
9350: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
9360: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
9370: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75  if( iCol<0 && mu
9380: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
9390: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
93a0: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
93b0: 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72     "ORDER BY ter
93c0: 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73  m number %d does
93d0: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72   not match any r
93e0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69  esult column", i
93f0: 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  +1);.      nErr+
9400: 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
9410: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9420: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
9430: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
9440: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
9450: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
9460: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
9470: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
9480: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9490: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
94a0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
94b0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
94c0: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65  /.Vdbe *sqliteGe
94d0: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
94e0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
94f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9500: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
9510: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
9520: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62  Vdbe = sqliteVdb
9530: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
9540: 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  db);.  }.  retur
9550: 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n v;.}../*.** Th
9560: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
9570: 74 68 65 20 45 78 70 72 2e 64 61 74 61 54 79 70  the Expr.dataTyp
9580: 65 20 66 69 65 6c 64 20 6f 6e 20 61 6c 6c 20 65  e field on all e
9590: 6c 65 6d 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68  lements of.** th
95a0: 65 20 70 4f 72 64 65 72 42 79 20 65 78 70 72 65  e pOrderBy expre
95b0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
95c0: 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 77   pOrderBy list w
95d0: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ill have been.**
95e0: 20 73 65 74 20 75 70 20 62 79 20 6d 61 74 63 68   set up by match
95f0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
9600: 29 2e 20 20 48 65 6e 63 65 20 65 61 63 68 20 65  ).  Hence each e
9610: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 0a 2a 2a  xpression has.**
9620: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 73 20   a TK_COLUMN as 
9630: 69 74 73 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 20  its root node.  
9640: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
9650: 20 72 65 66 65 72 73 20 74 6f 20 61 20 0a 2a 2a   refers to a .**
9660: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
9670: 65 73 75 6c 74 20 73 65 74 2e 20 20 20 54 68 65  esult set.   The
9680: 20 64 61 74 61 74 79 70 65 20 69 73 20 73 65 74   datatype is set
9690: 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45   to SQLITE_SO_TE
96a0: 58 54 0a 2a 2a 20 69 66 20 74 68 65 20 63 6f 72  XT.** if the cor
96b0: 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
96c0: 6e 20 69 6e 20 70 20 61 6e 64 20 65 76 65 72 79  n in p and every
96d0: 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 6c   SELECT to the l
96e0: 65 66 74 20 6f 66 0a 2a 2a 20 70 20 68 61 73 20  eft of.** p has 
96f0: 61 20 64 61 74 61 74 79 70 65 20 6f 66 20 53 51  a datatype of SQ
9700: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 2e 20 20 49  LITE_SO_TEXT.  I
9710: 66 20 74 68 65 20 63 6f 6f 72 65 73 73 70 6f 6e  f the cooresspon
9720: 64 69 6e 67 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69  ding column.** i
9730: 6e 20 70 20 6f 72 20 61 6e 79 20 6f 66 20 74 68  n p or any of th
9740: 65 20 6c 65 66 74 20 53 45 4c 45 43 54 73 20 69  e left SELECTs i
9750: 73 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2c  s SQLITE_SO_NUM,
9760: 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 74 79   then the dataty
9770: 70 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 72 64  pe.** of the ord
9780: 65 72 2d 62 79 20 65 78 70 72 65 73 73 69 6f 6e  er-by expression
9790: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
97a0: 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20  E_SO_NUM..**.** 
97b0: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
97c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
97d0: 20 6f 6e 65 28 61 20 49 4e 54 45 47 45 52 2c 20   one(a INTEGER, 
97e0: 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20 20  b TEXT);.**     
97f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f  CREATE TABLE two
9800: 28 63 20 56 41 52 43 48 41 52 28 35 29 2c 20 64  (c VARCHAR(5), d
9810: 20 46 4c 4f 41 54 29 3b 0a 2a 2a 0a 2a 2a 20 20   FLOAT);.**.**  
9820: 20 20 20 53 45 4c 45 43 54 20 62 2c 20 62 20 46     SELECT b, b F
9830: 52 4f 4d 20 6f 6e 65 20 55 4e 49 4f 4e 20 53 45  ROM one UNION SE
9840: 4c 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 74  LECT d, c FROM t
9850: 77 6f 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32  wo ORDER BY 1, 2
9860: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 69 6d  ;.**.** The prim
9870: 61 72 79 20 73 6f 72 74 20 6b 65 79 20 77 69 6c  ary sort key wil
9880: 6c 20 75 73 65 20 53 51 4c 49 54 45 5f 53 4f 5f  l use SQLITE_SO_
9890: 4e 55 4d 20 62 65 63 61 75 73 65 20 74 68 65 20  NUM because the 
98a0: 22 64 22 20 69 6e 0a 2a 2a 20 74 68 65 20 73 65  "d" in.** the se
98b0: 63 6f 6e 64 20 53 45 4c 45 43 54 20 69 73 20 6e  cond SELECT is n
98c0: 75 6d 65 72 69 63 2e 20 20 54 68 65 20 31 73 74  umeric.  The 1st
98d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
98e0: 69 72 73 74 20 53 45 4c 45 43 54 0a 2a 2a 20 69  irst SELECT.** i
98f0: 73 20 74 65 78 74 20 62 75 74 20 74 68 61 74 20  s text but that 
9900: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20  does not matter 
9910: 62 65 63 61 75 73 65 20 61 20 6e 75 6d 65 72 69  because a numeri
9920: 63 20 61 6c 77 61 79 73 20 6f 76 65 72 72 69 64  c always overrid
9930: 65 73 0a 2a 2a 20 61 20 74 65 78 74 2e 0a 2a 2a  es.** a text..**
9940: 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 61 72  .** The secondar
9950: 79 20 6b 65 79 20 77 69 6c 6c 20 75 73 65 20 74  y key will use t
9960: 68 65 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  he SQLITE_SO_TEX
9970: 54 20 73 6f 72 74 20 6f 72 64 65 72 20 62 65 63  T sort order bec
9980: 61 75 73 65 0a 2a 2a 20 62 6f 74 68 20 74 68 65  ause.** both the
9990: 20 28 73 65 63 6f 6e 64 29 20 22 62 22 20 69 6e   (second) "b" in
99a0: 20 74 68 65 20 66 69 72 73 74 20 53 45 4c 45 43   the first SELEC
99b0: 54 20 61 6e 64 20 74 68 65 20 22 63 22 20 69 6e  T and the "c" in
99c0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 53   the second.** S
99d0: 45 4c 45 43 54 20 68 61 76 65 20 61 20 64 61 74  ELECT have a dat
99e0: 61 74 79 70 65 20 6f 66 20 74 65 78 74 2e 0a 2a  atype of text..*
99f0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  / .static void m
9a00: 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72  ultiSelectSortOr
9a10: 64 65 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 45  der(Select *p, E
9a20: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
9a30: 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  y){.  int i;.  E
9a40: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
9a50: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
9a60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
9a70: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( p==0 ){.    f
9a80: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
9a90: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
9aa0: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d  .      pOrderBy-
9ab0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 64 61 74  >a[i].pExpr->dat
9ac0: 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53  aType = SQLITE_S
9ad0: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  O_TEXT;.    }.  
9ae0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9af0: 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f  multiSelectSortO
9b00: 72 64 65 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20  rder(p->pPrior, 
9b10: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 45 4c  pOrderBy);.  pEL
9b20: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
9b30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
9b40: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9b50: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
9b60: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
9b70: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
9b80: 28 20 70 45 2d 3e 64 61 74 61 54 79 70 65 3d 3d  ( pE->dataType==
9b90: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 20  SQLITE_SO_NUM ) 
9ba0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
9bb0: 73 65 72 74 28 20 70 45 2d 3e 69 43 6f 6c 75 6d  sert( pE->iColum
9bc0: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  n>=0 );.    if( 
9bd0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 70 45  pEList->nExpr>pE
9be0: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
9bf0: 20 20 20 70 45 2d 3e 64 61 74 61 54 79 70 65 20     pE->dataType 
9c00: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
9c10: 28 70 45 4c 69 73 74 2d 3e 61 5b 70 45 2d 3e 69  (pEList->a[pE->i
9c20: 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 29 3b 0a  Column].pExpr);.
9c30: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9c40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9c50: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
9c60: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
9c70: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
9c80: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
9c90: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
9ca0: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
9cb0: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
9cc0: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
9cd0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
9ce0: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
9cf0: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
9d00: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
9d10: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
9d20: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
9d30: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
9d40: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
9d50: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
9d60: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
9d70: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
9d80: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
9d90: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
9da0: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
9db0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
9dc0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
9dd0: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
9de0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
9df0: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
9e00: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
9e10: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
9e20: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
9e30: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
9e40: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
9e50: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
9e60: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
9e70: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
9e80: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
9e90: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
9ea0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
9eb0: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
9ec0: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
9ed0: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
9ee0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
9ef0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
9f00: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
9f10: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
9f20: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
9f30: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
9f40: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
9f50: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
9f60: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
9f70: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
9f80: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
9f90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
9fa0: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
9fb0: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
9fc0: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
9fd0: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
9fe0: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
9ff0: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
a000: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
a010: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
a020: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
a030: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
a040: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
a050: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
a060: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
a070: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
a080: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
a090: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
a0a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a0b0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44  elect *p, int eD
a0c0: 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b  est, int iParm){
a0d0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a0e0: 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73         /* Succes
a0f0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
a100: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
a110: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
a120: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
a130: 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
a140: 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
a150: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
a160: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
a170: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
a180: 42 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65  BE */..  /* Make
a190: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
a1a0: 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
a1b0: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
a1c0: 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20  Ts.  Only the . 
a1d0: 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20   ** last SELECT 
a1e0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
a1f0: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
a200: 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  BY..  */.  if( p
a210: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
a220: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
a230: 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
a240: 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69  rior;.  if( pPri
a250: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
a260: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
a270: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
a280: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
a290: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
a2a0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
a2b0: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
a2c0: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74  p->op));.    ret
a2d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
a2e0: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
a2f0: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
a300: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
a310: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
a320: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
a330: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
a340: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
a350: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
a360: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
a370: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
a380: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
a390: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
a3a0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
a3b0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
a3c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a3d0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
a3e0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65  arm, 0);.    eDe
a3f0: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
a400: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
a410: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
a420: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
a430: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
a440: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
a450: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
a460: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
a470: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
a480: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
a490: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
a4a0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
a4b0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  r, eDest, iParm,
a4c0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
a4d0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a4e0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70  rn rc;.        p
a4f0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
a500: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a510: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
a520: 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
a530: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
a540: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
a550: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
a560: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a570: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
a580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a590: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
a5a0: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
a5b0: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
a5c0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
a5d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a5e0: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
a5f0: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
a600: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
a610: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
a620: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
a630: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
a640: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
a650: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
a660: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a670: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
a680: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
a690: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
a6a0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
a6b0: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
a6c0: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
a6d0: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
a6e0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
a6f0: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20   *pOrderBy;  /* 
a700: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
a710: 75 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  use for the righ
a720: 74 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20  t SELECT */..   
a730: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e     priorOp = p->
a740: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54  op==TK_ALL ? SRT
a750: 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69  _Table : SRT_Uni
a760: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  on;.      if( eD
a770: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
a780: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
a790: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
a7a0: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
a7b0: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
a7c0: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
a7d0: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
a7e0: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
a7f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
a800: 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a  ionTab = iParm;.
a810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a820: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
a830: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
a840: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
a850: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
a860: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
a870: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
a880: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
a890: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
a8a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a8b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
a8c0: 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20  >pOrderBy .     
a8d0: 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72     && matchOrder
a8e0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
a8f0: 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
a900: 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20  y, unionTab, 1) 
a910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a920: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
a930: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
a940: 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
a950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
a960: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a970: 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62  enTemp, unionTab
a980: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
a990: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a9a0: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
a9b0: 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20   unionTab, 1);. 
a9c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a9d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
a9e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a9f0: 65 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62  enTemp, unionTab
aa00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
aa10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
aa20: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
aa30: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
aa40: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
aa50: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
aa60: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
aa70: 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f  , pPrior, priorO
aa80: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
aa90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
aaa0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
aab0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
aac0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
aad0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
aae0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
aaf0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
ab00: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
ab10: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
ab20: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
ab30: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
ab40: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
ab50: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
ab60: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
ab70: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
ab80: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
ab90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
aba0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
abb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64   = 0;.      pOrd
abc0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
abd0: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  By;.      p->pOr
abe0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
abf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
ac00: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
ac10: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
ac20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
ac30: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
ac40: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
ac50: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
ac60: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ac70: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
ac80: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
ac90: 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
aca0: 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
acb0: 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
acc0: 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
acd0: 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
ace0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20  ed..      */    
acf0: 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65    .      if( eDe
ad00: 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75  st!=priorOp || u
ad10: 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29  nionTab!=iParm )
ad20: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
ad30: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
ad40: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
ad50: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
ad60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44  ;.        if( eD
ad70: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
ad80: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  k ){.          g
ad90: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ada0: 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61  es(pParse, p->ba
adb0: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
adc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  );.          gen
add0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
ade0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
adf0: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
ae00: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
ae10: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
ae20: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
ae30: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ae40: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
ae50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ae60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ae70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ae80: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
ae90: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
aea0: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
aeb0: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
aec0: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 6d 75  r(v);.        mu
aed0: 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64  ltiSelectSortOrd
aee0: 65 72 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  er(p, p->pOrderB
aef0: 79 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  y);.        rc =
af00: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
af10: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
af20: 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
af30: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
af40: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af60: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  p->pOrderBy, -1,
af70: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
afa0: 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
afb0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
afc0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
afd0: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
afe0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
aff0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b000: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b010: 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
b020: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
b030: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
b040: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
b050: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
b060: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b070: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
b080: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
b090: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
b0a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
b0b0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20  rateSortTail(p, 
b0c0: 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  v, p->pEList->nE
b0d0: 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
b0e0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  m);.        }.  
b0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
b100: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b110: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
b120: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
b130: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
b140: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
b150: 20 69 53 74 61 72 74 3b 0a 0a 20 20 20 20 20 20   iStart;..      
b160: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
b170: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
b180: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
b190: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
b1a0: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
b1b0: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
b1c0: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
b1d0: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
b1e0: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
b1f0: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
b200: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
b210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
b220: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
b230: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
b240: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b250: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  .      if( p->pO
b260: 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f  rderBy && matchO
b270: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
b280: 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65  Parse,p,p->pOrde
b290: 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20  rBy,tab1,1) ){. 
b2a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
b2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b2c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b2d0: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74  , OP_OpenTemp, t
b2e0: 61 62 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ab1, 1);.      s
b2f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b300: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
b310: 74 61 62 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20  tab1, 1);..     
b320: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
b330: 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
b340: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
b350: 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
b360: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
b370: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
b380: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53  Parse, pPrior, S
b390: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20  RT_Union, tab1, 
b3a0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b3b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
b3c0: 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  rc;..      /* Co
b3d0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
b3e0: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
b3f0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
b400: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
b410: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b420: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
b430: 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20   tab2, 1);.     
b440: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b450: 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61  (v, OP_KeyAsData
b460: 2c 20 74 61 62 32 2c 20 31 29 3b 0a 20 20 20 20  , tab2, 1);.    
b470: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
b480: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b490: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
b4a0: 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   p, SRT_Union, t
b4b0: 61 62 32 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ab2, 0, 0, 0);. 
b4c0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
b4d0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
b4e0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
b4f0: 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  c;..      /* Gen
b500: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
b510: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
b520: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
b530: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
b540: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
b550: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
b560: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
b570: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
b580: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
b590: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
b5a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
b5b0: 65 2c 20 70 2d 3e 62 61 73 65 2c 20 30 2c 20 70  e, p->base, 0, p
b5c0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
b5d0: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
b5e0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
b5f0: 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c  ->base, p->pSrc,
b600: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
b610: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
b620: 6b 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  k = sqliteVdbeMa
b630: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
b640: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
b650: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
b660: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
b680: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
b690: 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  ak);.      iStar
b6a0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  t = sqliteVdbeAd
b6b0: 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c 4b 65  dOp(v, OP_FullKe
b6c0: 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  y, tab1, 0);.   
b6d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b6e0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
b6f0: 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b  d, tab2, iCont);
b700: 0a 20 20 20 20 20 20 6d 75 6c 74 69 53 65 6c 65  .      multiSele
b710: 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c 20 70  ctSortOrder(p, p
b720: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
b730: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
b740: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
b750: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
b760: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
b770: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
b7a0: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
b7b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
b7e0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
b7f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 73  eturn 1;.      s
b800: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
b810: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
b820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b830: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
b840: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
b850: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b860: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b870: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
b880: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b890: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
b8a0: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
b8b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b8c0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
b8d0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
b8e0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
b8f0: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f        generateSo
b900: 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d 3e  rtTail(p, v, p->
b910: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
b920: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
b930: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
b940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  k;.    }.  }.  a
b950: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
b960: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
b970: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
b980: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
b990: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
b9a0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
b9b0: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
b9c0: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
b9d0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
b9e0: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
b9f0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
ba00: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
ba10: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
ba20: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
ba30: 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  op));.    return
ba40: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 73   1;.  }..  /* Is
ba50: 73 75 65 20 61 20 6e 75 6c 6c 20 63 61 6c 6c 62  sue a null callb
ba60: 61 63 6b 20 69 66 20 74 68 61 74 20 69 73 20 77  ack if that is w
ba70: 68 61 74 20 74 68 65 20 75 73 65 72 20 77 61 6e  hat the user wan
ba80: 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ts..  */.  if( e
ba90: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
baa0: 63 6b 20 26 26 0a 20 20 20 20 28 70 50 61 72 73  ck &&.    (pPars
bab0: 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 3d 3d  e->useCallback==
bac0: 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 64 62  0 || (pParse->db
bad0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
bae0: 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d  _NullCallback)!=
baf0: 30 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  0).  ){.    sqli
bb00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bb10: 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20  P_NullCallback, 
bb20: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
bb30: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
bb40: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
bb50: 65 63 75 72 73 69 76 65 6c 79 20 73 63 61 6e 20  ecursively scan 
bb60: 74 68 72 6f 75 67 68 20 61 6e 20 65 78 70 72 65  through an expre
bb70: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 46 6f 72  ssion tree.  For
bb80: 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
bb90: 0a 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  .** to a column 
bba0: 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
bbb0: 69 46 72 6f 6d 2c 20 63 68 61 6e 67 65 20 74 68  iFrom, change th
bbc0: 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  at reference to 
bbd0: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 63 6f 6c 75  the.** same colu
bbe0: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
bbf0: 65 72 20 69 54 6f 2e 0a 2a 2f 0a 73 74 61 74 69  er iTo..*/.stati
bc00: 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62  c void changeTab
bc10: 6c 65 73 49 6e 4c 69 73 74 28 45 78 70 72 4c 69  lesInList(ExprLi
bc20: 73 74 2a 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 20  st*, int, int); 
bc30: 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c   /* Forward Decl
bc40: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
bc50: 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54 61 62  c void changeTab
bc60: 6c 65 73 28 45 78 70 72 20 2a 70 45 78 70 72 2c  les(Expr *pExpr,
bc70: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
bc80: 69 54 6f 29 7b 0a 20 20 69 66 28 20 70 45 78 70  iTo){.  if( pExp
bc90: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
bca0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
bcb0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
bcc0: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 46 72 6f  pr->iTable==iFro
bcd0: 6d 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  m ){.    pExpr->
bce0: 69 54 61 62 6c 65 20 3d 20 69 54 6f 3b 0a 20 20  iTable = iTo;.  
bcf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 6e 67  }else{.    chang
bd00: 65 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e 70  eTables(pExpr->p
bd10: 4c 65 66 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Left, iFrom, iTo
bd20: 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62  );.    changeTab
bd30: 6c 65 73 28 70 45 78 70 72 2d 3e 70 52 69 67 68  les(pExpr->pRigh
bd40: 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a  t, iFrom, iTo);.
bd50: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
bd60: 49 6e 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  InList(pExpr->pL
bd70: 69 73 74 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29  ist, iFrom, iTo)
bd80: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
bd90: 6f 69 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73  oid changeTables
bda0: 49 6e 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  InList(ExprList 
bdb0: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 46 72 6f  *pList, int iFro
bdc0: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
bdd0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
bde0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
bdf0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
be00: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
be10: 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 4c 69  changeTables(pLi
be20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
be30: 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20  iFrom, iTo);.   
be40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
be50: 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
be60: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
be70: 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
be80: 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
be90: 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
bea0: 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
beb0: 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
bec0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
bed0: 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  ng.** entry in p
bee0: 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
bef0: 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
bf00: 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
bf10: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
bf20: 29 20 20 57 68 65 6e 20 6d 61 6b 69 6e 67 20 61  )  When making a
bf30: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72   copy of an expr
bf40: 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74  ession in pEList
bf50: 2c 20 63 68 61 6e 67 65 0a 2a 2a 20 72 65 66 65  , change.** refe
bf60: 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
bf70: 73 20 69 6e 20 74 61 62 6c 65 20 69 53 75 62 20  s in table iSub 
bf80: 69 6e 74 6f 20 72 65 66 65 72 65 6e 63 65 73 20  into references 
bf90: 74 6f 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2e  to table iTable.
bfa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bfb0: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
bfc0: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
bfd0: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
bfe0: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
bff0: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
c000: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
c010: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
c020: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
c030: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
c040: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
c050: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
c060: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
c070: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
c080: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
c090: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
c0a0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
c0b0: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
c0c0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
c0d0: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
c0e0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
c0f0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
c100: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
c110: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
c120: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
c130: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
c140: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
c150: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 2c  *,int,ExprList*,
c160: 69 6e 74 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  int);  /* Forwar
c170: 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
c180: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
c190: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
c1a0: 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
c1b0: 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74 20 69  t *pEList, int i
c1c0: 53 75 62 29 7b 0a 20 20 69 66 28 20 70 45 78 70  Sub){.  if( pExp
c1d0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
c1e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
c1f0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
c200: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
c210: 6c 65 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  le && pExpr->iCo
c220: 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 45  lumn>=0 ){.    E
c230: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 61  xpr *pNew;.    a
c240: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
c250: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
c260: 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
c270: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c280: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
c290: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
c2a0: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
c2b0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e  ist==0 );.    pN
c2c0: 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
c2d0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
c2e0: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
c2f0: 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20  ( pNew!=0 );.   
c300: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
c310: 77 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72  w->op;.    pExpr
c320: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 4e 65  ->dataType = pNe
c330: 77 2d 3e 64 61 74 61 54 79 70 65 3b 0a 20 20 20  w->dataType;.   
c340: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
c350: 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
c360: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
c370: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 4e 65  qliteExprDup(pNe
c380: 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 61  w->pLeft);.    a
c390: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
c3a0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ight==0 );.    p
c3b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
c3c0: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 4e 65  qliteExprDup(pNe
c3d0: 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  w->pRight);.    
c3e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
c3f0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  List==0 );.    p
c400: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
c410: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
c420: 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pNew->pList);.  
c430: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
c440: 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a  = pNew->iTable;.
c450: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
c460: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
c470: 6d 6e 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69  mn;.    pExpr->i
c480: 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
c490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 54 6f 6b 65  ;.    sqliteToke
c4a0: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f  nCopy(&pExpr->to
c4b0: 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
c4c0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 54 6f  n);.    sqliteTo
c4d0: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
c4e0: 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61  span, &pNew->spa
c4f0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 53 75 62  n);.    if( iSub
c500: 21 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  !=iTable ){.    
c510: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
c520: 45 78 70 72 2c 20 69 53 75 62 2c 20 69 54 61 62  Expr, iSub, iTab
c530: 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  le);.    }.  }el
c540: 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
c550: 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  r(pExpr->pLeft, 
c560: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20  iTable, pEList, 
c570: 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74  iSub);.    subst
c580: 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67  Expr(pExpr->pRig
c590: 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
c5a0: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73  st, iSub);.    s
c5b0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45 78  ubstExprList(pEx
c5c0: 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c  pr->pList, iTabl
c5d0: 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29  e, pEList, iSub)
c5e0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
c5f0: 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c 69  oid .substExprLi
c600: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
c610: 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  st, int iTable, 
c620: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c630: 2c 20 69 6e 74 20 69 53 75 62 29 7b 0a 20 20 69  , int iSub){.  i
c640: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
c650: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
c660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
c670: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
c680: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
c690: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
c6a0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c   iTable, pEList,
c6b0: 20 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   iSub);.  }.}../
c6c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c6d0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
c6e0: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
c6f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
c700: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
c710: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
c720: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
c730: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
c740: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
c750: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
c760: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
c770: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
c780: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
c790: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
c7a0: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
c7b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
c7c0: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
c7d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
c7e0: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
c7f0: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
c800: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
c810: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
c820: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
c830: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
c840: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
c850: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
c860: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
c870: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
c880: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
c890: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
c8a0: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
c8b0: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
c8c0: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
c8d0: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
c8e0: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
c8f0: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
c900: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
c910: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
c920: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
c930: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
c940: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
c950: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
c960: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
c970: 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
c980: 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
c990: 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
c9a0: 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
c9b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
c9c0: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
c9d0: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
c9e0: 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
c9f0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
ca00: 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
ca10: 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
ca20: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
ca30: 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
ca40: 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
ca50: 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
ca60: 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
ca70: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
ca80: 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
ca90: 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
caa0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
cab0: 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
cac0: 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
cad0: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
cae0: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
caf0: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
cb00: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
cb10: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
cb20: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
cb30: 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
cb40: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
cb50: 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
cb60: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
cb70: 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
cb80: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
cb90: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
cba0: 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
cbb0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
cbc0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  in..**.**   (4) 
cbd0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
cbe0: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
cbf0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
cc00: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
cc10: 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
cc20: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
cc30: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
cc40: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
cc50: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
cc60: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
cc70: 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
cc80: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
cc90: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
cca0: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
ccb0: 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
ccc0: 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
ccd0: 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
cce0: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
ccf0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
cd00: 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
cd10: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
cd20: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
cd30: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
cd40: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
cd50: 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
cd60: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
cd70: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
cd80: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
cd90: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
cda0: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
cdb0: 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
cdc0: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
cdd0: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
cde0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
cdf0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
ce00: 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
ce10: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
ce20: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
ce30: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ce40: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
ce50: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ce60: 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
ce70: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
ce80: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
ce90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cea0: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
ceb0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
cec0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
ced0: 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
cee0: 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
cef0: 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
cf00: 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
cf10: 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
cf20: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
cf30: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
cf40: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
cf50: 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
cf60: 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
cf70: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
cf80: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
cf90: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
cfa0: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
cfb0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
cfc0: 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
cfd0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
cfe0: 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
cff0: 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
d000: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
d010: 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
d020: 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
d030: 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
d040: 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
d050: 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
d060: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d070: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
d080: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
d090: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
d0a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
d0b0: 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
d0c0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
d0d0: 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
d0e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
d0f0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
d100: 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
d110: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
d120: 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
d130: 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
d140: 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
d150: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
d160: 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
d170: 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
d180: 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
d190: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
d1a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
d1b0: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
d1c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
d1d0: 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
d1e0: 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c  query" */.  SrcL
d1f0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
d200: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
d210: 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
d220: 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
d230: 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
d240: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
d250: 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
d260: 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
d270: 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
d280: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d290: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d2a0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  */.  int i;.  in
d2b0: 74 20 69 50 61 72 65 6e 74 2c 20 69 53 75 62 3b  t iParent, iSub;
d2c0: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
d2d0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
d2e0: 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
d2f0: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
d300: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
d310: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
d320: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d330: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
d340: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
d350: 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
d360: 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
d370: 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 72 63 2d  ;.  pSub = pSrc-
d380: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63  >a[iFrom].pSelec
d390: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
d3a0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
d3b0: 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
d3c0: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
d3d0: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
d3e0: 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
d3f0: 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
d400: 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
d410: 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
d420: 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
d430: 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
d440: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
d450: 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69 73  .  if( (pSub->is
d460: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
d470: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20  ->nLimit>=0) && 
d480: 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
d490: 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
d4a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d4b0: 20 69 66 28 20 28 70 2d 3e 69 73 44 69 73 74 69   if( (p->isDisti
d4c0: 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74  nct || p->nLimit
d4d0: 3e 3d 30 29 20 26 26 20 73 75 62 71 75 65 72 79  >=0) && subquery
d4e0: 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
d4f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
d500: 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
d510: 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
d520: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
d530: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
d540: 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
d550: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
d560: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 2d   for the.  ** i-
d570: 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
d580: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
d590: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
d5a0: 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d    */.  iParent =
d5b0: 20 70 2d 3e 62 61 73 65 20 2b 20 69 46 72 6f 6d   p->base + iFrom
d5c0: 3b 0a 20 20 69 53 75 62 20 3d 20 70 53 75 62 2d  ;.  iSub = pSub-
d5d0: 3e 62 61 73 65 3b 0a 20 20 73 75 62 73 74 45 78  >base;.  substEx
d5e0: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
d5f0: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
d600: 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a  >pEList, iSub);.
d610: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
d620: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
d630: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
d640: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
d650: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
d660: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d670: 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
d680: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
d690: 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
d6a0: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
d6b0: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
d6c0: 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e  eStrNDup(pExpr->
d6d0: 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
d6e0: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pan.n);.    }.  
d6f0: 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
d700: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
d710: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
d720: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
d730: 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20  EList, iSub);.  
d740: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
d750: 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
d760: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
d770: 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sub);.  }.  if( 
d780: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
d790: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
d7a0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
d7b0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
d7c0: 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
d7d0: 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
d7e0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 63 68  erBy = 0;.    ch
d7f0: 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74  angeTablesInList
d800: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 53  (p->pOrderBy, iS
d810: 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20  ub, iParent);.  
d820: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
d830: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
d840: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
d850: 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
d860: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
d870: 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sub);.  }.  if( 
d880: 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
d890: 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
d8a0: 69 74 65 45 78 70 72 44 75 70 28 70 53 75 62 2d  iteExprDup(pSub-
d8b0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66  >pWhere);.    if
d8c0: 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20  ( iParent!=iSub 
d8d0: 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54  ){.      changeT
d8e0: 61 62 6c 65 73 28 70 57 68 65 72 65 2c 20 69 53  ables(pWhere, iS
d8f0: 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20  ub, iParent);.  
d900: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
d910: 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
d920: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
d930: 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65  sAgg ){.    asse
d940: 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  rt( p->pHaving==
d950: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  0 );.    p->pHav
d960: 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ing = p->pWhere;
d970: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
d980: 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62   pWhere;.    sub
d990: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
d9a0: 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
d9b0: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
d9c0: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
d9d0: 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
d9e0: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20  Expr *pHaving = 
d9f0: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 53  sqliteExprDup(pS
da00: 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  ub->pHaving);.  
da10: 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21      if( iParent!
da20: 3d 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  =iSub ){.       
da30: 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 48   changeTables(pH
da40: 61 76 69 6e 67 2c 20 69 53 75 62 2c 20 69 50 61  aving, iSub, iPa
da50: 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rent);.      }. 
da60: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
da70: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ing ){.        p
da80: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
da90: 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  teExpr(TK_AND, p
daa0: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76 69  ->pHaving, pHavi
dab0: 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  ng, 0);.      }e
dac0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
dad0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
dae0: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
daf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
db00: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
db10: 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
db20: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
db30: 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  up(pSub->pGroupB
db40: 79 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72  y);.    if( iPar
db50: 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20  ent!=iSub ){.   
db60: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49     changeTablesI
db70: 6e 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  nList(p->pGroupB
db80: 79 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74  y, iSub, iParent
db90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
dba0: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d   if( p->pWhere==
dbb0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 68 65  0 ){.    p->pWhe
dbc0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 7d  re = pWhere;.  }
dbd0: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
dbe0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
dbf0: 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
dc00: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20  List, iSub);.   
dc10: 20 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20   if( pWhere ){. 
dc20: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
dc30: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
dc40: 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  ND, p->pWhere, p
dc50: 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  Where, 0);.    }
dc60: 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 44 69 73 74  .  }.  p->isDist
dc70: 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
dc80: 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73  inct || pSub->is
dc90: 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 69 66 28  Distinct;..  if(
dca0: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   pSub->nLimit>=0
dcb0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
dcc0: 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
dcd0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75   p->nLimit = pSu
dce0: 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  b->nLimit;.    }
dcf0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d  else if( p->nLim
dd00: 69 74 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20  it+p->nOffset > 
dd10: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75  pSub->nLimit+pSu
dd20: 62 2d 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20  b->nOffset ){.  
dd30: 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20      p->nLimit = 
dd40: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70  pSub->nLimit + p
dd50: 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70  Sub->nOffset - p
dd60: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d  ->nOffset;.    }
dd70: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65  .  }.  p->nOffse
dd80: 74 20 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73  t += pSub->nOffs
dd90: 65 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  et;..  /* If the
dda0: 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69   subquery contai
ddb0: 6e 73 20 73 75 62 71 75 65 72 69 65 73 20 6f 66  ns subqueries of
ddc0: 20 69 74 73 20 6f 77 6e 2c 20 74 68 61 74 20 77   its own, that w
ddd0: 65 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 66 6c 61  ere not.  ** fla
dde0: 74 74 65 6e 65 64 2c 20 74 68 65 6e 20 63 6f 64  ttened, then cod
ddf0: 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
de00: 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
de10: 65 64 20 74 6f 20 70 75 74 0a 20 20 2a 2a 20 74  ed to put.  ** t
de20: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
de30: 6f 73 65 20 73 75 62 2d 73 75 62 71 75 65 72 69  ose sub-subqueri
de40: 65 73 20 69 6e 74 6f 20 56 44 42 45 20 63 75 72  es into VDBE cur
de50: 73 6f 72 73 20 72 65 6c 61 74 69 76 65 0a 20 20  sors relative.  
de60: 2a 2a 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ** to the subque
de70: 72 79 2e 20 20 57 65 20 6d 75 73 74 20 74 72 61  ry.  We must tra
de80: 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f  nslate the curso
de90: 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 76 61  r number into va
dea0: 6c 75 65 73 0a 20 20 2a 2a 20 73 75 69 74 61 62  lues.  ** suitab
deb0: 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  le for use by th
dec0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
ded0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
dee0: 3c 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20  <pSubSrc->nSrc; 
def0: 69 2b 2b 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  i++){.    Vdbe *
df00: 76 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 53  v;.    if( pSubS
df10: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
df20: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
df30: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
df40: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
df50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
df60: 4f 70 28 76 2c 20 4f 50 5f 52 65 6e 61 6d 65 43  Op(v, OP_RenameC
df70: 75 72 73 6f 72 2c 20 70 53 75 62 2d 3e 62 61 73  ursor, pSub->bas
df80: 65 2b 69 2c 20 70 2d 3e 62 61 73 65 2b 69 29 3b  e+i, p->base+i);
df90: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72 63  .  }..  if( pSrc
dfa0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20  ->a[iFrom].pTab 
dfb0: 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  && pSrc->a[iFrom
dfc0: 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69  ].pTab->isTransi
dfd0: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
dfe0: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  eDeleteTable(0, 
dff0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
e000: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 53 72 63  Tab);.  }.  pSrc
e010: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 20  ->a[iFrom].pTab 
e020: 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e  = pSubSrc->a[0].
e030: 70 54 61 62 3b 0a 20 20 70 53 75 62 53 72 63 2d  pTab;.  pSubSrc-
e040: 3e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 30 3b 0a  >a[0].pTab = 0;.
e050: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
e060: 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74  a[iFrom].pSelect
e070: 3d 3d 70 53 75 62 20 29 3b 0a 20 20 70 53 72 63  ==pSub );.  pSrc
e080: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65 6c 65  ->a[iFrom].pSele
e090: 63 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  ct = pSubSrc->a[
e0a0: 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 53  0].pSelect;.  pS
e0b0: 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  ubSrc->a[0].pSel
e0c0: 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ect = 0;.  sqlit
e0d0: 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  eSelectDelete(pS
e0e0: 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
e0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
e100: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
e110: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
e120: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
e130: 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
e140: 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
e150: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
e160: 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
e170: 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
e180: 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
e190: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
e1a0: 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
e1b0: 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
e1c0: 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
e1d0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
e1e0: 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
e1f0: 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
e200: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
e210: 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
e220: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
e230: 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
e240: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
e250: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
e260: 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
e270: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
e280: 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
e290: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
e2a0: 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
e2b0: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
e2c0: 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
e2d0: 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
e2e0: 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
e2f0: 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
e300: 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
e310: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
e320: 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
e330: 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
e340: 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
e350: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
e360: 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
e370: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
e380: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
e390: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
e3a0: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
e3b0: 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
e3c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
e3d0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
e3e0: 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
e3f0: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
e400: 69 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  iteSelect()..** 
e410: 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
e420: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
e430: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
e440: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
e450: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
e460: 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
e470: 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
e480: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
e490: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
e4a0: 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
e4b0: 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
e4c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
e4d0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
e4e0: 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
e4f0: 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70  *v;.  int seekOp
e500: 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20  ;.  int cont;.  
e510: 45 78 70 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a  ExprList eList;.
e520: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e530: 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d  t_item eListItem
e540: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
e550: 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
e560: 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
e570: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
e580: 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
e590: 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
e5a0: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
e5b0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
e5c0: 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
e5d0: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
e5e0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72   0;.  if( p->pSr
e5f0: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
e600: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
e610: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
e620: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
e630: 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
e640: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
e650: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
e660: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
e670: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e680: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
e690: 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   || pExpr->pList
e6a0: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
e6b0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
e6c0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29  pr->token.n!=3 )
e6d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e6e0: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
e6f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
e700: 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
e710: 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65    seekOp = OP_Re
e720: 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wind;.  }else if
e730: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
e740: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
e750: 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
e760: 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
e770: 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
e780: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e790: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
e7a0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
e7b0: 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
e7c0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
e7d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f   return 0;.  iCo
e7e0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
e7f0: 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e  mn;.  pTab = p->
e800: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
e810: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
e820: 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61   to here, it mea
e830: 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73 20  ns the query is 
e840: 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  of the correct f
e850: 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20  orm..  ** Check 
e860: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  to make sure we 
e870: 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e  have an index an
e880: 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e  d make pIdx poin
e890: 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70  t to the.  ** ap
e8a0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e  propriate index.
e8b0: 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f    If the min() o
e8c0: 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e  r max() is on an
e8d0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
e8e0: 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e  .  ** key column
e8f0: 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65  , no index is ne
e900: 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20 70  cessary so set p
e910: 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  Idx to NULL.  If
e920: 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20   no.  ** usable 
e930: 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20  index is found, 
e940: 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
e950: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e960: 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d     pIdx = 0;.  }
e970: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
e980: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
e990: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
e9a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
e9b0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
e9c0: 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
e9d0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
e9e0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20  lumn[0]==iCol ) 
e9f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ea00: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72   if( pIdx==0 ) r
ea10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
ea20: 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
ea30: 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77  mn names if we w
ea40: 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65  ill be using the
ea50: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
ea60: 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
ea70: 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
ea80: 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
ea90: 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d  a table or a mem
eaa0: 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20  ory cell..  */. 
eab0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
eac0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
ead0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
eae0: 30 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  0;.  if( eDest==
eaf0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
eb00: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
eb10: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
eb20: 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72 63  p->base, p->pSrc
eb30: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
eb40: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
eb50: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Types(pParse, p-
eb60: 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20  >base, p->pSrc, 
eb70: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  p->pEList);.  }.
eb80: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67  .  /* Generating
eb90: 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68   code to find th
eba0: 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78  e min or the max
ebb0: 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c  .  Basically all
ebc0: 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
ebd0: 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20   do is find the 
ebe0: 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73  first or the las
ebf0: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
ec00: 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66  hosen index.  If
ec10: 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20  .  ** the min() 
ec20: 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74  or max() is on t
ec30: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
ec40: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e  RY KEY, then fin
ec50: 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  d the first.  **
ec60: 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69   or last entry i
ec70: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
ec80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
ec90: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
eca0: 66 69 65 64 20 26 26 20 28 70 50 61 72 73 65 2d  fied && (pParse-
ecb0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
ecc0: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
ecd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 64  ){.    sqliteCod
ece0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
ecf0: 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 62 61 73  arse);.  }.  bas
ed00: 65 20 3d 20 70 2d 3e 62 61 73 65 3b 0a 20 20 73  e = p->base;.  s
ed10: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ed20: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
ed30: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73  ab->iDb, 0);.  s
ed40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ed50: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62  , OP_OpenRead, b
ed60: 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  ase, pTab->tnum)
ed70: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
ed80: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
ed90: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
eda0: 41 54 49 43 29 3b 0a 20 20 63 6f 6e 74 20 3d 20  ATIC);.  cont = 
edb0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
edc0: 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49  bel(v);.  if( pI
edd0: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
ede0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
edf0: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
ee00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ee10: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ee20: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
ee30: 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  dx->iDb, 0);.   
ee40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ee50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
ee60: 20 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74   base+1, pIdx->t
ee70: 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  num);.    sqlite
ee80: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
ee90: 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  -1, pIdx->zName,
eea0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
eeb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
eec0: 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
eed0: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
eee0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
eef0: 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65  P_IdxRecno, base
ef00: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
ef10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ef20: 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c  P_Close, base+1,
ef30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
ef40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
ef50: 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b  oveTo, base, 0);
ef60: 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78  .  }.  eList.nEx
ef70: 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74  pr = 1;.  memset
ef80: 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20  (&eListItem, 0, 
ef90: 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d  sizeof(eListItem
efa0: 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20  ));.  eList.a = 
efb0: 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c  &eListItem;.  eL
efc0: 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  ist.a[0].pExpr =
efd0: 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74   pExpr;.  select
efe0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
eff0: 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20  , p, &eList, 0, 
f000: 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c  0, 0, -1, eDest,
f010: 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f   iParm, cont, co
f020: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
f030: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f040: 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
f050: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f060: 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
f070: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
f080: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f090: 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
f0a0: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
f0b0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
f0c0: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
f0d0: 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
f0e0: 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
f0f0: 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
f100: 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
f110: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
f120: 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
f130: 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
f140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
f180: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
f190: 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
f1a0: 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
f1b0: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
f1c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
f1d0: 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
f1e0: 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
f1f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
f200: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
f210: 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
f220: 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
f230: 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69  ys of a table wi
f240: 74 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a  th cursor iParm.
f250: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
f260: 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
f270: 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
f280: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
f290: 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
f2a0: 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
f2b0: 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
f2c0: 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20 74 65  ults form the te
f2d0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
f2e0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
f2f0: 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
f300: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
f310: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
f320: 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
f330: 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
f340: 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
f350: 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
f360: 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
f370: 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
f380: 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
f390: 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
f3a0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
f3b0: 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
f3c0: 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
f3d0: 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
f3e0: 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
f3f0: 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
f400: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
f410: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
f420: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
f430: 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
f440: 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
f450: 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
f460: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
f470: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
f480: 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
f490: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
f4a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
f4b0: 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
f4c0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
f4d0: 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
f4e0: 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
f4f0: 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
f500: 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
f510: 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
f520: 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
f530: 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
f540: 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
f550: 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
f560: 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
f570: 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
f580: 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
f590: 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
f5a0: 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
f5b0: 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
f5c0: 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
f5d0: 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
f5e0: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
f5f0: 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
f600: 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
f610: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
f620: 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
f630: 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
f640: 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
f650: 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
f660: 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
f670: 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
f680: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
f690: 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
f6a0: 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
f6b0: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
f6c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
f6d0: 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
f6e0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
f6f0: 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
f700: 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
f710: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
f720: 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
f730: 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
f740: 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
f780: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
f790: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
f7a0: 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
f7b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
f7c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f7d0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
f7e0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
f7f0: 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
f800: 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
f810: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
f820: 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
f830: 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
f840: 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
f850: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
f860: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
f870: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
f880: 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
f890: 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
f8a0: 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
f8b0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
f8c0: 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
f8d0: 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
f8e0: 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
f8f0: 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
f900: 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
f910: 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
f920: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
f930: 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
f940: 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
f950: 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
f960: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20   sqliteSelect(. 
f970: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
f990: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
f9a0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
f9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f9c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f9d0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
f9e0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
f9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
fa00: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
fa10: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
fa20: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
fa30: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
fa40: 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
fa50: 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
fa60: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
fa70: 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
fa80: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
fa90: 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
faa0: 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
fab0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
fac0: 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
fad0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
fae0: 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
faf0: 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
fb00: 74 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20  t *pParentAgg   
fb10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
fb20: 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
fb30: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
fb40: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
fb50: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
fb60: 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  nfo;.  Vdbe *v;.
fb70: 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b    int isAgg = 0;
fb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
fb90: 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
fba0: 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
fbb0: 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
fbc0: 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
fbd0: 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
fbe0: 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
fbf0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
fc00: 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
fc10: 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
fc20: 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
fc30: 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
fc40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
fc50: 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
fc60: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
fc70: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
fc80: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
fc90: 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
fca0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
fcb0: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
fcc0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
fcd0: 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
fce0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
fcf0: 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
fd00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
fd10: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
fd20: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
fd30: 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20  t isDistinct;   
fd40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
fd50: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
fd60: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
fd70: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
fd80: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
fd90: 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
fda0: 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
fdb0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b 20   */.  int base; 
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 46 69 72 73 74 20 63 75 72 73 6f 72 20 61 76 61  First cursor ava
fde0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a  ilable for use *
fdf0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
fe00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
fe10: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
fe20: 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
fe30: 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
fe40: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
fe50: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
fe60: 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  || p==0 ) return
fe70: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
fe80: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
fe90: 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
fea0: 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
feb0: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rn 1;..  /* If t
fec0: 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
fed0: 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
fee0: 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
fef0: 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
ff00: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
ff10: 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
ff20: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
ff30: 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
ff40: 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Parm);.  }..  /*
ff50: 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
ff60: 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
ff70: 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
ff80: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
ff90: 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
ffa0: 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
ffb0: 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79  here;.  pOrderBy
ffc0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
ffd0: 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
ffe0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
fff0: 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
10000 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d  ;.  isDistinct =
10010 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
10020 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
10030 20 62 6c 6f 63 6b 20 6f 66 20 56 44 42 45 20 63   block of VDBE c
10040 75 72 73 6f 72 73 2c 20 6f 6e 65 20 66 6f 72 20  ursors, one for 
10050 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
10060 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
10070 20 2a 2a 20 54 68 65 20 57 48 45 52 45 20 70 72   ** The WHERE pr
10080 6f 63 65 73 73 69 6e 67 20 72 65 71 75 69 72 65  ocessing require
10090 73 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  s that the curso
100a0 72 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  rs for the table
100b0 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 46 52  s in the.  ** FR
100c0 4f 4d 20 63 6c 61 75 73 65 20 62 65 20 63 6f 6e  OM clause be con
100d0 73 65 63 75 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  secutive..  */. 
100e0 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65 20   base = p->base 
100f0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
10100 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b    pParse->nTab +
10110 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  = pTabList->nSrc
10120 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
10130 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
10140 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
10150 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
10160 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
10170 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
10180 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
10190 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
101a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
101b0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
101c0 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e 64  nd;..  /* Expand
101d0 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20 69   any "*" terms i
101e0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
101f0 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 20  .  (For example 
10200 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a 20  the "*" in.  ** 
10210 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
10220 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e 43  1")  The fillInC
10230 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75 74  olumnlist() rout
10240 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73 6f  ine also does so
10250 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 6f  me.  ** other ho
10260 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65 65  usekeeping - see
10270 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
10280 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ent for details.
10290 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c 6c  .  */.  if( fill
102a0 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61  InColumnList(pPa
102b0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    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 20 20 70 57 68 65 72 65 20 3d 20 70    }.  pWhere = p
102e0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c 69  ->pWhere;.  pELi
102f0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
10300 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
10310 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
10320 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
10330 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
10340 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
10350 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
10360 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
10370 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
10380 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52    if( (eDest==SR
10390 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
103a0 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69  SRT_Set) && pELi
103b0 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20  st->nExpr>1 ){. 
103c0 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
103d0 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
103e0 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
103f0 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
10400 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
10410 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
10420 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
10430 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
10440 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  end;.  }..  /* O
10450 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
10460 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
10470 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
10480 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
10490 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  {.    case SRT_U
104a0 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20 53  nion:.    case S
104b0 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20 63  RT_Except:.    c
104c0 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64 3a  ase SRT_Discard:
104d0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
104e0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
104f0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
10500 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
10510 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
10520 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  int, we should h
10530 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  ave allocated al
10540 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  l the cursors th
10550 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64 20  at we.  ** need 
10560 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75 65  to handle subque
10570 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  rys and temporar
10580 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a 2a  y tables.  .  **
10590 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  ** Resolve th
105a0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
105b0 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69 63  nd do a semantic
105c0 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20 74  s check on all t
105d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  he expressions..
105e0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
105f0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
10600 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
10610 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
10620 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
10630 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70  , pTabList, 0, p
10640 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
10650 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  r) ){.      goto
10660 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
10670 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
10680 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
10690 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
106a0 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67 67  pExpr, 1, &isAgg
106b0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
106c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
106d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65  }.  }.  if( pWhe
106e0 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  re ){.    if( sq
106f0 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
10700 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
10710 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
10720 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20  t, pWhere) ){.  
10730 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
10740 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
10750 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
10760 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  ck(pParse, pWher
10770 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
10780 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
10790 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  d;.    }.    sql
107a0 69 74 65 4f 72 61 63 6c 65 38 4a 6f 69 6e 46 69  iteOracle8JoinFi
107b0 78 75 70 28 62 61 73 65 2c 20 70 54 61 62 4c 69  xup(base, pTabLi
107c0 73 74 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d  st, pWhere);.  }
107d0 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29  .  if( pHaving )
107e0 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  {.    if( pGroup
107f0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
10800 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
10810 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42  arse, "a GROUP B
10820 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
10830 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49  ired before HAVI
10840 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NG");.      goto
10850 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
10860 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
10870 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
10880 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54  pParse, base, pT
10890 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
108a0 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
108b0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
108c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
108d0 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
108e0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
108f0 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a  , 1, &isAgg) ){.
10900 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10910 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
10920 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
10930 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
10940 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
10950 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
10960 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 45  nt iCol;.      E
10970 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
10980 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
10990 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
109a0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
109b0 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f 6c  , &iCol) && iCol
109c0 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69  >0 && iCol<=pELi
109d0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
109e0 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
109f0 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20  elete(pE);.     
10a00 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79     pE = pOrderBy
10a10 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
10a20 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45 4c  qliteExprDup(pEL
10a30 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70  ist->a[iCol-1].p
10a40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
10a50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
10a60 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
10a70 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62  arse, base, pTab
10a80 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
10a90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
10aa0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10ac0 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
10ad0 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41 67  pParse, pE, isAg
10ae0 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  g, 0) ){.       
10af0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
10b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b10 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
10b20 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a  Constant(pE) ){.
10b30 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
10b40 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
10b50 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b  pE, &iCol)==0 ){
10b60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10b70 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
10b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
10b90 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 6d  ORDER BY terms m
10ba0 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69  ust not be non-i
10bb0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73  nteger constants
10bc0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ");.          go
10bd0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
10be0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10bf0 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
10c00 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
10c10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10c20 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
10c30 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
10c40 20 22 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d   "ORDER BY colum
10c50 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
10c60 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
10c70 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
10c80 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
10c90 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45  nd %d", iCol, pE
10ca0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
10cb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
10cc0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
10cd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10ce0 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f 75  .  }.  if( pGrou
10cf0 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  pBy ){.    for(i
10d00 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
10d10 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10d20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
10d30 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 47     Expr *pE = pG
10d40 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
10d50 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
10d60 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65  liteExprIsIntege
10d70 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20  r(pE, &iCol) && 
10d80 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
10d90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
10da0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
10db0 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20  xprDelete(pE);. 
10dc0 20 20 20 20 20 20 20 70 45 20 3d 20 70 47 72 6f         pE = pGro
10dd0 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
10de0 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
10df0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
10e00 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
10e10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
10e20 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
10e30 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
10e40 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
10e50 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  , pE) ){.       
10e60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
10e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10e80 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
10e90 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20  eck(pParse, pE, 
10ea0 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20  isAgg, 0) ){.   
10eb0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
10ec0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
10ed0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
10ee0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
10ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10f00 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
10f10 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d  ger(pE, &iCol)==
10f20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
10f30 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
10f40 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
10f50 20 20 22 47 52 4f 55 50 20 42 59 20 74 65 72 6d    "GROUP BY term
10f60 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
10f70 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
10f80 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nts");.         
10f90 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
10fa0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10fb0 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
10fc0 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
10fd0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
10fe0 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
10ff0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
11000 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f 6c     "GROUP BY col
11010 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
11020 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
11030 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
11040 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
11050 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20   and %d", iCol, 
11060 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
11070 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
11080 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
11090 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
110a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
110b0 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
110c0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
110d0 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
110e0 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
110f0 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
11100 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
11110 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
11120 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
11130 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
11140 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
11150 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
11170 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
11180 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
11190 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
111a0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
111b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
111c0 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
111d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
111e0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
111f0 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
11200 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
11210 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
11220 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
11230 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
11240 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
11250 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  n..  */.  if( eD
11260 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
11270 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
11280 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
11290 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 54  rse, p->base, pT
112a0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
112b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
112c0 68 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a  he limiter.  */.
112d0 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c    if( p->nLimit<
112e0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69  =0 ){.    p->nLi
112f0 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d  mit = -1;.    p-
11300 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
11310 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
11320 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
11330 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
11340 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11350 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69  Integer, -p->nLi
11360 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mit, 0);.    sql
11370 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11380 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
11390 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c  m, 1);.    p->nL
113a0 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 20  imit = iMem;.   
113b0 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3c   if( p->nOffset<
113c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
113d0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
113e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4d 65  }else{.      iMe
113f0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
11400 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
11410 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11420 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66  Integer, -p->nOf
11430 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  fset, 0);.      
11440 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11450 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
11460 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
11470 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 69 4d 65  p->nOffset = iMe
11480 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
11490 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
114a0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
114b0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
114c0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66   clause.  */.  f
114d0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
114e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
114f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11500 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
11510 74 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  t;.    if( pTabL
11520 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
11530 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
11540 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
11550 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30  t->a[i].zName!=0
11560 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
11570 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
11580 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
11590 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
115a0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
115b0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
115c0 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20  zName;.    }.   
115d0 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
115e0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e  arse, pTabList->
115f0 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52  a[i].pSelect, SR
11600 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62 61 73  T_TempTable, bas
11610 65 2b 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e+i,.           
11620 20 20 20 20 20 20 70 2c 20 69 2c 20 26 69 73 41        p, i, &isA
11630 67 67 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  gg);.    if( pTa
11640 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
11650 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  e!=0 ){.      pP
11660 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
11670 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
11680 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
11690 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
116a0 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
116b0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
116c0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
116d0 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
116e0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
116f0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
11700 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
11710 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
11720 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
11730 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
11740 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
11750 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tinct;.  }..  /*
11760 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
11770 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
11780 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ery that can be 
11790 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f  "flattened" into
117a0 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a   its parent..  *
117b0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
117c0 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c  is a possiblity,
117d0 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72   do so and retur
117e0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  n immediately.  
117f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
11800 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67  ent && pParentAg
11810 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74  g &&.      flatt
11820 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
11830 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  e, pParent, pare
11840 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
11850 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
11860 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
11870 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
11880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11890 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
118a0 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
118b0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
118c0 67 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  g a callback.  T
118d0 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
118e0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
118f0 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
11900 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
11910 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
11920 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a   a callback..  *
11930 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
11940 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
11950 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
11960 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
11970 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  ->base, pTabList
11980 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
11990 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
119a0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
119b0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
119c0 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
119d0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
119e0 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
119f0 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
11a00 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11a10 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
11a20 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 0);.  }..  
11a30 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
11a40 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
11a50 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
11a60 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
11a70 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
11a80 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  se);.  if( isAgg
11a90 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a   || pGroupBy ){.
11aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
11ab0 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20  se->nAgg==0 );. 
11ac0 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
11ad0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
11ae0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11af0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
11b00 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
11b10 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
11b20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11b30 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
11b40 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11b60 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
11b70 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
11b80 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
11b90 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11ba0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11bb0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
11bc0 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
11bd0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
11be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11bf0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11c10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
11c20 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
11c30 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
11c40 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
11c50 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
11c60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
11c80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
11c90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
11ca0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
11cb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
11cc0 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
11cd0 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
11ce0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
11cf0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
11d00 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11d10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
11d20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11d30 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
11d40 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
11d50 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
11d60 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
11d70 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
11d80 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
11d90 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
11da0 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
11db0 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
11dc0 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
11dd0 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
11de0 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
11df0 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
11e00 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
11e10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
11e20 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11e30 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c  , OP_AggInit, 0,
11e40 20 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   i);.        sql
11e50 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
11e60 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 46  v, -1, (char*)pF
11e70 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  unc, P3_POINTER)
11e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11e90 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
11ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
11eb0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11ec0 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11ed0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
11ee0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
11ef0 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20  gFocus, 0, 0);. 
11f00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
11f10 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
11f20 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
11f30 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
11f40 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
11f50 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11f60 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
11f70 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11f80 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11f90 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
11fa0 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
11fb0 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
11fc0 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
11fd0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
11fe0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
11ff0 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
12000 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
12010 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
12020 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12030 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
12040 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20   distinct, 1);. 
12050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
12060 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
12070 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
12080 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a  atabase scan.  *
12090 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
120a0 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
120b0 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70  arse, p->base, p
120c0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
120d0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
12100 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  &pOrderBy);.  if
12110 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
12120 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
12130 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
12140 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
12150 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
12160 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
12170 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
12180 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
12190 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
121a0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
121b0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
121c0 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
121d0 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e   iParm, pWInfo->
12200 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
12210 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20 20  o->iBreak) ){.  
12220 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
12230 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
12240 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
12250 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67  dealing with agg
12260 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f  regates, then do
12270 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67   the special agg
12280 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63  regate.  ** proc
12290 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20  essing.  .  */. 
122a0 20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70   else{.    if( p
122b0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
122c0 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20   int lbl1;.     
122d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
122e0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
122f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12300 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
12310 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
12320 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
12330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
12340 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
12350 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e  eKey, pGroupBy->
12360 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
12370 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
12380 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
12390 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79  ) sqliteAddKeyTy
123a0 70 65 28 76 2c 20 70 47 72 6f 75 70 42 79 29 3b  pe(v, pGroupBy);
123b0 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
123c0 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
123d0 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
123e0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
123f0 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c  P_AggFocus, 0, l
12400 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  bl1);.      for(
12410 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
12420 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
12430 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
12440 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
12450 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12460 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
12470 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e  pParse, pParse->
12480 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  aAgg[i].pExpr);.
12490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
124a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
124b0 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20  gSet, 0, i);.   
124c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
124d0 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
124e0 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  l(v, lbl1);.    
124f0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
12500 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
12510 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
12520 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  *pE;.      int j
12530 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
12540 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
12550 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
12560 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73 65       pE = pParse
12570 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b  ->aAgg[i].pExpr;
12580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12590 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  E->op==TK_AGG_FU
125a0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
125b0 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20 29 7b  if( pE->pList ){
125c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
125d0 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e  ; j<pE->pList->n
125e0 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
125f0 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
12600 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 2d  Code(pParse, pE-
12610 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  >pList->a[j].pEx
12620 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
12630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12640 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12650 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
12660 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
12670 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
12680 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d 3e 70  ggFunc, 0, pE->p
12690 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69 73 74  List ? pE->pList
126a0 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
126b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
126c0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
126d0 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
126e0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41  sert( pParse->aA
126f0 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78 53 74  gg[i].pFunc->xSt
12700 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ep!=0 );.      s
12710 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
12720 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  3(v, -1, (char*)
12730 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
12740 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45  pFunc, P3_POINTE
12750 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R);.    }.  }.. 
12760 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
12770 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
12780 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65    */.  sqliteWhe
12790 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
127a0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
127b0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
127c0 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
127d0 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
127e0 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
127f0 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
12800 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
12810 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
12820 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
12830 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
12840 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
12850 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
12860 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
12870 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
12880 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12890 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e  P_AggNext, 0, en
128a0 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73  dagg);.    pPars
128b0 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
128c0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
128d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
128e0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
128f0 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
12900 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  agg, 1);.    }. 
12910 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
12920 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
12930 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
12940 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
12950 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
12970 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20  Parm, startagg, 
12980 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20 20 20  endagg) ){.     
12990 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
129a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
129b0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
129c0 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74  P_Goto, 0, start
129d0 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
129e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
129f0 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20  (v, endagg);.   
12a00 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12a10 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20  (v, OP_Noop, 0, 
12a20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
12a30 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a  useAgg = 0;.  }.
12a40 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
12a50 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
12a60 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
12a70 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
12a80 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
12a90 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
12aa0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
12ab0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
12ac0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12ad0 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
12ae0 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  l(p, v, pEList->
12af0 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
12b00 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  arm);.  }...  /*
12b10 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20 63 61   Issue a null ca
12b20 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74 20 69  llback if that i
12b30 73 20 77 68 61 74 20 74 68 65 20 75 73 65 72 20  s what the user 
12b40 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  wants..  */.  if
12b50 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
12b60 6c 62 61 63 6b 20 26 26 0a 20 20 20 20 28 70 50  lback &&.    (pP
12b70 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63  arse->useCallbac
12b80 6b 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d  k==0 || (pParse-
12b90 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
12ba0 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
12bb0 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 73  )!=0).  ){.    s
12bc0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12bd0 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  , OP_NullCallbac
12be0 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  k, pEList->nExpr
12bf0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
12c00 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
12c10 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
12c20 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
12c30 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
12c40 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
12c50 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
12c60 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
12c70 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
12c80 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
12c90 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
12ca0 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
12cb0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
12cc0 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
12cd0 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
12ce0 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67  _end:.  sqliteAg
12cf0 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
12d00 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
12d10 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.