/ Hex Artifact Content
Login

Artifact d1c876b9078894bc956cf1a5b38abd1a5abaf70b:


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