/ Hex Artifact Content
Login

Artifact 15d921308065c9320363af6f43c01d9f09ea7118:


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 39  select.c,v 1.139
0200: 20 32 30 30 33 2f 30 35 2f 31 37 20 31 37 3a 33   2003/05/17 17:3
0210: 35 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a 2a  5:12 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 53 72 63 4c 69  inFixup(.  SrcLi
2520: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 2f 2a 20  st *pSrc,    /* 
2530: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 62  List of tables b
2540: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20  eing joined */. 
2550: 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 20 20   Expr *pWhere   
2560: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2570: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
2580: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
2590: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
25a0: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
25b0: 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
25c0: 20 45 50 5f 4f 72 61 63 6c 65 38 4a 6f 69 6e 29   EP_Oracle8Join)
25d0: 20 26 26 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d   && pWhere->op==
25e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
25f0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 66 6f   int idx;.    fo
2600: 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 53 72  r(idx=0; idx<pSr
2610: 63 2d 3e 6e 53 72 63 3b 20 69 64 78 2b 2b 29 7b  c->nSrc; idx++){
2620: 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d  .      if( pSrc-
2630: 3e 61 5b 69 64 78 5d 2e 69 43 75 72 73 6f 72 3d  >a[idx].iCursor=
2640: 3d 70 57 68 65 72 65 2d 3e 69 54 61 62 6c 65 20  =pWhere->iTable 
2650: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2660: 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d     assert( idx>=
2670: 30 20 26 26 20 69 64 78 3c 70 53 72 63 2d 3e 6e  0 && idx<pSrc->n
2680: 53 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69  Src );.    if( i
2690: 64 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 53  dx>0 ){.      pS
26a0: 72 63 2d 3e 61 5b 69 64 78 2d 31 5d 2e 6a 6f 69  rc->a[idx-1].joi
26b0: 6e 74 79 70 65 20 26 3d 20 7e 4a 54 5f 49 4e 4e  ntype &= ~JT_INN
26c0: 45 52 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  ER;.      pSrc->
26d0: 61 5b 69 64 78 2d 31 5d 2e 6a 6f 69 6e 74 79 70  a[idx-1].jointyp
26e0: 65 20 7c 3d 20 4a 54 5f 4f 55 54 45 52 7c 4a 54  e |= JT_OUTER|JT
26f0: 5f 4c 45 46 54 3b 0a 20 20 20 20 20 20 72 65 74  _LEFT;.      ret
2700: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
2710: 0a 20 20 69 66 28 20 70 57 68 65 72 65 2d 3e 70  .  if( pWhere->p
2720: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 72 63 20  Right ){.    rc 
2730: 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a  = sqliteOracle8J
2740: 6f 69 6e 46 69 78 75 70 28 70 53 72 63 2c 20 70  oinFixup(pSrc, p
2750: 57 68 65 72 65 2d 3e 70 52 69 67 68 74 29 3b 0a  Where->pRight);.
2760: 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
2770: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 72  ->pLeft ){.    r
2780: 63 20 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c  c |= sqliteOracl
2790: 65 38 4a 6f 69 6e 46 69 78 75 70 28 70 53 72 63  e8JoinFixup(pSrc
27a0: 2c 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29  , pWhere->pLeft)
27b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65  ;.  }.  if( pWhe
27c0: 72 65 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  re->pList ){.   
27d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
27e0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57  List *pList = pW
27f0: 68 65 72 65 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  here->pList;.   
2800: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
2810: 74 2d 3e 6e 45 78 70 72 20 26 26 20 72 63 3d 3d  t->nExpr && rc==
2820: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  0; i++){.      r
2830: 63 20 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c  c |= sqliteOracl
2840: 65 38 4a 6f 69 6e 46 69 78 75 70 28 70 53 72 63  e8JoinFixup(pSrc
2850: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
2860: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2870: 20 20 69 66 28 20 72 63 3d 3d 31 20 26 26 20 28    if( rc==1 && (
2880: 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
2890: 4e 44 20 7c 7c 20 70 57 68 65 72 65 2d 3e 6f 70  ND || pWhere->op
28a0: 3d 3d 54 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20  ==TK_EQ) ){.    
28b0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65  setJoinExpr(pWhe
28c0: 72 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b  re);.    rc = 0;
28d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
28f0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
2900: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
2910: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
2920: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
2930: 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  id sqliteSelectD
2940: 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29  elete(Select *p)
2950: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
2960: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45  eturn;.  sqliteE
2970: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
2980: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
2990: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
29a0: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69  p->pSrc);.  sqli
29b0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  teExprDelete(p->
29c0: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
29d0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
29e0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
29f0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
2a00: 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
2a10: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
2a20: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
2a30: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
2a40: 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f  tDelete(p->pPrio
2a50: 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  r);.  sqliteFree
2a60: 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20  (p->zSelect);.  
2a70: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
2a80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2a90: 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  he aggregate inf
2aa0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2ab0: 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  e parse structur
2ac0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2ad0: 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74  d sqliteAggregat
2ae0: 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65  eInfoReset(Parse
2af0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
2b00: 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e  iteFree(pParse->
2b10: 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d  aAgg);.  pParse-
2b20: 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61  >aAgg = 0;.  pPa
2b30: 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20  rse->nAgg = 0;. 
2b40: 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
2b50: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
2b60: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
2b70: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
2b80: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
2b90: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
2ba0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
2bb0: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
2bc0: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
2bd0: 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50  Sorter(Parse *pP
2be0: 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45  arse, Vdbe *v, E
2bf0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2c00: 79 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f 72  y){.  char *zSor
2c10: 74 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69 3b  tOrder;.  int i;
2c20: 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20  .  zSortOrder = 
2c30: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f  sqliteMalloc( pO
2c40: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
2c50: 31 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72 74  1 );.  if( zSort
2c60: 4f 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75 72  Order==0 ) retur
2c70: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
2c80: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
2c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
2ca0: 72 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  rder = pOrderBy-
2cb0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2cc0: 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  .    int type;. 
2cd0: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 66     int c;.    if
2ce0: 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54  ( (order & SQLIT
2cf0: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d  E_SO_TYPEMASK)==
2d00: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29  SQLITE_SO_TEXT )
2d10: 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53  {.      type = S
2d20: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
2d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 72     }else if( (or
2d40: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
2d50: 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54  TYPEMASK)==SQLIT
2d60: 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20  E_SO_NUM ){.    
2d70: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2d80: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c 73  SO_NUM;.    }els
2d90: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62  e if( pParse->db
2da0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
2db0: 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d   ){.      type =
2dc0: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
2dd0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2de0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Expr);.    }else
2df0: 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53  {.      type = S
2e00: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
2e10: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72 64    }.    if( (ord
2e20: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44  er & SQLITE_SO_D
2e30: 49 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  IRMASK)==SQLITE_
2e40: 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20  SO_ASC ){.      
2e50: 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  c = type==SQLITE
2e60: 5f 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20 3a  _SO_TEXT ? 'A' :
2e70: 20 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   '+';.    }else{
2e80: 0a 20 20 20 20 20 20 63 20 3d 20 74 79 70 65 3d  .      c = type=
2e90: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
2ea0: 3f 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20 20  ? 'D' : '-';.   
2eb0: 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65   }.    zSortOrde
2ec0: 72 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73 71  r[i] = c;.    sq
2ed0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
2ee0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
2ef0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
2f00: 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72    zSortOrder[pOr
2f10: 64 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20  derBy->nExpr] = 
2f20: 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  0;.  sqliteVdbeA
2f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d  ddOp(v, OP_SortM
2f40: 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79  akeKey, pOrderBy
2f50: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73  ->nExpr, 0);.  s
2f60: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2f70: 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f 72  3(v, -1, zSortOr
2f80: 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f 72  der, strlen(zSor
2f90: 74 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c 69  tOrder));.  sqli
2fa0: 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64 65  teFree(zSortOrde
2fb0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  r);.  sqliteVdbe
2fc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
2fd0: 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  Put, 0, 0);.}../
2fe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ff0: 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67 75  e adds a P3 argu
3000: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74  ment to the last
3010: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61   VDBE opcode tha
3020: 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65  t was.** inserte
3030: 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d 65  d. The P3 argume
3040: 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73 74  nt added is a st
3050: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
3060: 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b  r the .** OP_Mak
3070: 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49  eKey or OP_MakeI
3080: 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20  dxKey opcodes.  
3090: 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  The string consi
30a0: 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  sts of.** charac
30b0: 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20  ters 't' or 'n' 
30c0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
30d0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
30e0: 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64  various.** field
30f0: 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20  s of the key to 
3100: 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f  be generated sho
3110: 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61  uld be treated a
3120: 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20  s numeric.** or 
3130: 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74 68  as text.  See th
3140: 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64  e OP_MakeKey and
3150: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f   OP_MakeIdxKey o
3160: 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e  pcode.** documen
3170: 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  tation for addit
3180: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
3190: 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20 73  n about the P3 s
31a0: 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c  tring..** See al
31b0: 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64  so the sqliteAdd
31c0: 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f 75  IdxKeyType() rou
31d0: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
31e0: 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 56  liteAddKeyType(V
31f0: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
3200: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
3210: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
3220: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61 72  t->nExpr;.  char
3230: 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65   *zType = sqlite
3240: 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b  Malloc( nColumn+
3250: 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  1 );.  int i;.  
3260: 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72  if( zType==0 ) r
3270: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
3280: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
3290: 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  ){.    zType[i] 
32a0: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
32b0: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
32c0: 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  xpr)==SQLITE_SO_
32d0: 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27 3b  NUM ? 'n' : 't';
32e0: 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d 20  .  }.  zType[i] 
32f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  = 0;.  sqliteVdb
3300: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
3310: 20 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e 29   zType, nColumn)
3320: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
3330: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
3340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
3350: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
3360: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
3370: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
3380: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
3390: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
33a0: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
33b0: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
33c0: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
33d0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
33e0: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
33f0: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
3400: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
3410: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
3420: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
3430: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
3440: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
3450: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
3460: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
3470: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3490: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
34a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
34c0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
34d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34f0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
3500: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
3510: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3520: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
3530: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
3540: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
3550: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
3560: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
3570: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
3580: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
3590: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
35a0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
35b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
35c0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
35d0: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  rce table */.  E
35e0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
35f0: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
3600: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
3610: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
3620: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  ey */.  int dist
3630: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
3640: 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20  /* If >=0, make 
3650: 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  sure results are
3660: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3670: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
3680: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
3690: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
36a0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
36b0: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
36c0: 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d       /* An argum
36d0: 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f  ent to the dispo
36e0: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
36f0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
3700: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
3710: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
3720: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
3730: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
3750: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
3760: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
3770: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
3780: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3790: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
37a0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
37b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
37c0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
37d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
37e0: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
37f0: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
3800: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
3810: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
3820: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
3830: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
3840: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
3850: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
3860: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66  {.    if( p->nOf
3870: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  fset>0 ){.      
3880: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
3890: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
38a0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
38b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
38c0: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66  _MemIncr, p->nOf
38d0: 66 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20  fset, addr+2);. 
38e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
38f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3900: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3910: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
3920: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >nLimit>=0 ){.  
3930: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3940: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
3950: 72 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 69 42  r, p->nLimit, iB
3960: 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  reak);.    }.  }
3970: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
3980: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
3990: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
39a0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
39b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
39c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
39d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
39e0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
39f0: 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  Tab, i);.    }. 
3a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
3a10: 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  umn = pEList->nE
3a20: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
3a30: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
3a40: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
3a50: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
3a60: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
3a70: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  i].pExpr);.    }
3a80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
3a90: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3aa0: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
3ab0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
3ac0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
3ad0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
3ae0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
3af0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
3b00: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
3b10: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
3b20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73  ..  */.  if( dis
3b30: 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69  tinct>=0 && pELi
3b40: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
3b50: 78 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c  xpr>0 ){.#if NUL
3b60: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
3b70: 54 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  T.    sqliteVdbe
3b80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
3b90: 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78  ll, -pEList->nEx
3ba0: 70 72 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75  pr, sqliteVdbeCu
3bb0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b  rrentAddr(v)+7);
3bc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
3bd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3be0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73  P_MakeKey, pELis
3bf0: 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  t->nExpr, 1);.  
3c00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
3c10: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
3c20: 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54   ) sqliteAddKeyT
3c30: 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a  ype(v, pEList);.
3c40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3c50: 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e  dOp(v, OP_Distin
3c60: 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 73 71  ct, distinct, sq
3c70: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
3c80: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73  ddr(v)+3);.    s
3c90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3ca0: 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74  , OP_Pop, pEList
3cb0: 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20  ->nExpr+1, 0);. 
3cc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3cd0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
3ce0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
3cf0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3d00: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
3d10: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
3d20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3d30: 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74  _PutStrKey, dist
3d40: 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  inct, 0);.  }.. 
3d50: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
3d60: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
3d70: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
3d80: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
3d90: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
3da0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
3db0: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
3dc0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3dd0: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
3de0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3df0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
3e00: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c  rd, nColumn, NUL
3e10: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
3e20: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
3e30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3e40: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
3e50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3e60: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3e70: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
3e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3e90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
3ea0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
3eb0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
3ec0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
3ed0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
3ee0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
3ef0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
3f00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3f10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3f20: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3f30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3f40: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3f50: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
3f60: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
3f70: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
3f80: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3f90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3fa0: 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d  _NewRecno, iParm
3fb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3fc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3fd0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
3fe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3ff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4000: 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c  utIntKey, iParm,
4010: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4030: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
4040: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
4050: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
4060: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
4070: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
4080: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
4090: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
40a0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
40b0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
40c0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
40d0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
40e0: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
40f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
4100: 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
4110: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4120: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4130: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
4140: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
4150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4160: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4170: 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20  otFound, iParm, 
4180: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
4190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
41a0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61  , OP_Delete, iPa
41b0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
41c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
41d0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
41e0: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
41f0: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
4200: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
4210: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
4220: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
4230: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
4240: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
4250: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
4260: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
4270: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
4280: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
4290: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
42a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62  : {.      int lb
42b0: 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  l = sqliteVdbeMa
42c0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
42d0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
42e0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
42f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4300: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20   OP_IsNull, -1, 
4310: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lbl);.      if( 
4320: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4330: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4340: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4350: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4360: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4370: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4380: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
4390: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
43a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
43b0: 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72  _PutStrKey, iPar
43c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
43d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
43e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
43f0: 62 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  bl);.      break
4400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4410: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
4420: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
4430: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
4440: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
4450: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
4460: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
4470: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
4480: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
4490: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
44a0: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
44b0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
44c0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
44d0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
44e0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
44f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4500: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4510: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
4520: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
4530: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4540: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4550: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
4560: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
4570: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4580: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4590: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  Break);.      }.
45a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20   }..    /* Send 
45c0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
45d0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
45e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
45f0: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4600: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f  .    case SRT_So
4610: 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66  rter: {.      if
4620: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4630: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4640: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4650: 4d 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e  MakeRec, nColumn
4660: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
4670: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4680: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
4690: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
46a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
46b0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
46c0: 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ack );.        s
46d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
46e0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
46f0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
4700: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4710: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
4720: 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69  nvoke a subrouti
4730: 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ne to handle the
4740: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73   results.  The s
4750: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
4760: 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f  .    ** is respo
4770: 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69  nsible for poppi
4780: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
4790: 66 66 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  ff of the stack.
47a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
47b0: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
47c0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
47d0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
47e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
47f0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4800: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
4810: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4820: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4830: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
4840: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4850: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4860: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
4870: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
4880: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4890: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
48a0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
48b0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
48c0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
48d0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
48e0: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
48f0: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
4900: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
4910: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
4920: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
4930: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
4940: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
4950: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
4960: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
4970: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
4980: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
4990: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
49a0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
49b0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
49c0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
49d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
49e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
49f0: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
4a00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4a10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4a20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
4a30: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
4a40: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
4a50: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
4a60: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
4a70: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
4a80: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
4a90: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
4aa0: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
4ab0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
4ac0: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
4ad0: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
4ae0: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
4af0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
4b00: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
4b10: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
4b20: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
4b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
4b40: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
4b50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4b60: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
4b70: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
4b80: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
4b90: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
4ba0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
4bb0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
4bc0: 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  mn,     /* Numbe
4bd0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
4be0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44  data */.  int eD
4bf0: 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  est,       /* Wr
4c00: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
4c10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
4c20: 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20   int iParm      
4c30: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61    /* Optional pa
4c40: 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74  rameter associat
4c50: 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f  ed with eDest */
4c60: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20  .){.  int end = 
4c70: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
4c80: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
4c90: 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  dr;.  if( eDest=
4ca0: 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65  =SRT_Sorter ) re
4cb0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64  turn;.  sqliteVd
4cc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4cd0: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64  rt, 0, 0);.  add
4ce0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
4cf0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65  dOp(v, OP_SortNe
4d00: 78 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69  xt, 0, end);.  i
4d10: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  f( p->nOffset>0 
4d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
4d30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4d40: 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74  Incr, p->nOffset
4d50: 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73  , addr+4);.    s
4d60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4d70: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
4d80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4d90: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4da0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20   0, addr);.  }. 
4db0: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d   if( p->nLimit>=
4dc0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
4dd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4de0: 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4c 69 6d 69  emIncr, p->nLimi
4df0: 74 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  t, end);.  }.  s
4e00: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
4e10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4e20: 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73  lback: {.      s
4e30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4e40: 2c 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63  , OP_SortCallbac
4e50: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
4e60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e70: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
4e80: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
4e90: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b  SRT_TempTable: {
4ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4eb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
4ec0: 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29  Recno, iParm, 0)
4ed0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4ee0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4ef0: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
4f00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4f10: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
4f20: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
4f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4f40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
4f50: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
4f60: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
4f70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4f80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
4f90: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64  ll, -1, sqliteVd
4fa0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4fb0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4fc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4fd0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4ff0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
5000: 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  trKey, iParm, 0)
5010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5020: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
5030: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
5040: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5050: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5060: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5070: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
5080: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
5090: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
50a0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 29 3b  P_Goto, 0, end);
50b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
50c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
50d0: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
50e0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
50f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
5100: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
5110: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5120: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
5130: 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20  , -1-i, i);.    
5140: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5150: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5160: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
5170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5180: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
5190: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
51a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
51b0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
51c0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
51d0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
51e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
51f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5200: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
5210: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65  ;.  sqliteVdbeRe
5220: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
5230: 64 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  d);.  sqliteVdbe
5240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
5250: 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  Reset, 0, 0);.}.
5260: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5270: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
5280: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
5290: 20 64 61 74 61 74 79 70 65 73 20 6f 66 0a 2a 2a   datatypes of.**
52a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
52b0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
52c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * This routine o
52d0: 6e 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  nly generates co
52e0: 64 65 20 69 66 20 74 68 65 20 22 50 52 41 47 4d  de if the "PRAGM
52f0: 41 20 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73  A show_datatypes
5300: 3d 6f 6e 22 0a 2a 2a 20 68 61 73 20 62 65 65 6e  =on".** has been
5310: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
5320: 64 61 74 61 74 79 70 65 73 20 61 72 65 20 72 65  datatypes are re
5330: 70 6f 72 74 65 64 20 6f 75 74 20 69 6e 20 74 68  ported out in th
5340: 65 20 61 7a 43 6f 6c 0a 2a 2a 20 70 61 72 61 6d  e azCol.** param
5350: 65 74 65 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  eter to the call
5360: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 20 20  back function.  
5370: 54 68 65 20 66 69 72 73 74 20 4e 20 61 7a 43 6f  The first N azCo
5380: 6c 5b 5d 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  l[] entries.** a
5390: 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  re the names of 
53a0: 74 68 65 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64  the columns, and
53b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 4e 20 65 6e   the second N en
53c0: 74 72 69 65 73 20 61 72 65 20 74 68 65 0a 2a 2a  tries are the.**
53d0: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 74   datatypes for t
53e0: 68 65 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  he columns..**.*
53f0: 2a 20 54 68 65 20 22 64 61 74 61 74 79 70 65 22  * The "datatype"
5400: 20 66 6f 72 20 61 20 72 65 73 75 6c 74 20 74 68   for a result th
5410: 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f  at is a column o
5420: 66 20 61 20 74 79 70 65 20 69 73 20 74 68 65 0a  f a type is the.
5430: 2a 2a 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ** datatype defi
5440: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
5450: 20 66 72 6f 6d 20 74 68 65 20 43 52 45 41 54 45   from the CREATE
5460: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5470: 2e 0a 2a 2a 20 54 68 65 20 64 61 74 61 74 79 70  ..** The datatyp
5480: 65 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73  e for an express
5490: 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 54 45  ion is either TE
54a0: 58 54 20 6f 72 20 4e 55 4d 45 52 49 43 2e 20 20  XT or NUMERIC.  
54b0: 54 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 20  The.** datatype 
54c0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
54d0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f  d is INTEGER..*/
54e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
54f0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
5500: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5510: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
5520: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
5530: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5540: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
5550: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
5560: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
5570: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
5580: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
5590: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
55a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
55b0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
55c0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
55d0: 75 73 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  useCallback && (
55e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
55f0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 70 6f 72  s & SQLITE_Repor
5600: 74 54 79 70 65 73 29 3d 3d 30 20 29 7b 0a 20 20  tTypes)==0 ){.  
5610: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5620: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
5630: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5640: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
5650: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5660: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
5670: 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
5680: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5690: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
56a0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
56b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
56c0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
56d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
56e0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
56f0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
5700: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
5710: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
5720: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
5730: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
5740: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
5750: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
5760: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5770: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
5780: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
5790: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
57a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
57b0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
57c0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
57d0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
57e0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
57f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
5800: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d  NTEGER";.      }
5810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
5820: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
5830: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
5840: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5850: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5860: 65 45 78 70 72 54 79 70 65 28 70 29 3d 3d 53 51  eExprType(p)==SQ
5870: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
5880: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
5890: 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 7d 65  "TEXT";.      }e
58a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  lse{.        zTy
58b0: 70 65 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 0a  pe = "NUMERIC";.
58c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
58d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
58e0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
58f0: 6d 65 2c 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e  me, i + pEList->
5900: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 73  nExpr, 0);.    s
5910: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5920: 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20  3(v, -1, zType, 
5930: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  P3_STATIC);.  }.
5940: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5950: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5960: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5970: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5980: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5990: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
59a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
59b0: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
59c0: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
59d0: 6f 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  olues in the cal
59e0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
59f0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
5a00: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
5a10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5a20: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5a30: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
5a40: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
5a50: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
5a60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
5a70: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
5a80: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
5a90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
5aa0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
5ab0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5ac0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
5ad0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
5ae0: 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  sSet || v==0 || 
5af0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
5b00: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
5b10: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
5b20: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28  sSet = 1;.  for(
5b30: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5b40: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5b50: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 63 68 61  Expr *p;.    cha
5b60: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
5b70: 20 20 69 6e 74 20 73 68 6f 77 46 75 6c 6c 4e 61    int showFullNa
5b80: 6d 65 73 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c  mes;.    p = pEL
5b90: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5ba0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
5bb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5bc0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5bd0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5be0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5bf0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5c00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5c10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
5c20: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20  mnName, i, 0);. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5c40: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
5c50: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
5c60: 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  me));.      cont
5c70: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
5c80: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 3d 20  showFullNames = 
5c90: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
5ca0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
5cb0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
5cc0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
5cd0: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
5ce0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
5cf0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
5d00: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
5d10: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
5d20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
5d30: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
5d40: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
5d50: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
5d60: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
5d70: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
5d80: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
5d90: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
5da0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5db0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
5dc0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
5dd0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
5de0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
5df0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
5e00: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
5e10: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
5e20: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
5e30: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52        zCol = "_R
5e40: 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20  OWID_";.        
5e50: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
5e60: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
5e70: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
5e80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5e90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a  zName;.        z
5ea0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
5eb0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
5ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5ed0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
5ee0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73  >span.z[0] && !s
5ef0: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  howFullNames ){.
5f00: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
5f10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
5f20: 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  Op(v,OP_ColumnNa
5f30: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
5f40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
5f50: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
5f60: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
5f70: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
5f80: 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  teVdbeCompressSp
5f90: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ace(v, addr);.  
5fa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
5fb0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 7c  abList->nSrc>1 |
5fc0: 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20  | showFullNames 
5fd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5fe0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
5ff0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
6000: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
6010: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6020: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
6030: 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65  if( showFullName
6040: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
6050: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
6060: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
6070: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  eSetString(&zNam
6080: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
6090: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
60a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
60b0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
60c0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
60d0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
60e0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65  eP3(v, -1, zName
60f0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
6100: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6110: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
6120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6130: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6140: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
6150: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
6160: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6170: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f  ngeP3(v, -1, zCo
6180: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
6190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
61a0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
61b0: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
61c0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
61d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f  eVdbeAddOp(v,OP_
61e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30  ColumnName, i, 0
61f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6200: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6210: 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  1, p->span.z, p-
6220: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
6230: 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65  sqliteVdbeCompre
6240: 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29  ssSpace(v, addr)
6250: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6260: 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30     char zName[30
6270: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
6280: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
6290: 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30  N || pTabList==0
62a0: 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   );.      sprint
62b0: 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  f(zName, "column
62c0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
62d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
62e0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
62f0: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
6300: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6310: 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c  P3(v, -1, zName,
6320: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
6330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
6340: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
6350: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
6360: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
6370: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
6380: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6390: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
63a0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
63b0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
63c0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
63d0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
63e0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
63f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6400: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
6410: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
6420: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6430: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
6440: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
6450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
6460: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
6470: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
6480: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
6490: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
64a0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
64b0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
64c0: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
64d0: 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  List(Parse*, Sel
64e0: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
64f0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
6500: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
6510: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
6520: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
6530: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
6540: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
6550: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
6560: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
6570: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
6580: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
6590: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
65a0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
65b0: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pTab;.  int i;. 
65c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
65d0: 74 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e  t;..  if( fillIn
65e0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
65f0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
6600: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6610: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
6620: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
6630: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
6640: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
6650: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
6660: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62  ab->zName = zTab
6670: 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72  Name ? sqliteStr
6680: 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20  Dup(zTabName) : 
6690: 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  0;.  pEList = pS
66a0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
66b0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45   pTab->nCol = pE
66c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  List->nExpr;.  a
66d0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
66e0: 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61  l>0 );.  pTab->a
66f0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Col = sqliteMall
6700: 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d  oc( sizeof(pTab-
6710: 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e  >aCol[0])*pTab->
6720: 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nCol );.  for(i=
6730: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
6740: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
6750: 2a 70 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  *p;.    if( pELi
6760: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
6770: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  {.      pTab->aC
6780: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  ol[i].zName = sq
6790: 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c 69 73  liteStrDup(pELis
67a0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
67b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
67c0: 3d 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  =pEList->a[i].pE
67d0: 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  xpr)->span.z && 
67e0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
67f0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
6800: 53 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43  String(&pTab->aC
6810: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e  ol[i].zName, p->
6820: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
6830: 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  n, 0);.    }else
6840: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44   if( p->op==TK_D
6850: 4f 54 20 26 26 20 70 2d 3e 70 52 69 67 68 74 20  OT && p->pRight 
6860: 26 26 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  && p->pRight->to
6870: 6b 65 6e 2e 7a 20 26 26 0a 20 20 20 20 20 20 20  ken.z &&.       
6880: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74      p->pRight->t
6890: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
68a0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
68b0: 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ing(&pTab->aCol[
68c0: 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  i].zName, .     
68d0: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d        p->pRight-
68e0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69  >token.z, p->pRi
68f0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29  ght->token.n, 0)
6900: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6910: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
6920: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
6930: 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  zBuf, "column%d"
6940: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54  , i+1);.      pT
6950: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
6960: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6970: 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  (zBuf);.    }.  
6980: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
6990: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
69a0: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  Tab;.}../*.** Fo
69b0: 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
69c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f  CT statement, do
69d0: 20 74 68 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a   three things..*
69e0: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46 69 6c  *.**    (1)  Fil
69f0: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
6a00: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
6a10: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
6a20: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
6a30: 20 20 20 64 65 66 69 6e 65 73 20 74 68 65 20 73     defines the s
6a40: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
6a50: 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e  t should be scan
6a60: 6e 65 64 2e 20 20 46 6f 72 20 76 69 65 77 73 2c  ned.  For views,
6a70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
6a80: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
6a90: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
6aa0: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
6ab0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
6ac0: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
6ad0: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
6ae0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
6af0: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
6b00: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
6b10: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
6b20: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
6b30: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
6b40: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
6b50: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
6b60: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
6b70: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
6b80: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
6b90: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
6ba0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
6bb0: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  w..**.**    (2) 
6bc0: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
6bd0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6be0: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
6bf0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
6c00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
6c10: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
6c20: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
6c30: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
6c40: 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74 68      (3)  Scan th
6c50: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
6c60: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
6c70: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
6c80: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
6c90: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
6ca0: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
6cb0: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
6cc0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
6cd0: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
6ce0: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
6cf0: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
6d00: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
6d10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
6d20: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
6d30: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
6d40: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
6d50: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
6d60: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
6d70: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
6d80: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
6d90: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
6da0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
6db0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6dc0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
6dd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6de0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
6df0: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
6e00: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6e10: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
6e20: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
6e30: 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d  *pTab;..  if( p=
6e40: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
6e50: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
6e60: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
6e70: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
6e80: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c  >pEList;..  /* L
6e90: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
6ea0: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
6eb0: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  list..  */.  for
6ec0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
6ed0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
6ee0: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6ef0: 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20  a[i].pTab ){.   
6f00: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
6f10: 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
6f20: 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e!  No need to c
6f30: 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20  ontinue */.     
6f40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6f50: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
6f60: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
6f80: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
6f90: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
6fa0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
6fb0: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
6fc0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21  t->a[i].pSelect!
6fd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
6fe0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6ff0: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
7000: 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61      char zFakeNa
7010: 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20  me[60];.        
7020: 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d  sprintf(zFakeNam
7030: 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  e, "sqlite_subqu
7040: 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20  ery_%p_",.      
7050: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62       (void*)pTab
7060: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
7070: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
7080: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 54  iteSetString(&pT
7090: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
70a0: 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20  ias, zFakeName, 
70b0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
70c0: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
70d0: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
70e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65          sqliteRe
70f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
7100: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
7110: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
7150: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
7160: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7170: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7180: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7190: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
71a0: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
71b0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
71c0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
71d0: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
71e0: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
71f0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
7200: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
7210: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
7220: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
7230: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
7240: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
7250: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
7260: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
7270: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
7280: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
7290: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
72a0: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20  Transient = 1;. 
72b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
72c0: 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
72d0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
72e0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
72f0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54  ause */.      pT
7300: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
7310: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
7320: 20 20 20 20 73 71 6c 69 74 65 4c 6f 63 61 74 65      sqliteLocate
7330: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 54 61  Table(pParse,pTa
7340: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
7350: 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  e,pTabList->a[i]
7360: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
7370: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7380: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7390: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
73a0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
73b0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
73c0: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
73d0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
73e0: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
73f0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
7400: 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77 47   if( sqliteViewG
7410: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
7420: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
7430: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7440: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
7450: 20 20 20 20 20 2f 2a 20 49 66 20 70 54 61 62 4c       /* If pTabL
7460: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
7470: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
7480: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
7490: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
74a0: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
74b0: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
74c0: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
74d0: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
74e0: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
74f0: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
7500: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
7510: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
7520: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7530: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
7540: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
7550: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
7560: 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
7570: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
7580: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
7590: 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  ct = sqliteSelec
75a0: 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65  tDup(pTab->pSele
75b0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
75c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
75d0: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
75e0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
75f0: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
7600: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
7610: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
7620: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
7630: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
7640: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
7650: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
7660: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
7670: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
7680: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
7690: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
76a0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
76b0: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
76c0: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
76d0: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
76e0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
76f0: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
7700: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
7710: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
7720: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
7730: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
7740: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
7750: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
7760: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
7770: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7780: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
7790: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
77a0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
77b0: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
77c0: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
77d0: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
77e0: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
77f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
7800: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
7810: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
7820: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
7830: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
7840: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
7850: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
7860: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
7870: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
7880: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
7890: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
78a0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
78b0: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
78c0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
78d0: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
78e0: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
78f0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
7900: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
7910: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
7920: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
7930: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
7940: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
7950: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
7960: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
7970: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
7980: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
7990: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
79a0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
79b0: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
79c0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
79d0: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
79e0: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
79f0: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
7a00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
7a10: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
7a20: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
7a30: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
7a40: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
7a50: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
7a60: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
7a70: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
7a80: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7a90: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
7aa0: 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
7ab0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
7ac0: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20  >op!=TK_ALL &&. 
7ad0: 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f            (pE->o
7ae0: 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
7af0: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45  >pRight==0 || pE
7b00: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
7b10: 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
7b20: 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
7b30: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
7b40: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
7b50: 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
7b60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7b70: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70  pNew = sqliteExp
7b80: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
7b90: 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29  , a[k].pExpr, 0)
7ba0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
7bb0: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
7bc0: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
7bd0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  ame;.        a[k
7be0: 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
7bf0: 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
7c00: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
7c10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
7c20: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7c30: 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
7c40: 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
7c50: 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
7c60: 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
7c70: 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
7c80: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
7c90: 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
7ca0: 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
7cb0: 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e         Token *pN
7cc0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
7cd0: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
7ce0: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
7cf0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
7d00: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
7d10: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
7d20: 70 4e 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65  pName = &pE->pLe
7d30: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
7d40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d50: 20 20 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20      pName = 0;. 
7d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
7d80: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
7d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
7da0: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
7db0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20  st->a[i].pTab;. 
7dc0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
7dd0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69  TabName = pTabLi
7de0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b  st->a[i].zAlias;
7df0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
7e00: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
7e10: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
7e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
7e30: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
7e40: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
7e50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7e60: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
7e70: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
7e80: 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  [0]==0 || .     
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7ea0: 74 65 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65  teStrNICmp(pName
7eb0: 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70  ->z, zTabName, p
7ec0: 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20  Name->n)!=0 ||. 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 7a 54 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e  zTabName[pName->
7ef0: 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  n]!=0) ){.      
7f00: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7f10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7f20: 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
7f30: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
7f40: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
7f50: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
7f60: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
7f70: 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52  xpr, *pLeft, *pR
7f80: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
7f90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
7fa0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
7fb0: 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
7fc0: 20 20 69 66 28 20 69 3e 30 20 26 26 20 28 70 54    if( i>0 && (pT
7fd0: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a  abList->a[i-1].j
7fe0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
7ff0: 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  URAL)!=0 &&.    
8000: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
8010: 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
8020: 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a  ->a[i-1].pTab, z
8030: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
8040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
8050: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
8060: 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
8070: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
8090: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
80a0: 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
80b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
80c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
80d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
80e0: 20 26 26 20 73 71 6c 69 74 65 49 64 4c 69 73 74   && sqliteIdList
80f0: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
8100: 61 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a  a[i-1].pUsing, z
8110: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
8120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
8130: 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
8140: 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
8150: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
8170: 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
8180: 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
8190: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
81b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
81c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
81d0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
81e0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
81f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
8200: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
8210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8220: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
8230: 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  n.z = zName;.   
8240: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
8250: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
8260: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
8270: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
8280: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
8290: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
82a0: 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73  bName && pTabLis
82b0: 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
82c0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
82d0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
82e0: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8300: 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  pr = sqliteExpr(
8310: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
8320: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
8330: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
8340: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
8360: 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54  ft->token.z = zT
8370: 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  abName;.        
8380: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
8390: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54  en.n = strlen(zT
83a0: 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
83b0: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
83c0: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
83d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
83e0: 65 53 65 74 53 74 72 69 6e 67 28 28 63 68 61 72  eSetString((char
83f0: 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e  **)&pExpr->span.
8400: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22  z, zTabName, "."
8410: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
8420: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8430: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65  ->span.n = strle
8440: 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29  n(pExpr->span.z)
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 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
8470: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
8480: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
8490: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
84a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
84b0: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
84c0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
84d0: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
84e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8500: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8520: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
8530: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8550: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45    pNew = sqliteE
8560: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
8570: 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ew, pExpr, 0);. 
8580: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8590: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
85a0: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
85b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61           if( pNa
85c0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
85d0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
85e0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
85f0: 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 4e  h table: %T", pN
8600: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
8610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8620: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
8640: 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
8650: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8660: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
8670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8680: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
8690: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
86a0: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
86b0: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
86c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
86d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
86e0: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
86f0: 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53  ly unlinks the S
8700: 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70  elect.pSrc.a[].p
8710: 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  Tab pointers.** 
8720: 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75  in a select stru
8730: 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20  cture.  It just 
8740: 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72  sets the pointer
8750: 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  s to NULL.  This
8760: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72  .** routine is r
8770: 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20  ecursive in the 
8780: 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68  sense that if th
8790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
87a0: 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69  ].pSelect.** poi
87b0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
87c0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
87d0: 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
87e0: 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69  vely on that poi
87f0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
8800: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8810: 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74  ed on the Select
8820: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8830: 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45  defines a.** VIE
8840: 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e  W in order to un
8850: 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20  do any bindings 
8860: 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73  to tables.  This
8870: 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a   is necessary.**
8880: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74   because those t
8890: 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44  ables might be D
88a0: 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65  ROPed by a subse
88b0: 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e  quent SQL comman
88c0: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e  d..** If the bin
88d0: 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65  dings are not re
88e0: 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20  moved, then the 
88f0: 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d  Select.pSrc->a[]
8900: 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77  .pTab field.** w
8910: 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
8920: 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f  ting to a deallo
8930: 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72 75  cated Table stru
8940: 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65 0a  cture after the.
8950: 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f  ** DROP and a co
8960: 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75  redump will occu
8970: 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  r the next time 
8980: 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65 64  the VIEW is used
8990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
89a0: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
89b0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
89c0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
89d0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54  c = p->pSrc;.  T
89e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
89f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
8a00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
8a10: 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
8a20: 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
8a30: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  pSrc->a[i].pTab)
8a40: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
8a50: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
8a60: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
8a70: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
8a80: 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  0, pTab);.      
8a90: 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  }.      pSrc->a[
8aa0: 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  i].pTab = 0;.   
8ab0: 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
8ac0: 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ].pSelect ){.   
8ad0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
8ae0: 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b  tUnbind(pSrc->a[
8af0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
8b00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
8b10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8b20: 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20  tine associates 
8b30: 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52  entries in an OR
8b40: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8b50: 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63  n list with.** c
8b60: 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75  olumns in a resu
8b70: 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52  lt.  For each OR
8b80: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8b90: 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66  n, the opcode of
8ba0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
8bb0: 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l node is change
8bc0: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61  d to TK_COLUMN a
8bd0: 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76  nd the iColumn v
8be0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  alue of.** the t
8bf0: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
8c00: 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
8c10: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
8c20: 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20  d the iTable.** 
8c30: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70  value of the top
8c40: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
8c50: 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c  illed with iTabl
8c60: 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  e parameter..**.
8c70: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
8c80: 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61  prior SELECT cla
8c90: 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70  uses, they are p
8ca0: 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20  rocessed first. 
8cb0: 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61   A match.** in a
8cc0: 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54  n earlier SELECT
8cd0: 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63   takes precedenc
8ce0: 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53  e over a later S
8cf0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ELECT..**.** Any
8d00: 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73   entry that does
8d10: 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c   not match is fl
8d20: 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f  agged as an erro
8d30: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  r.  The number.*
8d40: 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72  * of errors is r
8d50: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
8d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8d70: 20 4e 4f 54 20 63 6f 72 72 65 63 74 6c 79 20 69   NOT correctly i
8d80: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 45 78  nitialize the Ex
8d90: 70 72 2e 64 61 74 61 54 79 70 65 20 20 66 69 65  pr.dataType  fie
8da0: 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 52 44  ld.** of the ORD
8db0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
8dc0: 73 2e 20 20 54 68 65 20 6d 75 6c 74 69 53 65 6c  s.  The multiSel
8dd0: 65 63 74 53 6f 72 74 4f 72 64 65 72 28 29 20 72  ectSortOrder() r
8de0: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 62  outine.** must b
8df0: 65 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  e called to do t
8e00: 68 61 74 20 61 66 74 65 72 20 74 68 65 20 69 6e  hat after the in
8e10: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 20  dividual select 
8e20: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68 61  statements.** ha
8e30: 76 65 20 61 6c 6c 20 62 65 65 6e 20 61 6e 61 6c  ve all been anal
8e40: 79 7a 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  yzed.  This rout
8e50: 69 6e 65 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ine is unable to
8e60: 20 63 6f 6d 70 75 74 65 20 45 78 70 72 2e 64 61   compute Expr.da
8e70: 74 61 54 79 70 65 0a 2a 2a 20 62 65 63 61 75 73  taType.** becaus
8e80: 65 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  e it must be cal
8e90: 6c 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 69  led before the i
8ea0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
8eb0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68   statements.** h
8ec0: 61 76 65 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65  ave been analyze
8ed0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8ee0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
8ef0: 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
8f00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8f10: 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c   /* A place to l
8f20: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
8f30: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
8f40: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
8f50: 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73   /* Match to res
8f60: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ult columns of t
8f70: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
8f80: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8f90: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
8fa0: 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74  RDER BY values t
8fb0: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
8fc0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
8fd0: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
8fe0: 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74       /* Insert t
8ff0: 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61  his value in iTa
9000: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
9010: 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20  tComplete       
9020: 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20   /* If TRUE all 
9030: 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d  ORDER BYs must m
9040: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
9050: 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74   nErr = 0;.  int
9060: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
9070: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
9080: 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20  ( pSelect==0 || 
9090: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
90a0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75  turn 1;.  if( mu
90b0: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
90c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
90d0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
90e0: 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  +){ pOrderBy->a[
90f0: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20  i].done = 0; }. 
9100: 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43   }.  if( fillInC
9110: 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65  olumnList(pParse
9120: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
9130: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9140: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
9150: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
9160: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
9170: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53  olumn(pParse, pS
9180: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70  elect->pPrior, p
9190: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
91a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
91b0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
91c0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
91d0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  ect->pEList;.  f
91e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
91f0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
9200: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
9210: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
9220: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43  Expr;.    int iC
9230: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  ol = -1;.    if(
9240: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
9250: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
9260: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
9270: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
9280: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
9290: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
92a0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
92b0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
92c0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
92d0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
92e0: 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f  ORDER BY positio
92f0: 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62  n %d should be b
9300: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
9310: 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  ,.          iCol
9320: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
9330: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
9340: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9360: 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65  f( !mustComplete
9370: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9380: 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d     iCol--;.    }
9390: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43  .    for(j=0; iC
93a0: 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74  ol<0 && j<pEList
93b0: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
93c0: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
93d0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28  >a[j].zName && (
93e0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
93f0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49   pE->op==TK_STRI
9400: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  NG) ){.        c
9410: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61  har *zName, *zLa
9420: 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  bel;.        zNa
9430: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  me = pEList->a[j
9440: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
9450: 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b   assert( pE->tok
9460: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20  en.z );.        
9470: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53  zLabel = sqliteS
9480: 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e  trNDup(pE->token
9490: 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pE->token.n)
94a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
94b0: 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b  Dequote(zLabel);
94c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
94d0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  iteStrICmp(zName
94e0: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
94f0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
9500: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
9510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
9520: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
9530: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
9540: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 45 78 70  l<0 && sqliteExp
9550: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
9560: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
9570: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
9580: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
9590: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
95a0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d  >=0 ){.      pE-
95b0: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
95c0: 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75  .      pE->iColu
95d0: 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
95e0: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
95f0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64  able;.      pOrd
9600: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
9610: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
9620: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73  f( iCol<0 && mus
9630: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
9640: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
9650: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
9660: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
9670: 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20   number %d does 
9680: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
9690: 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b  sult column", i+
96a0: 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  1);.      nErr++
96b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
96c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
96d0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
96e0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
96f0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
9700: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
9710: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
9720: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
9730: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9740: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
9750: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
9760: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
9770: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74  .Vdbe *sqliteGet
9780: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
9790: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
97a0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
97b0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
97c0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
97d0: 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  dbe = sqliteVdbe
97e0: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
97f0: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
9800: 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   v;.}../*.** Thi
9810: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
9820: 68 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65  he Expr.dataType
9830: 20 66 69 65 6c 64 20 6f 6e 20 61 6c 6c 20 65 6c   field on all el
9840: 65 6d 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65  ements of.** the
9850: 20 70 4f 72 64 65 72 42 79 20 65 78 70 72 65 73   pOrderBy expres
9860: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20  sion list.  The 
9870: 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 77 69  pOrderBy list wi
9880: 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ll have been.** 
9890: 73 65 74 20 75 70 20 62 79 20 6d 61 74 63 68 4f  set up by matchO
98a0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 29  rderbyToColumn()
98b0: 2e 20 20 48 65 6e 63 65 20 65 61 63 68 20 65 78  .  Hence each ex
98c0: 70 72 65 73 73 69 6f 6e 20 68 61 73 0a 2a 2a 20  pression has.** 
98d0: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 73 20 69  a TK_COLUMN as i
98e0: 74 73 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 20 54  ts root node.  T
98f0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
9900: 72 65 66 65 72 73 20 74 6f 20 61 20 0a 2a 2a 20  refers to a .** 
9910: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
9920: 73 75 6c 74 20 73 65 74 2e 20 20 20 54 68 65 20  sult set.   The 
9930: 64 61 74 61 74 79 70 65 20 69 73 20 73 65 74 20  datatype is set 
9940: 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  to SQLITE_SO_TEX
9950: 54 0a 2a 2a 20 69 66 20 74 68 65 20 63 6f 72 72  T.** if the corr
9960: 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
9970: 20 69 6e 20 70 20 61 6e 64 20 65 76 65 72 79 20   in p and every 
9980: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 6c 65  SELECT to the le
9990: 66 74 20 6f 66 0a 2a 2a 20 70 20 68 61 73 20 61  ft of.** p has a
99a0: 20 64 61 74 61 74 79 70 65 20 6f 66 20 53 51 4c   datatype of SQL
99b0: 49 54 45 5f 53 4f 5f 54 45 58 54 2e 20 20 49 66  ITE_SO_TEXT.  If
99c0: 20 74 68 65 20 63 6f 6f 72 65 73 73 70 6f 6e 64   the cooresspond
99d0: 69 6e 67 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e  ing column.** in
99e0: 20 70 20 6f 72 20 61 6e 79 20 6f 66 20 74 68 65   p or any of the
99f0: 20 6c 65 66 74 20 53 45 4c 45 43 54 73 20 69 73   left SELECTs is
9a00: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2c 20   SQLITE_SO_NUM, 
9a10: 74 68 65 6e 20 74 68 65 20 64 61 74 61 74 79 70  then the datatyp
9a20: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 72 64 65  e.** of the orde
9a30: 72 2d 62 79 20 65 78 70 72 65 73 73 69 6f 6e 20  r-by expression 
9a40: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
9a50: 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20 45  _SO_NUM..**.** E
9a60: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
9a70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9a80: 6f 6e 65 28 61 20 49 4e 54 45 47 45 52 2c 20 62  one(a INTEGER, b
9a90: 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20 20 43   TEXT);.**     C
9aa0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f 28  REATE TABLE two(
9ab0: 63 20 56 41 52 43 48 41 52 28 35 29 2c 20 64 20  c VARCHAR(5), d 
9ac0: 46 4c 4f 41 54 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  FLOAT);.**.**   
9ad0: 20 20 53 45 4c 45 43 54 20 62 2c 20 62 20 46 52    SELECT b, b FR
9ae0: 4f 4d 20 6f 6e 65 20 55 4e 49 4f 4e 20 53 45 4c  OM one UNION SEL
9af0: 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 74 77  ECT d, c FROM tw
9b00: 6f 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32 3b  o ORDER BY 1, 2;
9b10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 69 6d 61  .**.** The prima
9b20: 72 79 20 73 6f 72 74 20 6b 65 79 20 77 69 6c 6c  ry sort key will
9b30: 20 75 73 65 20 53 51 4c 49 54 45 5f 53 4f 5f 4e   use SQLITE_SO_N
9b40: 55 4d 20 62 65 63 61 75 73 65 20 74 68 65 20 22  UM because the "
9b50: 64 22 20 69 6e 0a 2a 2a 20 74 68 65 20 73 65 63  d" in.** the sec
9b60: 6f 6e 64 20 53 45 4c 45 43 54 20 69 73 20 6e 75  ond SELECT is nu
9b70: 6d 65 72 69 63 2e 20 20 54 68 65 20 31 73 74 20  meric.  The 1st 
9b80: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69  column of the fi
9b90: 72 73 74 20 53 45 4c 45 43 54 0a 2a 2a 20 69 73  rst SELECT.** is
9ba0: 20 74 65 78 74 20 62 75 74 20 74 68 61 74 20 64   text but that d
9bb0: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62  oes not matter b
9bc0: 65 63 61 75 73 65 20 61 20 6e 75 6d 65 72 69 63  ecause a numeric
9bd0: 20 61 6c 77 61 79 73 20 6f 76 65 72 72 69 64 65   always override
9be0: 73 0a 2a 2a 20 61 20 74 65 78 74 2e 0a 2a 2a 0a  s.** a text..**.
9bf0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 61 72 79  ** The secondary
9c00: 20 6b 65 79 20 77 69 6c 6c 20 75 73 65 20 74 68   key will use th
9c10: 65 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  e SQLITE_SO_TEXT
9c20: 20 73 6f 72 74 20 6f 72 64 65 72 20 62 65 63 61   sort order beca
9c30: 75 73 65 0a 2a 2a 20 62 6f 74 68 20 74 68 65 20  use.** both the 
9c40: 28 73 65 63 6f 6e 64 29 20 22 62 22 20 69 6e 20  (second) "b" in 
9c50: 74 68 65 20 66 69 72 73 74 20 53 45 4c 45 43 54  the first SELECT
9c60: 20 61 6e 64 20 74 68 65 20 22 63 22 20 69 6e 20   and the "c" in 
9c70: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 53 45  the second.** SE
9c80: 4c 45 43 54 20 68 61 76 65 20 61 20 64 61 74 61  LECT have a data
9c90: 74 79 70 65 20 6f 66 20 74 65 78 74 2e 0a 2a 2f  type of text..*/
9ca0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 75   .static void mu
9cb0: 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64  ltiSelectSortOrd
9cc0: 65 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 45 78  er(Select *p, Ex
9cd0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
9ce0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
9cf0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
9d00: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
9d10: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
9d20: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ( p==0 ){.    fo
9d30: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
9d40: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
9d50: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
9d60: 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 64 61 74 61  a[i].pExpr->data
9d70: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  Type = SQLITE_SO
9d80: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
9d90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d   return;.  }.  m
9da0: 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72  ultiSelectSortOr
9db0: 64 65 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  der(p->pPrior, p
9dc0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 45 4c 69  OrderBy);.  pELi
9dd0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
9de0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
9df0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9e00: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
9e10: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
9e20: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
9e30: 20 70 45 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53   pE->dataType==S
9e40: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 20 63  QLITE_SO_NUM ) c
9e50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
9e60: 65 72 74 28 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e  ert( pE->iColumn
9e70: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
9e80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 70 45 2d  EList->nExpr>pE-
9e90: 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
9ea0: 20 20 70 45 2d 3e 64 61 74 61 54 79 70 65 20 3d    pE->dataType =
9eb0: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
9ec0: 70 45 4c 69 73 74 2d 3e 61 5b 70 45 2d 3e 69 43  pEList->a[pE->iC
9ed0: 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 29 3b 0a 20  olumn].pExpr);. 
9ee0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9ef0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9f00: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
9f10: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
9f20: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
9f30: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
9f40: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
9f50: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
9f60: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
9f70: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
9f80: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
9f90: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
9fa0: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
9fb0: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
9fc0: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
9fd0: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
9fe0: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
9ff0: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
a000: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
a010: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
a020: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
a030: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
a040: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
a050: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
a060: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
a070: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
a080: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
a090: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
a0a0: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
a0b0: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
a0c0: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
a0d0: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
a0e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
a0f0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
a100: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
a110: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
a120: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
a130: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
a140: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
a150: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a160: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
a170: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
a180: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
a190: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
a1a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a1b0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
a1c0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
a1d0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31  SELECT c FROM t1
a1e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
a1f0: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
a200: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
a210: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
a220: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
a230: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
a240: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
a250: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
a260: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
a270: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
a280: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
a290: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
a2a0: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
a2b0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
a2c0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
a2d0: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
a2e0: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
a2f0: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
a300: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
a310: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
a320: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a330: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
a340: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 50  nt multiSelect(P
a350: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a360: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
a370: 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
a380: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a390: 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73        /* Success
a3a0: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
a3b0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
a3c0: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
a3d0: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
a3e0: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
a3f0: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
a400: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
a410: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
a420: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
a430: 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  E */..  /* Make 
a440: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
a450: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
a460: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
a470: 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20  s.  Only the .  
a480: 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69  ** last SELECT i
a490: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
a4a0: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
a4b0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  Y..  */.  if( p=
a4c0: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
a4d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a4e0: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
a4f0: 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  ior;.  if( pPrio
a500: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
a510: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
a520: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
a530: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
a540: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
a550: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
a560: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
a570: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75  ->op));.    retu
a580: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
a590: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
a5a0: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
a5b0: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
a5c0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
a5d0: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
a5e0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
a5f0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
a600: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
a610: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
a620: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
a630: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
a640: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
a650: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
a660: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
a670: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a680: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
a690: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73  rm, 0);.    eDes
a6a0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
a6b0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
a6c0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
a6d0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
a6e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
a6f0: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
a700: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
a710: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
a720: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
a730: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
a740: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
a750: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
a760: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
a770: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
a780: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a790: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 2d  n rc;.        p-
a7a0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
a7b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a7c0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
a7d0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
a7e0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
a7f0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
a800: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
a810: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a820: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
a840: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
a850: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
a860: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
a870: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
a880: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a890: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
a8a0: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
a8b0: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
a8c0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
a8d0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
a8e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
a8f0: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
a900: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
a910: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
a920: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
a930: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
a940: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
a950: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
a960: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
a970: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
a980: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
a990: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
a9a0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54  *pOrderBy;  /* T
a9b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
a9c0: 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  se for the right
a9d0: 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20   SELECT */..    
a9e0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
a9f0: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
aa00: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
aa10: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
aa20: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
aa30: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ->pOrderBy==0 ){
aa40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
aa50: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
aa60: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
aa70: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
aa80: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
aa90: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
aaa0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
aab0: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
aac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aad0: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
aae0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
aaf0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
ab00: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
ab10: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
ab20: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
ab30: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
ab40: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
ab50: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
ab60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
ab70: 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20  pOrderBy .      
ab80: 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62    && matchOrderb
ab90: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
aba0: 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
abb0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29  , unionTab, 1) )
abc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
abd0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
abe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
abf0: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
ac00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
ac10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
ac20: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
ac30: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
ac40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ac50: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
ac60: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20  unionTab, 1);.  
ac70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ac80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
ac90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
aca0: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
acb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
acc0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
acd0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
ace0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
acf0: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
ad00: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ad10: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
ad20: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
ad30: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
ad40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
ad50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ad60: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
ad70: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
ad80: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
ad90: 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63    */.      switc
ada0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
adb0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
adc0: 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45  EPT:  op = SRT_E
add0: 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a  xcept;   break;.
ade0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
adf0: 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53  _UNION:   op = S
ae00: 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65  RT_Union;    bre
ae10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
ae20: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70  e TK_ALL:     op
ae30: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20   = SRT_Table;   
ae40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ae50: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ae60: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  = 0;.      pOrde
ae70: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
ae80: 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  y;.      p->pOrd
ae90: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
aea0: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
aeb0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
aec0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
aed0: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
aee0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
aef0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
af00: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
af10: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
af20: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
af30: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
af40: 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
af50: 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
af60: 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
af70: 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
af80: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
af90: 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20  d..      */     
afa0: 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73   .      if( eDes
afb0: 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e  t!=priorOp || un
afc0: 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b  ionTab!=iParm ){
afd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
afe0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
aff0: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
b000: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
b010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65  .        if( eDe
b020: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
b030: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
b040: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
b050: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
b060: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
b070: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
b080: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
b090: 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73  ->pSrc, p->pELis
b0a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
b0b0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
b0c0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
b0d0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
b0e0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
b0f0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
b120: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
b130: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
b140: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
b150: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b160: 29 3b 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69  );.        multi
b170: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
b180: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  p, p->pOrderBy);
b190: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
b1a0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
b1b0: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
b1c0: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
b1d0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
b200: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
b210: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
b240: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b250: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b260: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 1;.        sql
b270: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b280: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
b290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b2a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
b2b0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
b2c0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
b2d0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
b2e0: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
b2f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b300: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b310: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
b320: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
b330: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
b340: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
b350: 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
b360: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
b370: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
b380: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b390: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b3a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b3b0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
b3c0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
b3d0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
b3e0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
b3f0: 74 61 72 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  tart;..      /* 
b400: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
b410: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
b420: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
b430: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
b440: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
b450: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
b460: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
b470: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
b480: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
b490: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
b4a0: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
b4b0: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
b4c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b4d0: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
b4e0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
b4f0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
b500: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
b510: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
b520: 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79  se,p,p->pOrderBy
b530: 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20  ,tab1,1) ){.    
b540: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b550: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b560: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b570: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31  P_OpenTemp, tab1
b580: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
b590: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b5a0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
b5b0: 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  1, 1);..      /*
b5c0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
b5d0: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
b5e0: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
b5f0: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
b600: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
b610: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
b620: 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f  se, pPrior, SRT_
b630: 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20  Union, tab1, 0, 
b640: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
b650: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b660: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
b670: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
b680: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
b690: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
b6a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
b6b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b6c0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
b6d0: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  b2, 1);.      sq
b6e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b6f0: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
b700: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ab2, 1);.      p
b710: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
b720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
b730: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
b740: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
b750: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b760: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
b770: 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
b780: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
b790: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
b7a0: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
b7b0: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
b7c0: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
b7d0: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
b7e0: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
b7f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b800: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
b810: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b820: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
b830: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
b840: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
b850: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
b860: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
b870: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
b880: 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70  e, p->pSrc, p->p
b890: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
b8a0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
b8b0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
b8c0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
b8d0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
b8e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b8f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b900: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
b910: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
b920: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
b930: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b940: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
b950: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
b960: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b970: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
b980: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
b990: 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72    multiSelectSor
b9a0: 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72  tOrder(p, p->pOr
b9b0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 72 63  derBy);.      rc
b9c0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
b9d0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
b9e0: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
b9f0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
ba00: 0a 20 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 70 2d                p-
ba20: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
ba30: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, 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 69 43 6f 6e 74             iCont
ba60: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ba70: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ba80: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
ba90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
baa0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
bab0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bac0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  p(v, OP_Next, ta
bad0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
bae0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
baf0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
bb00: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
bb10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bb20: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
bb30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
bb40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
bb50: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
bb60: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
bb70: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
bb80: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
bb90: 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  l(p, v, p->pELis
bba0: 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
bbb0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d   iParm);.      }
bbc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bbd0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
bbe0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
bbf0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
bc00: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
bc10: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
bc20: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
bc30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
bc40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
bc50: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
bc60: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
bc70: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
bc80: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
bc90: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
bca0: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
bcb0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
bcc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
bcd0: 20 7d 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61   }..  /* Issue a
bce0: 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69   null callback i
bcf0: 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74  f that is what t
bd00: 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20  he user wants.. 
bd10: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
bd20: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26 26  =SRT_Callback &&
bd30: 0a 20 20 20 20 28 70 50 61 72 73 65 2d 3e 75 73  .    (pParse->us
bd40: 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20  eCallback==0 || 
bd50: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
bd60: 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c  gs & SQLITE_Null
bd70: 43 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20 20  Callback)!=0).  
bd80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
bd90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
bda0: 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 45  lCallback, p->pE
bdb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
bdc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
bdd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
bde0: 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
bdf0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
be00: 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
be10: 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
be20: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
be30: 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
be40: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
be50: 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
be60: 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
be70: 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
be80: 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
be90: 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
bea0: 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
beb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
bec0: 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
bed0: 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
bee0: 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
bef0: 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
bf00: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
bf10: 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
bf20: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
bf30: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
bf40: 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
bf50: 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
bf60: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
bf70: 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
bf80: 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
bf90: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
bfa0: 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
bfb0: 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
bfc0: 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
bfd0: 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
bfe0: 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
bff0: 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
c000: 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
c010: 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
c020: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
c030: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
c040: 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
c050: 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78  ExprList*,int,Ex
c060: 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f  prList*);  /* Fo
c070: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
c080: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
c090: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
c0a0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
c0b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
c0c0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
c0d0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
c0e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
c0f0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
c100: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
c110: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
c120: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  0 ){.    Expr *p
c130: 4e 65 77 3b 0a 20 20 20 20 61 73 73 65 72 74 28  New;.    assert(
c140: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
c150: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
c160: 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
c170: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
c180: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
c190: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
c1a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
c1b0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70   );.    pNew = p
c1c0: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
c1d0: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
c1e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
c1f0: 21 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72  !=0 );.    pExpr
c200: 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
c210: 0a 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61  .    pExpr->data
c220: 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74  Type = pNew->dat
c230: 61 54 79 70 65 3b 0a 20 20 20 20 61 73 73 65 72  aType;.    asser
c240: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
c250: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c260: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45  >pLeft = sqliteE
c270: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65  xprDup(pNew->pLe
c280: 66 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ft);.    assert(
c290: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
c2a0: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
c2b0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
c2c0: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
c2d0: 67 68 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ght);.    assert
c2e0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
c2f0: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
c300: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  pList = sqliteEx
c310: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
c320: 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  pList);.    pExp
c330: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
c340: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 45  ->iTable;.    pE
c350: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
c360: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
c370: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
c380: 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20  pNew->iAgg;.    
c390: 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28  sqliteTokenCopy(
c3a0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
c3b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
c3c0: 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70    sqliteTokenCop
c3d0: 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20  y(&pExpr->span, 
c3e0: 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20  &pNew->span);.  
c3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
c400: 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  Expr(pExpr->pLef
c410: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
c420: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
c430: 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  r(pExpr->pRight,
c440: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
c450: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
c460: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
c470: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
c480: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
c490: 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c  void .substExprL
c4a0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
c4b0: 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  ist, int iTable,
c4c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c4d0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
c4e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
c4f0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
c500: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c510: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74   i++){.    subst
c520: 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Expr(pList->a[i]
c530: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
c540: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  pEList);.  }.}..
c550: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c560: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
c570: 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
c580: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
c590: 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
c5a0: 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
c5b0: 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
c5c0: 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
c5d0: 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
c5e0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
c5f0: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
c600: 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
c610: 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
c620: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
c630: 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
c640: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
c650: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
c660: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
c670: 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
c680: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
c690: 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
c6a0: 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
c6b0: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
c6c0: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
c6d0: 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
c6e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
c6f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
c700: 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
c710: 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
c720: 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
c730: 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
c740: 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
c750: 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
c760: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
c770: 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
c780: 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
c790: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
c7a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
c7b0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
c7c0: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
c7d0: 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
c7e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
c7f0: 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
c800: 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
c810: 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
c820: 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
c830: 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
c840: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
c850: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
c860: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
c870: 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
c880: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
c890: 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
c8a0: 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
c8b0: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
c8c0: 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
c8d0: 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
c8e0: 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
c8f0: 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
c900: 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
c910: 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
c920: 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
c930: 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
c940: 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
c950: 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
c960: 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
c970: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
c980: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
c990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
c9a0: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
c9b0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
c9c0: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
c9d0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
c9e0: 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
c9f0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
ca00: 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
ca10: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
ca20: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
ca30: 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
ca40: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
ca50: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
ca60: 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
ca70: 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
ca80: 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
ca90: 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
caa0: 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
cab0: 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
cac0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
cad0: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
cae0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
caf0: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
cb00: 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
cb10: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
cb20: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
cb30: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
cb40: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
cb50: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
cb60: 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
cb70: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
cb80: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
cb90: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
cba0: 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
cbb0: 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
cbc0: 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
cbd0: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
cbe0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
cbf0: 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
cc00: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
cc10: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
cc20: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
cc30: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
cc40: 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
cc50: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
cc60: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
cc70: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
cc80: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
cc90: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
cca0: 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
ccb0: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
ccc0: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
ccd0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
cce0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
ccf0: 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
cd00: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
cd10: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
cd20: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cd30: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
cd40: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
cd50: 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
cd60: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
cd70: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
cd80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cd90: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
cda0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
cdb0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
cdc0: 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
cdd0: 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
cde0: 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
cdf0: 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
ce00: 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
ce10: 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
ce20: 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
ce30: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
ce40: 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
ce50: 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
ce60: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
ce70: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
ce80: 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
ce90: 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
cea0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
ceb0: 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
cec0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
ced0: 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
cee0: 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
cef0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
cf00: 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
cf10: 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
cf20: 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
cf30: 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
cf40: 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
cf50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
cf60: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
cf70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
cf80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
cf90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
cfa0: 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
cfb0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
cfc0: 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
cfd0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
cfe0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
cff0: 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
d000: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
d010: 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
d020: 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
d030: 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
d040: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
d050: 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
d060: 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
d070: 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
d080: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
d090: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
d0a0: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
d0b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
d0c0: 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
d0d0: 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c  query" */.  SrcL
d0e0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
d0f0: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
d100: 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
d110: 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
d120: 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
d130: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
d140: 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
d150: 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
d160: 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
d170: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d180: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
d190: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
d1a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
d1b0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
d1c0: 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
d1d0: 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
d1e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45   */.  int i;.  E
d1f0: 78 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20  xpr *pWhere;..  
d200: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
d210: 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
d220: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
d230: 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
d240: 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  */.  if( p==0 ) 
d250: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
d260: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
d270: 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
d280: 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
d290: 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
d2a0: 70 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69  pSub = pSrc->a[i
d2b0: 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  From].pSelect;. 
d2c0: 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
d2d0: 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
d2e0: 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
d2f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d300: 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
d310: 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
d320: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
d330: 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
d340: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
d350: 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20  SubSrc );.  if( 
d360: 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
d370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d380: 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74  f( (pSub->isDist
d390: 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c  inct || pSub->nL
d3a0: 69 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53  imit>=0) &&  (pS
d3b0: 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
d3c0: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74  Agg) ){.     ret
d3d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
d3e0: 20 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20   (p->isDistinct 
d3f0: 7c 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  || p->nLimit>=0)
d400: 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
d410: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
d420: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
d430: 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
d440: 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  y ) return 0;.. 
d450: 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
d460: 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
d470: 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
d480: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
d490: 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
d4a0: 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
d4b0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
d4c0: 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
d4d0: 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
d4e0: 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
d4f0: 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
d500: 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
d510: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
d520: 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
d530: 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
d540: 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
d550: 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
d560: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
d570: 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
d580: 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
d590: 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
d5a0: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
d5b0: 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
d5c0: 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
d5d0: 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e  nSrc>1 && iFrom>
d5e0: 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
d5f0: 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
d600: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
d610: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d620: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
d630: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
d640: 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74  , it means flatt
d650: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
d660: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
d670: 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
d680: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
d690: 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e in the outer q
d6a0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  uery..  */..  /*
d6b0: 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65   Move all of the
d6c0: 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
d6d0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
d6e0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
d6f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
d700: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
d710: 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
d720: 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
d730: 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
d740: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
d750: 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
d760: 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
d770: 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
d780: 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
d790: 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
d7a0: 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
d7b0: 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
d7c0: 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
d7d0: 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
d7e0: 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
d7f0: 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
d800: 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
d810: 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
d820: 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
d830: 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
d840: 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
d850: 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
d860: 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
d870: 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  /.  iParent = pS
d880: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75  rc->a[iFrom].iCu
d890: 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
d8a0: 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
d8b0: 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
d8c0: 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
d8d0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
d8e0: 6e 74 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20  ntype;..    if( 
d8f0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
d900: 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69  Tab && pSrc->a[i
d910: 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72  From].pTab->isTr
d920: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
d930: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
d940: 6c 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46  le(0, pSrc->a[iF
d950: 72 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  rom].pTab);.    
d960: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
d970: 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  (pSrc->a[iFrom].
d980: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
d990: 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61 5b 69  teFree(pSrc->a[i
d9a0: 46 72 6f 6d 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20  From].zAlias);. 
d9b0: 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
d9c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
d9d0: 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20  tra = nSubSrc - 
d9e0: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  1;.      for(i=1
d9f0: 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
da00: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20  ){.        pSrc 
da10: 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  = sqliteSrcListA
da20: 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30  ppend(pSrc, 0, 0
da30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
da40: 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
da50: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72  .      for(i=pSr
da60: 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74  c->nSrc-1; i-ext
da70: 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b  ra>=iFrom; i--){
da80: 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61  .        pSrc->a
da90: 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d  [i] = pSrc->a[i-
daa0: 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a  extra];.      }.
dab0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
dac0: 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  0; i<nSubSrc; i+
dad0: 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  +){.      pSrc->
dae0: 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
daf0: 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
db00: 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
db10: 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
db20: 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
db30: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
db40: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62  rc->a[iFrom+nSub
db50: 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  Src-1].jointype 
db60: 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a  = jointype;.  }.
db70: 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20  .  /* Now begin 
db80: 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
db90: 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
dba0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
dbb0: 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
dbc0: 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
dbd0: 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
dbe0: 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ery..  ** .  ** 
dbf0: 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
dc00: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
dc10: 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
dc20: 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
dc30: 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
dc40: 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20  WHERE a>b;.  ** 
dc50: 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
dc60: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
dc70: 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
dc80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
dc90: 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c       /.  **    \
dca0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
dcb0: 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
dcc0: 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
dcd0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
dce0: 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c  /.  **.  ** We l
dcf0: 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
dd00: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
dd10: 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
dd20: 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
dd30: 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75  e.  ** "a" we su
dd40: 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
dd50: 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
dd60: 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
dd70: 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
dd80: 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70 72    */.  substExpr
dd90: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
dda0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
ddb0: 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74 20  EList);.  pList 
ddc0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  = p->pEList;.  f
ddd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
dde0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
ddf0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
de00: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
de10: 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28  i].zName==0 && (
de20: 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
de30: 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
de40: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  .z!=0 ){.      p
de50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
de60: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
de70: 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  (pExpr->span.z, 
de80: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  pExpr->span.n);.
de90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
dea0: 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62  isAgg ){.    sub
deb0: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  stExprList(p->pG
dec0: 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
ded0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
dee0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
def0: 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
df00: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
df10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  ;.  }.  if( pSub
df20: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
df30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
df40: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
df50: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  p->pOrderBy = pS
df60: 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
df70: 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
df80: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
df90: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
dfa0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
dfb0: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
dfc0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
dfd0: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  EList);.  }.  if
dfe0: 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
dff0: 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73  {.    pWhere = s
e000: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 53 75  qliteExprDup(pSu
e010: 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65  b->pWhere);.  }e
e020: 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20  lse{.    pWhere 
e030: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
e040: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
e050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e060: 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
e070: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d   p->pHaving = p-
e080: 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e  >pWhere;.    p->
e090: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
e0a0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
e0b0: 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
e0c0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
e0d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  );.    if( pSub-
e0e0: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
e0f0: 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20    Expr *pHaving 
e100: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
e110: 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  pSub->pHaving);.
e120: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
e130: 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
e140: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  p->pHaving = sql
e150: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
e160: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 48 61 76  p->pHaving, pHav
e170: 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ing, 0);.      }
e180: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
e190: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
e1a0: 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ng;.      }.    
e1b0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
e1c0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
e1d0: 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
e1e0: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
e1f0: 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70  Dup(pSub->pGroup
e200: 42 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  By);.  }else if(
e210: 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b   p->pWhere==0 ){
e220: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
e230: 20 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65   pWhere;.  }else
e240: 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
e250: 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  p->pWhere, iPare
e260: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
e270: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72  );.    if( pWher
e280: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57  e ){.      p->pW
e290: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
e2a0: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
e2b0: 65 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  ere, pWhere, 0);
e2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
e2d0: 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
e2e0: 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
e2f0: 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
e300: 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
e310: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
e320: 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
e330: 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
e340: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
e350: 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
e360: 6e 63 74 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73  nct;..  /* Trans
e370: 66 65 72 20 74 68 65 20 6c 69 6d 69 74 20 65 78  fer the limit ex
e380: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68  pression from th
e390: 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 74 68  e subquery to th
e3a0: 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
e3b0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ry..  */.  if( p
e3c0: 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29  Sub->nLimit>=0 )
e3d0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69  {.    if( p->nLi
e3e0: 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  mit<0 ){.      p
e3f0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
e400: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c  >nLimit;.    }el
e410: 73 65 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  se if( p->nLimit
e420: 2b 70 2d 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53  +p->nOffset > pS
e430: 75 62 2d 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d  ub->nLimit+pSub-
e440: 3e 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >nOffset ){.    
e450: 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53    p->nLimit = pS
e460: 75 62 2d 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75  ub->nLimit + pSu
e470: 62 2d 3e 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e  b->nOffset - p->
e480: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20  nOffset;.    }. 
e490: 20 7d 0a 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20   }.  p->nOffset 
e4a0: 2b 3d 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  += pSub->nOffset
e4b0: 3b 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  ;..  /* Finially
e4c0: 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
e4d0: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
e4e0: 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
e4f0: 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
e500: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 53 65 6c 65   */.  sqliteSele
e510: 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
e520: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
e530: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
e540: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e550: 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
e560: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
e570: 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
e580: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
e590: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
e5a0: 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
e5b0: 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
e5c0: 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
e5d0: 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
e5e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e5f0: 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
e600: 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
e610: 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
e620: 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
e630: 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
e640: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
e650: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
e660: 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
e670: 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
e680: 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
e690: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
e6a0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
e6b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
e6c0: 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
e6d0: 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
e6e0: 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
e6f0: 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
e700: 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
e710: 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
e720: 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
e730: 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
e740: 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
e750: 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
e760: 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
e770: 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
e780: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
e790: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
e7a0: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
e7b0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
e7c0: 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
e7d0: 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
e7e0: 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
e7f0: 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
e800: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
e810: 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
e820: 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
e830: 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 53 65   as for sqliteSe
e840: 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74  lect()..** See t
e850: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
e860: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
e870: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
e880: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
e890: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70  .static int simp
e8a0: 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61  leMinMaxQuery(Pa
e8b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
e8c0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73  ect *p, int eDes
e8d0: 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
e8e0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
e8f0: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c  int iCol;.  Tabl
e900: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
e910: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61   *pIdx;.  int ba
e920: 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  se;.  Vdbe *v;. 
e930: 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69   int seekOp;.  i
e940: 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c  nt cont;.  ExprL
e950: 69 73 74 20 65 4c 69 73 74 3b 0a 20 20 73 74 72  ist eList;.  str
e960: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e970: 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20 20  m eListItem;..  
e980: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
e990: 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
e9a0: 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
e9b0: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
e9c0: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
e9d0: 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
e9e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e9f0: 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
ea00: 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
ea10: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
ea20: 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53   if( p->pSrc->nS
ea30: 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
ea40: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
ea50: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
ea60: 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20  turn 0;.  pExpr 
ea70: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
ea80: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
ea90: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
eaa0: 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
eab0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
eac0: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  r->pList==0 || p
ead0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
eae0: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
eaf0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
eb00: 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
eb10: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
eb20: 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72  teStrNICmp(pExpr
eb30: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c  ->token.z,"min",
eb40: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
eb50: 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
eb60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
eb70: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70  iteStrNICmp(pExp
eb80: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
eb90: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
eba0: 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  ekOp = OP_Last;.
ebb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
ebc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78  urn 0;.  }.  pEx
ebd0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  pr = pExpr->pLis
ebe0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
ebf0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
ec00: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
ec10: 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70  rn 0;.  iCol = p
ec20: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
ec30: 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
ec40: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
ec50: 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
ec60: 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
ec70: 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
ec80: 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
ec90: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
eca0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
ecb0: 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
ecc0: 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
ecd0: 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
ece0: 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
ecf0: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
ed00: 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
ed10: 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
ed20: 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
ed30: 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
ed40: 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
ed50: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
ed60: 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
ed70: 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
ed80: 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
ed90: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
eda0: 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
edb0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
edc0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
edd0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ede0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
edf0: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
ee00: 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
ee10: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
ee20: 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b  0]==iCol ) break
ee30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ee40: 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
ee50: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64   0;.  }..  /* Id
ee60: 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
ee70: 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
ee80: 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c  e using the call
ee90: 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
eea0: 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
eeb0: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
eec0: 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
eed0: 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
eee0: 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ell..  */.  v = 
eef0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
ef00: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
ef10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ef20: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ef30: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
ef40: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ef50: 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  es(pParse, p->pS
ef60: 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  rc, p->pEList);.
ef70: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
ef80: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
ef90: 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  p->pSrc, p->pELi
efa0: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
efb0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
efc0: 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
efd0: 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
efe0: 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
eff0: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
f000: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
f010: 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
f020: 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
f030: 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
f040: 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
f050: 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
f060: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
f070: 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
f080: 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
f090: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
f0a0: 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
f0b0: 20 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69    sqliteCodeVeri
f0c0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
f0d0: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62   pTab->iDb);.  b
f0e0: 61 73 65 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  ase = p->pSrc->a
f0f0: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 73  [0].iCursor;.  s
f100: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f110: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
f120: 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73  ab->iDb, 0);.  s
f130: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f140: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62  , OP_OpenRead, b
f150: 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  ase, pTab->tnum)
f160: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
f170: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
f180: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
f190: 41 54 49 43 29 3b 0a 20 20 63 6f 6e 74 20 3d 20  ATIC);.  cont = 
f1a0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
f1b0: 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49  bel(v);.  if( pI
f1c0: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  dx==0 ){.    sql
f1d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f1e0: 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
f1f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
f200: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f210: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
f220: 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  dx->iDb, 0);.   
f230: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f240: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
f250: 20 62 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74   base+1, pIdx->t
f260: 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  num);.    sqlite
f270: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
f280: 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  -1, pIdx->zName,
f290: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
f2a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f2b0: 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
f2c0: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
f2d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f2e0: 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65  P_IdxRecno, base
f2f0: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
f300: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f310: 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c  P_Close, base+1,
f320: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
f330: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
f340: 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b  oveTo, base, 0);
f350: 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78  .  }.  eList.nEx
f360: 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74  pr = 1;.  memset
f370: 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20  (&eListItem, 0, 
f380: 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d  sizeof(eListItem
f390: 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20  ));.  eList.a = 
f3a0: 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c  &eListItem;.  eL
f3b0: 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  ist.a[0].pExpr =
f3c0: 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74   pExpr;.  select
f3d0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
f3e0: 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20  , p, &eList, 0, 
f3f0: 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c  0, 0, -1, eDest,
f400: 20 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f   iParm, cont, co
f410: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  nt);.  sqliteVdb
f420: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f430: 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
f440: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f450: 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
f460: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
f470: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f480: 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
f490: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
f4a0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
f4b0: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
f4c0: 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
f4d0: 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
f4e0: 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
f4f0: 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
f500: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
f510: 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
f520: 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
f570: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
f580: 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
f590: 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
f5a0: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
f5b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
f5c0: 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
f5d0: 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
f5e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
f5f0: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
f600: 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
f610: 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
f620: 79 73 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69  ys of a table wi
f630: 74 68 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a  th cursor iParm.
f640: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
f650: 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
f660: 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
f670: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
f680: 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
f690: 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
f6a0: 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
f6b0: 75 6c 74 73 20 66 6f 72 6d 20 74 68 65 20 74 65  ults form the te
f6c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
f6d0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
f6e0: 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
f6f0: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
f700: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
f710: 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
f720: 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
f730: 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
f740: 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
f750: 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
f760: 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
f770: 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
f780: 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
f790: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
f7a0: 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
f7b0: 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
f7c0: 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
f7d0: 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
f7e0: 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
f7f0: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
f800: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
f810: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
f820: 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
f830: 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
f840: 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
f850: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
f860: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
f870: 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
f880: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
f890: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
f8a0: 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
f8b0: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
f8c0: 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
f8d0: 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
f8e0: 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
f8f0: 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
f900: 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
f910: 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
f920: 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
f930: 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
f940: 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
f950: 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
f960: 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
f970: 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
f980: 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
f990: 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
f9a0: 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
f9b0: 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
f9c0: 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
f9d0: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
f9e0: 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
f9f0: 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
fa00: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
fa10: 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
fa20: 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
fa30: 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
fa40: 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
fa50: 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
fa60: 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
fa70: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
fa80: 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
fa90: 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
faa0: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
fab0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
fac0: 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
fad0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
fae0: 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
faf0: 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
fb00: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
fb10: 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
fb20: 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
fb30: 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
fb70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
fb80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
fb90: 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
fba0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
fbb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fbc0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
fbd0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
fbe0: 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
fbf0: 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
fc00: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
fc10: 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
fc20: 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
fc30: 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
fc40: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
fc50: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
fc60: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
fc70: 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
fc80: 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
fc90: 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
fca0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
fcb0: 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
fcc0: 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
fcd0: 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
fce0: 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
fcf0: 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
fd00: 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
fd10: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
fd20: 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
fd30: 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
fd40: 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
fd50: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20   sqliteSelect(. 
fd60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
fd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
fd80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
fd90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
fda0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fdb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fdc0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
fdd0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
fde0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
fdf0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
fe00: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
fe10: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
fe20: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
fe30: 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
fe40: 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
fe50: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
fe60: 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
fe70: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
fe80: 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
fe90: 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
fea0: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
feb0: 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
fec0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
fed0: 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
fee0: 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
fef0: 74 20 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20  t *pParentAgg   
ff00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
ff10: 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
ff20: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
ff30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
ff40: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
ff50: 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  nfo;.  Vdbe *v;.
ff60: 20 20 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b    int isAgg = 0;
ff70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
ff80: 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
ff90: 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
ffa0: 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
ffb0: 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
ffc0: 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
ffd0: 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
ffe0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
fff0: 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
10000 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
10010 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
10020 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
10030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
10040 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
10050 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
10060 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
10070 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
10080 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
10090 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
100a0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
100b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
100c0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
100d0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
100e0 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
100f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
10100 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
10110 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
10120 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20  t isDistinct;   
10130 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10140 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
10150 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
10160 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
10170 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
10180 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
10190 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
101a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
101b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
101c0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
101d0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
101e0 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c  on */..  if( sql
101f0 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
10200 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
10210 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75  r || p==0 ) retu
10220 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
10230 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
10240 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
10250 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
10260 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  turn 1;..  /* If
10270 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
10280 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
10290 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
102a0 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
102b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
102c0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
102d0 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
102e0 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
102f0 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   iParm);.  }..  
10300 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
10310 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
10320 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
10330 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
10340 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
10350 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
10360 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72  pWhere;.  pOrder
10370 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
10380 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
10390 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
103a0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
103b0 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  ng;.  isDistinct
103c0 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
103d0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
103e0 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f   VDBE cursors fo
103f0 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20  r each table in 
10400 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
10410 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 53 72 63    */.  sqliteSrc
10420 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
10430 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10440 73 74 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  st);..  /* .  **
10450 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
10460 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
10470 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
10480 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
10490 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
104a0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
104b0 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
104c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
104d0 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
104e0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70  t_end;..  /* Exp
104f0 61 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d  and any "*" term
10500 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
10510 73 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70  set.  (For examp
10520 6c 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20  le the "*" in.  
10530 2a 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  ** "SELECT * FRO
10540 4d 20 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c  M t1")  The fill
10550 49 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72  InColumnlist() r
10560 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
10570 20 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72   some.  ** other
10580 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20   housekeeping - 
10590 73 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  see the header c
105a0 6f 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69  omment for detai
105b0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66  ls..  */.  if( f
105c0 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
105d0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
105e0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
105f0 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20  d;.  }.  pWhere 
10600 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
10610 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
10620 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
10630 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
10640 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
10650 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
10660 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
10670 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
10680 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
10690 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
106a0 2a 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  */.  if( (eDest=
106b0 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
106c0 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
106d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
106e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
106f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
10700 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
10710 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
10720 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
10730 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
10740 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
10750 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
10760 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
10770 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67  * ORDER BY is ig
10780 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64  nored for some d
10790 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a  estinations..  *
107a0 2f 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  /.  switch( eDes
107b0 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
107c0 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73  T_Union:.    cas
107d0 65 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20  e SRT_Except:.  
107e0 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61    case SRT_Disca
107f0 72 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72  rd:.      pOrder
10800 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  By = 0;.      br
10810 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
10820 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
10830 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
10840 20 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c   point, we shoul
10850 64 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  d have allocated
10860 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73   all the cursors
10870 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65   that we.  ** ne
10880 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62  ed to handle sub
10890 71 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f  querys and tempo
108a0 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20  rary tables.  . 
108b0 20 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65   **.  ** Resolve
108c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
108d0 73 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e  s and do a seman
108e0 74 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c  tics check on al
108f0 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  l the expression
10900 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
10910 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
10920 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
10930 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
10940 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
10950 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69  TabList, 0, pELi
10960 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
10970 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
10980 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
10990 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
109a0 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
109b0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
109c0 70 72 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  pr, 1, &isAgg) )
109d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
109e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
109f0 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20   }.  if( pWhere 
10a00 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
10a10 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
10a20 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
10a30 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65  , pEList, pWhere
10a40 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
10a50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10a60 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
10a70 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
10a80 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20  , pWhere, 0, 0) 
10a90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
10aa0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
10ab0 20 20 20 20 73 71 6c 69 74 65 4f 72 61 63 6c 65      sqliteOracle
10ac0 38 4a 6f 69 6e 46 69 78 75 70 28 70 54 61 62 4c  8JoinFixup(pTabL
10ad0 69 73 74 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ist, pWhere);.  
10ae0 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20  }.  if( pHaving 
10af0 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  ){.    if( pGrou
10b00 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
10b10 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
10b20 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
10b30 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
10b40 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
10b50 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  ING");.      got
10b60 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10b70 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10b80 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
10b90 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
10ba0 74 2c 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69  t, pEList, pHavi
10bb0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
10bc0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10be0 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
10bf0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c 20  se, pHaving, 1, 
10c00 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20  &isAgg) ){.     
10c10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
10c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10c30 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
10c40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
10c50 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
10c60 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
10c70 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ol;.      Expr *
10c80 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
10c90 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
10ca0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
10cb0 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
10cc0 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26  ol) && iCol>0 &&
10cd0 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e   iCol<=pEList->n
10ce0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
10cf0 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
10d00 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
10d10 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
10d20 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
10d30 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
10d40 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
10d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10d60 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
10d70 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
10d80 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
10d90 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
10da0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
10db0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
10dc0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
10dd0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
10de0 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
10df0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10e00 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
10e10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
10e20 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
10e30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
10e40 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
10e50 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
10e60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10e70 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
10e80 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
10e90 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
10ea0 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  rms must not be 
10eb0 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73  non-integer cons
10ec0 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  tants");.       
10ed0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10ee0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
10ef0 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
10f00 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
10f10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
10f20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
10f30 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
10f40 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
10f50 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
10f60 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
10f70 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
10f80 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
10f90 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f  n 1 and %d", iCo
10fa0 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
10fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
10fc0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10fe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10ff0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
11000 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75  for(i=0; i<pGrou
11010 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pBy->nExpr; i++)
11020 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
11030 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
11040 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
11050 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
11060 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  f( sqliteExprIsI
11070 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
11080 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69  ) && iCol>0 && i
11090 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
110a0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
110b0 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
110c0 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  E);.        pE =
110d0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
110e0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78  pExpr = sqliteEx
110f0 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
11100 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
11110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11120 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
11130 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
11140 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
11150 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
11160 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11180 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
11190 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
111a0 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
111b0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
111c0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
111d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
111e0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
111f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11200 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
11210 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
11220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11230 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
11240 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
11250 20 22 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73   "GROUP BY terms
11260 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
11270 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
11280 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ts");.          
11290 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
112a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
112b0 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
112c0 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
112d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
112e0 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
112f0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
11300 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f 6c 75    "GROUP BY colu
11310 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74  mn number %d out
11320 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
11330 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
11340 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
11350 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70  and %d", iCol, p
11360 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
11370 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
11380 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11390 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
113a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
113b0 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
113c0 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
113d0 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
113e0 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
113f0 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
11400 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
11410 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
11420 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ry(pParse, p, eD
11430 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20  est, iParm) ){. 
11440 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67     rc = 0;.    g
11450 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11460 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
11470 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
11480 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
11490 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
114a0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
114b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
114c0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
114d0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
114e0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
114f0 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62   them in a callb
11500 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
11510 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
11520 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
11530 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f   going to some o
11540 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e  ther destination
11550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
11560 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
11570 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
11580 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
11590 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
115a0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
115b0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
115c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  .  */.  if( p->n
115d0 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20 20 20  Limit<=0 ){.    
115e0 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  p->nLimit = -1;.
115f0 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
11600 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11610 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
11620 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
11630 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11640 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
11650 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  p->nLimit, 0);. 
11660 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11670 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
11680 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
11690 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 69 4d 65   p->nLimit = iMe
116a0 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  m;.    if( p->nO
116b0 66 66 73 65 74 3c 3d 30 20 29 7b 0a 20 20 20 20  ffset<=0 ){.    
116c0 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30    p->nOffset = 0
116d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
116e0 20 20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65     iMem = pParse
116f0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
11700 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11710 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
11720 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29 3b 0a  p->nOffset, 0);.
11730 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11740 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
11750 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a  tore, iMem, 1);.
11760 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74        p->nOffset
11770 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20   = iMem;.    }. 
11780 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
11790 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
117a0 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
117b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
117c0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
117d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
117e0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
117f0 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
11800 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 6e 74  Context;.    int
11810 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
11820 65 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  ext;..    if( pT
11830 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
11840 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
11850 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ue;.    if( pTab
11860 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
11870 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
11880 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
11890 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
118a0 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
118b0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
118c0 74 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  t = pTabList->a[
118d0 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
118e0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
118f0 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
11900 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
11910 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
11920 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11930 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
11940 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
11950 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70  Select, SRT_Temp
11960 54 61 62 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  Table, .        
11970 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73           pTabLis
11980 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c  t->a[i].iCursor,
11990 20 70 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a   p, i, &isAgg);.
119a0 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74      if( needRest
119b0 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20  oreContext ){.  
119c0 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
119d0 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
119e0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
119f0 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
11a00 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
11a10 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
11a20 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
11a30 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20  t!=SRT_Union && 
11a40 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70  eDest!=SRT_Excep
11a50 74 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  t && eDest!=SRT_
11a60 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20  Discard ){.     
11a70 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11a80 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
11a90 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
11aa0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
11ab0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
11ac0 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
11ad0 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
11ae0 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nct;.  }..  /* C
11af0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
11b00 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
11b10 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66  y that can be "f
11b20 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69  lattened" into i
11b30 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20  ts parent..  ** 
11b40 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
11b50 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64   a possiblity, d
11b60 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  o so and return 
11b70 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20  immediately.  . 
11b80 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
11b90 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20  t && pParentAgg 
11ba0 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e  &&.      flatten
11bb0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
11bc0 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
11bd0 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
11be0 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
11bf0 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
11c00 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
11c10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11c20 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
11c30 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
11c40 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
11c50 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  a callback.  Thi
11c60 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
11c70 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
11c80 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
11c90 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f   a destination o
11ca0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  ther.  ** than a
11cb0 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a   callback..  */.
11cc0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11cd0 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
11ce0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
11cf0 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
11d00 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
11d10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
11d20 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
11d30 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
11d40 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
11d50 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
11d60 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
11d70 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
11d80 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11d90 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
11da0 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
11db0 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e  }..  /* Do an an
11dc0 61 6c 79 73 69 73 20 6f 66 20 61 67 67 72 65 67  alysis of aggreg
11dd0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  ate expressions.
11de0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 41 67  .  */.  sqliteAg
11df0 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
11e00 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
11e10 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42  isAgg || pGroupB
11e20 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
11e30 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30   pParse->nAgg==0
11e40 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20 3d 20   );.    isAgg = 
11e50 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
11e60 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
11e70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
11e80 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
11e90 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
11ea0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
11eb0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
11ec0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11ed0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11ee0 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75   }.    if( pGrou
11ef0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  pBy ){.      for
11f00 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
11f10 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11f20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
11f30 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
11f40 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
11f50 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
11f60 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
11f70 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11f80 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
11f90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11fa0 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71  f( pHaving && sq
11fb0 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
11fc0 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
11fd0 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
11fe0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11ff0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
12000 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
12010 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12020 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
12030 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
12040 66 28 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  f( sqliteExprAna
12050 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
12060 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
12070 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
12080 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
12090 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
120a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
120b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73   }.  }..  /* Res
120c0 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  et the aggregato
120d0 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  r.  */.  if( isA
120e0 67 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  gg ){.    sqlite
120f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12100 41 67 67 52 65 73 65 74 2c 20 30 2c 20 70 50 61  AggReset, 0, pPa
12110 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20 20  rse->nAgg);.    
12120 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
12130 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
12140 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46       FuncDef *pF
12150 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 28  unc;.      if( (
12160 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  pFunc = pParse->
12170 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21 3d  aAgg[i].pFunc)!=
12180 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e  0 && pFunc->xFin
12190 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
121a0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
121b0 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69  dOp(v, OP_AggIni
121c0 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20  t, 0, i);.      
121d0 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
121e0 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP3(v, -1, (cha
121f0 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49  r*)pFunc, P3_POI
12200 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NTER);.      }. 
12210 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
12220 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
12230 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12240 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
12250 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
12260 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12270 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
12280 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
12290 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
122a0 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
122b0 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
122c0 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
122d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
122e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
122f0 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
12300 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12310 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
12320 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a   iParm, 1);.  }.
12330 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d  .  /* Open a tem
12340 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
12350 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
12360 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
12370 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20   if( isDistinct 
12380 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  ){.    distinct 
12390 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
123a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
123b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
123c0 54 65 6d 70 2c 20 64 69 73 74 69 6e 63 74 2c 20  Temp, distinct, 
123d0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
123e0 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a   distinct = -1;.
123f0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
12400 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
12410 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20  n.  */.  pWInfo 
12420 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42 65 67  = sqliteWhereBeg
12430 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
12440 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  ist, pWhere, 0, 
12450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 70 47 72               pGr
12470 6f 75 70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72  oupBy ? 0 : &pOr
12480 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70 57  derBy);.  if( pW
12490 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
124a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
124b0 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
124c0 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20  d inner loop if 
124d0 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69  we are not deali
124e0 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67  ng with.  ** agg
124f0 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69  regates.  */.  i
12500 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20  f( !isAgg ){.   
12510 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72   if( selectInner
12520 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
12530 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
12540 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74  rderBy, distinct
12550 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , eDest,.       
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
12570 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  rm, pWInfo->iCon
12580 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  tinue, pWInfo->i
12590 42 72 65 61 6b 29 20 29 7b 0a 20 20 20 20 20 20  Break) ){.      
125a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
125b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
125c0 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c  * If we are deal
125d0 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61  ing with aggrega
125e0 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  tes, then do the
125f0 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61   special aggrega
12600 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  te.  ** processi
12610 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73  ng.  .  */.  els
12620 65 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  e{.    if( pGrou
12630 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
12640 20 6c 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72   lbl1;.      for
12650 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
12660 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12670 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
12680 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
12690 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
126a0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
126b0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
126c0 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
126d0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
126e0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
126f0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
12700 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71  e_format>=4 ) sq
12710 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 76  liteAddKeyType(v
12720 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
12730 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
12740 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
12750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
12760 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
12770 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29  gFocus, 0, lbl1)
12780 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
12790 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
127a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
127b0 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  f( pParse->aAgg[
127c0 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
127d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
127e0 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
127f0 73 65 2c 20 70 50 61 72 73 65 2d 3e 61 41 67 67  se, pParse->aAgg
12800 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
12810 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12820 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74  dOp(v, OP_AggSet
12830 2c 20 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  , 0, i);.      }
12840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
12850 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12860 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20   lbl1);.    }.  
12870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
12880 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b  rse->nAgg; i++){
12890 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
128a0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
128b0 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
128c0 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  >aAgg[i].isAgg )
128d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
128e0 20 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 41   pE = pParse->aA
128f0 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  gg[i].pExpr;.   
12900 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
12910 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
12920 4f 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ON );.      if( 
12930 70 45 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pE->pList ){.   
12940 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
12950 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
12960 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
12970 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
12980 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
12990 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
129a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
129b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
129c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
129d0 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
129e0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
129f0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 75  ddOp(v, OP_AggFu
12a00 6e 63 2c 20 30 2c 20 70 45 2d 3e 70 4c 69 73 74  nc, 0, pE->pList
12a10 20 3f 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45   ? pE->pList->nE
12a20 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
12a30 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12a40 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 21 3d 30  aAgg[i].pFunc!=0
12a50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12a60 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  ( pParse->aAgg[i
12a70 5d 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d  ].pFunc->xStep!=
12a80 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
12a90 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
12aa0 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 50 61 72   -1, (char*)pPar
12ab0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
12ac0 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a  c, P3_POINTER);.
12ad0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12ae0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
12af0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f   scan loop..  */
12b00 0a 20 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e  .  sqliteWhereEn
12b10 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
12b20 20 49 66 20 77 65 20 61 72 65 20 70 72 6f 63 65   If we are proce
12b30 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 73  ssing aggregates
12b40 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74  , we need to set
12b50 20 75 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f   up a second loo
12b60 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20  p.  ** over all 
12b70 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
12b80 20 76 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63   values and proc
12b90 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ess them..  */. 
12ba0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
12bb0 20 20 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73    int endagg = s
12bc0 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
12bd0 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73  el(v);.    int s
12be0 74 61 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61  tartagg;.    sta
12bf0 72 74 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64  rtagg = sqliteVd
12c00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
12c10 67 4e 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67  gNext, 0, endagg
12c20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75  );.    pParse->u
12c30 73 65 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69  seAgg = 1;.    i
12c40 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
12c50 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
12c60 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
12c70 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c  aving, startagg,
12c80 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
12c90 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
12ca0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
12cb0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
12cc0 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
12cd0 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
12ce0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
12cf0 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61  , startagg, enda
12d00 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
12d10 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
12d20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
12d30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
12d40 74 6f 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29  to, 0, startagg)
12d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
12d60 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
12d70 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  endagg);.    sql
12d80 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12d90 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a  OP_Noop, 0, 0);.
12da0 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
12db0 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
12dc0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
12dd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12de0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
12df0 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
12e00 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
12e10 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
12e20 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
12e30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
12e40 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
12e50 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c  erateSortTail(p,
12e60 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
12e70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
12e80 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 73 73  ;.  }...  /* Iss
12e90 75 65 20 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61  ue a null callba
12ea0 63 6b 20 69 66 20 74 68 61 74 20 69 73 20 77 68  ck if that is wh
12eb0 61 74 20 74 68 65 20 75 73 65 72 20 77 61 6e 74  at the user want
12ec0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  s..  */.  if( eD
12ed0 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
12ee0 6b 20 26 26 0a 20 20 20 20 28 70 50 61 72 73 65  k &&.    (pParse
12ef0 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30  ->useCallback==0
12f00 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 64 62 2d   || (pParse->db-
12f10 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
12f20 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30  NullCallback)!=0
12f30 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
12f40 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12f50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20 70  _NullCallback, p
12f60 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29  EList->nExpr, 0)
12f70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
12f80 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
12f90 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
12fa0 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
12fb0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
12fc0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
12fd0 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
12fe0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
12ff0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
13000 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
13010 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
13020 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
13030 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
13040 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
13050 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
13060 3a 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67  :.  sqliteAggreg
13070 61 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61  ateInfoReset(pPa
13080 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rse);.  return r
13090 63 3b 0a 7d 0a                                   c;.}.