/ Hex Artifact Content
Login

Artifact 7d69e569339e7ce9e672eb41d50a454110ea8a05:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 32 39  select.c,v 1.129
0200: 20 32 30 30 33 2f 30 33 2f 33 31 20 30 32 3a 31   2003/03/31 02:1
0210: 32 3a 34 37 20 64 72 68 20 45 78 70 20 24 0a 2a  2:47 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c  elect *sqliteSel
02a0: 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c 69  ectNew(.  ExprLi
02b0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
02c0: 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  /* which columns
02d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
02e0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53  he result */.  S
02f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
0300: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
0310: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
0320: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
0330: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0340: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  e,         /* th
0350: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
0360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
0370: 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65  roupBy,   /* the
0380: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0390: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
03a0: 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  ing,        /* t
03b0: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
03c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
03d0: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74  pOrderBy,   /* t
03e0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
03f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  se */.  int isDi
0400: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a  stinct,       /*
0410: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
0420: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
0430: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
0440: 74 20 6e 4c 69 6d 69 74 2c 20 20 20 20 20 20 20  t nLimit,       
0450: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
0460: 75 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  ue.  -1 means no
0470: 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t used */.  int 
0480: 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  nOffset         
0490: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
04a0: 65 2e 20 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 74  e.  -1 means not
04b0: 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65   used */.){.  Se
04c0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
04d0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
04e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
04f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0520: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0530: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
0540: 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Src);.    sqlite
0550: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
0560: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  e);.    sqliteEx
0570: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72  prListDelete(pGr
0580: 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
0590: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61  teExprDelete(pHa
05a0: 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
05b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
05c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c  pOrderBy);.  }el
05d0: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  se{.    pNew->pE
05e0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
05f0: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
0600: 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pSrc;.    pNew->
0610: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0620: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
0630: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
0640: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
0650: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
0660: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
0670: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
0680: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
0690: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20   = isDistinct;. 
06a0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b     pNew->op = TK
06b0: 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65  _SELECT;.    pNe
06c0: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  w->nLimit = nLim
06d0: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  it;.    pNew->nO
06e0: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
06f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
0700: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ew;.}../*.** Giv
0710: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0720: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0730: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0740: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0750: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0760: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0770: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0780: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0790: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
07a0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
07b0: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
07c0: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
07d0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  ER.**     JT_OUT
07e0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
07f0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0800: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0810: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0820: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0830: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0840: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0850: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0860: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0870: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0880: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0890: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
08a0: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
08b0: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
08c0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
08d0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
08e0: 20 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28   sqliteJoinType(
08f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0900: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0910: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0920: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0930: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0940: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0950: 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  *p;.  static str
0960: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
0970: 63 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a  char *zKeyword;.
0980: 20 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20      int nChar;. 
0990: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d     int code;.  }
09a0: 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a   keywords[] = {.
09b0: 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c      { "natural",
09c0: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d   7, JT_NATURAL }
09d0: 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20  ,.    { "left", 
09e0: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
09f0: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0a00: 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54  "right",   5, JT
0a10: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0a20: 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c  },.    { "full",
0a30: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0a40: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0a50: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72   },.    { "outer
0a60: 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52  ",   5, JT_OUTER
0a70: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72   },.    { "inner
0a80: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0a90: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73   },.    { "cross
0aa0: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0ab0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0ac0: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0ad0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0ae0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
0af0: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
0b00: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
0b10: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
0b20: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
0b30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
0b40: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0b50: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
0b60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
0b70: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
0b80: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
0b90: 20 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72      && sqliteStr
0ba0: 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77  NICmp(p->z, keyw
0bb0: 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64  ords[j].zKeyword
0bc0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
0bd0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
0be0: 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f  = keywords[j].co
0bf0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
0c00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
0c10: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65  .    if( j>=size
0c20: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
0c30: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
0c40: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
0c50: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
0c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0c70: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
0c80: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
0c90: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
0ca0: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
0cb0: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
0cc0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
0cd0: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
0ce0: 20 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64    static Token d
0cf0: 75 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b  ummy = { 0, 0 };
0d00: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20  .    char *zSp1 
0d10: 3d 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22  = " ", *zSp2 = "
0d20: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0d30: 30 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79  0 ){ pB = &dummy
0d40: 3b 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20  ; zSp1 = 0; }.  
0d50: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70    if( pC==0 ){ p
0d60: 43 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32  C = &dummy; zSp2
0d70: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69   = 0; }.    sqli
0d80: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
0d90: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
0da0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
0db0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0dc0: 3a 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70  : ", 0,.       p
0dd0: 41 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70  A->z, pA->n, zSp
0de0: 31 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d  1, 1, pB->z, pB-
0df0: 3e 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d  >n, zSp2, 1, pC-
0e00: 3e 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20  >z, pC->n, 0);. 
0e10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
0e20: 2b 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  +;.    jointype 
0e30: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
0e40: 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65  lse if( jointype
0e50: 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20   & JT_RIGHT ){. 
0e60: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
0e70: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
0e80: 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c   "RIGHT and FULL
0e90: 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65   OUTER JOINs are
0ea0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73   not currently s
0eb0: 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20  upported");.    
0ec0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
0ed0: 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NER;.  }.  retur
0ee0: 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f  n jointype;.}../
0ef0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0f00: 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d  index of a colum
0f10: 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52  n in a table.  R
0f20: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
0f30: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74  column.** is not
0f40: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
0f50: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
0f60: 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64  ic int columnInd
0f70: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ex(Table *pTab, 
0f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0f90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
0fa0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
0fb0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
0fc0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
0fd0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
0fe0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
0ff0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1000: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1010: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
1020: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
1030: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
1040: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
1050: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
1060: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
1070: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
1080: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
1090: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
10a0: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
10b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
10c0: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
10d0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
10e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
10f0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1100: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1110: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1120: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1130: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1140: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20   Expr **ppExpr  
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1160: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
1170: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
1180: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f  ssion */.){.  To
1190: 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70  ken dummy;.  Exp
11a0: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
11b0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
11c0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
11d0: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
11e0: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c    dummy.z = zCol
11f0: 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74  ;.  dummy.n = st
1200: 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75  rlen(zCol);.  du
1210: 6d 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70  mmy.dyn = 0;.  p
1220: 45 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72  E1a = sqliteExpr
1230: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1240: 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20  ummy);.  pE2a = 
1250: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
1260: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1270: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1280: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b1->zName;.  dum
1290: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
12a0: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d  mmy.z);.  pE1b =
12b0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
12c0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
12d0: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
12e0: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
12f0: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
1300: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
1310: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
1320: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1330: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1340: 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  teExpr(TK_DOT, p
1350: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1360: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78   pE2c = sqliteEx
1370: 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  pr(TK_DOT, pE2b,
1380: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1390: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
13a0: 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20  EQ, pE1c, pE2c, 
13b0: 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  0);.  ExprSetPro
13c0: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
13d0: 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20 2a 70  mJoin);.  if( *p
13e0: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70  pExpr ){.    *pp
13f0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70  Expr = sqliteExp
1400: 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70  r(TK_AND, *ppExp
1410: 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c  r, pE, 0);.  }el
1420: 73 65 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20  se{.    *ppExpr 
1430: 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = pE;.  }.}../*.
1440: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1450: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1460: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1470: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1480: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
1490: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
14a0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
14b0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
14c0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
14d0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
14e0: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
14f0: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1500: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1510: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1520: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
1530: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
1540: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
1550: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
1560: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
1570: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
1580: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
1590: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
15a0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
15b0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
15c0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
15d0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
15e0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
15f0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1600: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1610: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
1620: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
1630: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69  (Expr *p){.  whi
1640: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
1650: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
1660: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1670: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
1680: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d  >pLeft);.    p =
1690: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16b0: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
16c0: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
16d0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
16e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
16f0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1700: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1710: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1720: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1730: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
1740: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
1750: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
1760: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
1770: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1780: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1790: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
17a0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
17c0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
17d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
17e0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
17f0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  st *pSrc;.  int 
1800: 69 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70  i, j;.  pSrc = p
1810: 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
1820: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
1830: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  1; i++){.    str
1840: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1850: 20 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d   *pTerm = &pSrc-
1860: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
1870: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1880: 70 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e  pOther = &pSrc->
1890: 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28  a[i+1];..    if(
18a0: 20 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20   pTerm->pTab==0 
18b0: 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d  || pOther->pTab=
18c0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
18d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
18e0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
18f0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
1900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1910: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
1920: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
1930: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
1940: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
1950: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1960: 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  erm->jointype & 
1970: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
1980: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1990: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
19a0: 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e  ->pOn || pTerm->
19b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
19c0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
19d0: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
19e0: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
19f0: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
1a00: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
1a10: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
1a20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a40: 70 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54  pTab = pTerm->pT
1a50: 61 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ab;.      for(j=
1a60: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1a70: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
1a80: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
1a90: 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61  Other->pTab, pTa
1aa0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1ab0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1ac0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
1ad0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1ae0: 6d 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72  me, pTab, pOther
1af0: 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ->pTab, &p->pWhe
1b00: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
1b10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b20: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
1b30: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
1b40: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
1b50: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
1b60: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1b70: 4f 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73  On && pTerm->pUs
1b80: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
1b90: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
1ba0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
1bb0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1bc0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
1bd0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1be0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
1bf0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1c00: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
1c10: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
1c20: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
1c30: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
1c40: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
1c50: 64 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  d AND operator..
1c60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c70: 54 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  Term->pOn ){.   
1c80: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
1c90: 54 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Term->pOn);.    
1ca0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d    if( p->pWhere=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
1cc0: 3e 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d  >pWhere = pTerm-
1cd0: 3e 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  >pOn;.      }els
1ce0: 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57  e{.        p->pW
1cf0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
1d00: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
1d10: 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c  ere, pTerm->pOn,
1d20: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1d30: 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20     pTerm->pOn = 
1d40: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1d50: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
1d60: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
1d70: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
1d80: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
1d90: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
1da0: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
1db0: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
1dc0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1dd0: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
1de0: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
1df0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
1e00: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
1e10: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
1e20: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
1e30: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
1e40: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
1e50: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
1e60: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
1e70: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
1e80: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1e90: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
1ea0: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
1eb0: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
1ec0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1ed0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1ee0: 66 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67  f( pTerm->pUsing
1ef0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
1f00: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69   *pList;.      i
1f10: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1f20: 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  rt( i<pSrc->nSrc
1f30: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  -1 );.      pLis
1f40: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e  t = pTerm->pUsin
1f50: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
1f60: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
1f70: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1f80: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ( columnIndex(pT
1f90: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74  erm->pTab, pList
1fa0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20  ->a[j].zName)<0 
1fb0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ||.            c
1fc0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65  olumnIndex(pOthe
1fd0: 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e  r->pTab, pList->
1fe0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b  a[j].zName)<0 ){
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2000: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
2010: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
2020: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
2030: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
2040: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
2050: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
2060: 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  s", pList->a[j].
2070: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2080: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
20a0: 64 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74  dWhereTerm(pList
20b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[j].zName, pT
20c0: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65  erm->pTab, pOthe
20d0: 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68  r->pTab, &p->pWh
20e0: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2110: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
2120: 65 6e 74 73 20 61 20 6d 69 6e 69 6d 61 6c 20 4f  ents a minimal O
2130: 72 61 63 6c 65 38 20 6a 6f 69 6e 20 73 79 6e 74  racle8 join synt
2140: 61 78 20 69 6d 6d 75 6c 61 74 69 6f 6e 2e 0a 2a  ax immulation..*
2150: 2a 20 54 68 65 20 70 72 65 63 69 73 65 20 6f 72  * The precise or
2160: 61 63 6c 65 38 20 73 79 6e 74 61 78 20 69 73 20  acle8 syntax is 
2170: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  not implemented 
2180: 2d 20 69 74 20 69 73 20 65 61 73 79 20 65 6e 6f  - it is easy eno
2190: 75 67 68 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ugh.** to get th
21a0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 66 75  is routine confu
21b0: 73 65 64 2e 20 20 42 75 74 20 74 68 69 73 20 72  sed.  But this r
21c0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6d 61 6b 65  outine does make
21d0: 20 69 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   it possible.** 
21e0: 74 6f 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  to write a singl
21f0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2200: 74 68 61 74 20 64 6f 65 73 20 61 20 6c 65 66 74  that does a left
2210: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 6e 20 62   outer join in b
2220: 6f 74 68 0a 2a 2a 20 6f 72 61 63 6c 65 38 20 61  oth.** oracle8 a
2230: 6e 64 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a  nd in SQLite..**
2240: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2250: 20 6c 6f 6f 6b 73 20 66 6f 72 20 54 4b 5f 43 4f   looks for TK_CO
2260: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
2270: 6e 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 6d  nodes that are m
2280: 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  arked.** with th
2290: 65 20 45 50 5f 4f 72 61 63 6c 65 38 4a 6f 69 6e  e EP_Oracle8Join
22a0: 20 70 72 6f 70 65 72 74 79 2e 20 20 53 75 63 68   property.  Such
22b0: 20 6e 6f 64 65 73 20 61 72 65 20 67 65 6e 65 72   nodes are gener
22c0: 61 74 65 64 20 62 79 20 61 0a 2a 2a 20 63 6f 6c  ated by a.** col
22d0: 75 6d 6e 20 6e 61 6d 65 20 28 65 69 74 68 65 72  umn name (either
22e0: 20 22 63 6f 6c 75 6d 6e 22 20 6f 72 20 22 74 61   "column" or "ta
22f0: 62 6c 65 2e 63 6f 6c 75 6d 6e 22 29 20 74 68 61  ble.column") tha
2300: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t is followed by
2310: 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 61 6c 20  .** the special 
2320: 22 28 2b 29 22 20 6f 70 65 72 61 74 6f 72 2e 20  "(+)" operator. 
2330: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 66   If the table of
2340: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6d 61 72 6b   the column mark
2350: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 28  ed with.** the (
2360: 2b 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74  +) operator is t
2370: 68 65 20 73 65 63 6f 6e 64 20 61 72 65 20 73 75  he second are su
2380: 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 20 69  bsequent table i
2390: 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 0a 2a  n a join, then.*
23a0: 2a 20 74 68 61 74 20 74 61 62 6c 65 20 62 65 63  * that table bec
23b0: 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 20 74 61  omes the left ta
23c0: 62 6c 65 20 69 6e 20 61 20 4c 45 46 54 20 4f 55  ble in a LEFT OU
23d0: 54 45 52 20 4a 4f 49 4e 2e 20 20 54 68 65 20 65  TER JOIN.  The e
23e0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61  xpression.** tha
23f0: 74 20 75 73 65 73 20 74 68 61 74 20 74 61 62 6c  t uses that tabl
2400: 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f  e becomes part o
2410: 66 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  f the ON clause 
2420: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 2e 0a 2a 2a  for the join..**
2430: 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
2440: 61 6e 74 20 74 6f 20 65 6e 70 68 61 73 69 7a 65  ant to enphasize
2450: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f   that this is no
2460: 74 20 65 78 61 63 74 6c 79 20 68 6f 77 20 6f 72  t exactly how or
2470: 61 63 6c 65 38 0a 2a 2a 20 77 6f 72 6b 73 2e 20  acle8.** works. 
2480: 20 42 75 74 20 69 74 20 69 73 20 63 6c 6f 73 65   But it is close
2490: 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
24a0: 6f 6e 65 20 63 61 6e 20 63 6f 6e 73 74 72 75 63  one can construc
24b0: 74 20 71 75 65 72 69 65 73 20 74 68 61 74 0a 2a  t queries that.*
24c0: 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 63 6f 72 72  * will work corr
24d0: 65 63 74 6c 79 20 66 6f 72 20 62 6f 74 68 20 53  ectly for both S
24e0: 51 4c 69 74 65 20 61 6e 64 20 4f 72 61 63 6c 65  QLite and Oracle
24f0: 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  8..*/.static int
2500: 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a 6f   sqliteOracle8Jo
2510: 69 6e 46 69 78 75 70 28 0a 20 20 69 6e 74 20 62  inFixup(.  int b
2520: 61 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ase,         /* 
2530: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
2540: 65 72 20 66 6f 72 20 66 69 72 73 74 20 74 61 62  er for first tab
2550: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
2560: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
2570: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
2580: 6c 65 73 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  les being joined
2590: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
25a0: 72 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  re      /* The W
25b0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
25c0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
25d0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
25e0: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78  rc = 0;.  if( Ex
25f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
2600: 68 65 72 65 2c 20 45 50 5f 4f 72 61 63 6c 65 38  here, EP_Oracle8
2610: 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
2620: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
2630: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2640: 70 57 68 65 72 65 2d 3e 69 54 61 62 6c 65 20 2d  pWhere->iTable -
2650: 20 62 61 73 65 3b 0a 20 20 20 20 61 73 73 65 72   base;.    asser
2660: 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2670: 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
2680: 20 20 20 69 66 28 20 69 64 78 3e 30 20 29 7b 0a     if( idx>0 ){.
2690: 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 64        pSrc->a[id
26a0: 78 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 3d  x-1].jointype &=
26b0: 20 7e 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 20 20   ~JT_INNER;.    
26c0: 20 20 70 53 72 63 2d 3e 61 5b 69 64 78 2d 31 5d    pSrc->a[idx-1]
26d0: 2e 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f  .jointype |= JT_
26e0: 4f 55 54 45 52 7c 4a 54 5f 4c 45 46 54 3b 0a 20  OUTER|JT_LEFT;. 
26f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2700: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2710: 57 68 65 72 65 2d 3e 70 52 69 67 68 74 20 29 7b  Where->pRight ){
2720: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2730: 4f 72 61 63 6c 65 38 4a 6f 69 6e 46 69 78 75 70  Oracle8JoinFixup
2740: 28 62 61 73 65 2c 20 70 53 72 63 2c 20 70 57 68  (base, pSrc, pWh
2750: 65 72 65 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  ere->pRight);.  
2760: 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 2d 3e  }.  if( pWhere->
2770: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 72 63 20  pLeft ){.    rc 
2780: 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38  |= sqliteOracle8
2790: 4a 6f 69 6e 46 69 78 75 70 28 62 61 73 65 2c 20  JoinFixup(base, 
27a0: 70 53 72 63 2c 20 70 57 68 65 72 65 2d 3e 70 4c  pSrc, pWhere->pL
27b0: 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
27c0: 70 57 68 65 72 65 2d 3e 70 4c 69 73 74 20 29 7b  pWhere->pList ){
27d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
27e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
27f0: 3d 20 70 57 68 65 72 65 2d 3e 70 4c 69 73 74 3b  = pWhere->pList;
2800: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2810: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20  pList->nExpr && 
2820: 72 63 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  rc==0; i++){.   
2830: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 4f     rc |= sqliteO
2840: 72 61 63 6c 65 38 4a 6f 69 6e 46 69 78 75 70 28  racle8JoinFixup(
2850: 62 61 73 65 2c 20 70 53 72 63 2c 20 70 4c 69 73  base, pSrc, pLis
2860: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
2870: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2880: 72 63 3d 3d 31 20 26 26 20 28 70 57 68 65 72 65  rc==1 && (pWhere
2890: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20  ->op==TK_AND || 
28a0: 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 45  pWhere->op==TK_E
28b0: 51 29 20 29 7b 0a 20 20 20 20 73 65 74 4a 6f 69  Q) ){.    setJoi
28c0: 6e 45 78 70 72 28 70 57 68 65 72 65 29 3b 0a 20  nExpr(pWhere);. 
28d0: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20     rc = 0;.  }. 
28e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2900: 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72  given Select str
2910: 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f  ucture and all o
2920: 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  f its substructu
2930: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
2940: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
2950: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
2960: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
2970: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73  .  sqliteExprLis
2980: 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69 73  tDelete(p->pELis
2990: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 72 63 4c  t);.  sqliteSrcL
29a0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 72  istDelete(p->pSr
29b0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  c);.  sqliteExpr
29c0: 44 65 6c 65 74 65 28 70 2d 3e 70 57 68 65 72 65  Delete(p->pWhere
29d0: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c  );.  sqliteExprL
29e0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72  istDelete(p->pGr
29f0: 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  oupBy);.  sqlite
2a00: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48  ExprDelete(p->pH
2a10: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
2a20: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2a30: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
2a40: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
2a50: 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  e(p->pPrior);.  
2a60: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 53  sqliteFree(p->zS
2a70: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2a80: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2a90: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 61 67 67  * Delete the agg
2aa0: 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2ab0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  on from the pars
2ac0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2ae0: 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
2af0: 65 73 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  eset(Parse *pPar
2b00: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  se){.  sqliteFre
2b10: 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b  e(pParse->aAgg);
2b20: 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20  .  pParse->aAgg 
2b30: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
2b40: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
2b50: 65 2d 3e 75 73 65 41 67 67 20 3d 20 30 3b 0a 7d  e->useAgg = 0;.}
2b60: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2b70: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2b80: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2b90: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2ba0: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2bb0: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2bc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2bd0: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2be0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2bf0: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2c00: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
2c10: 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72 64 65 72  char *zSortOrder
2c20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 7a 53 6f  ;.  int i;.  zSo
2c30: 72 74 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65  rtOrder = sqlite
2c40: 4d 61 6c 6c 6f 63 28 20 70 4f 72 64 65 72 42 79  Malloc( pOrderBy
2c50: 2d 3e 6e 45 78 70 72 20 2b 20 31 20 29 3b 0a 20  ->nExpr + 1 );. 
2c60: 20 69 66 28 20 7a 53 6f 72 74 4f 72 64 65 72 3d   if( zSortOrder=
2c70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
2c80: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
2c90: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
2ca0: 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 20 3d  .    int order =
2cb0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
2cc0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69  sortOrder;.    i
2cd0: 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 69 6e 74  nt type;.    int
2ce0: 20 63 3b 0a 20 20 20 20 69 66 28 20 28 6f 72 64   c;.    if( (ord
2cf0: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
2d00: 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45  YPEMASK)==SQLITE
2d10: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
2d20: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2d30: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  SO_TEXT;.    }el
2d40: 73 65 20 69 66 28 20 28 6f 72 64 65 72 20 26 20  se if( (order & 
2d50: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
2d60: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  SK)==SQLITE_SO_N
2d70: 55 4d 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65  UM ){.      type
2d80: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
2d90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2da0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
2db0: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
2dc0: 20 20 20 20 74 79 70 65 20 3d 20 73 71 6c 69 74      type = sqlit
2dd0: 65 45 78 70 72 54 79 70 65 28 70 4f 72 64 65 72  eExprType(pOrder
2de0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  By->a[i].pExpr);
2df0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e00: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2e10: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 0a 20 20  SO_NUM;.    }.  
2e20: 20 20 69 66 28 20 28 6f 72 64 65 72 20 26 20 53    if( (order & S
2e30: 51 4c 49 54 45 5f 53 4f 5f 44 49 52 4d 41 53 4b  QLITE_SO_DIRMASK
2e40: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  )==SQLITE_SO_ASC
2e50: 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 74 79   ){.      c = ty
2e60: 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45  pe==SQLITE_SO_TE
2e70: 58 54 20 3f 20 27 41 27 20 3a 20 27 2b 27 3b 0a  XT ? 'A' : '+';.
2e80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e90: 20 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54   c = type==SQLIT
2ea0: 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27 44 27 20  E_SO_TEXT ? 'D' 
2eb0: 3a 20 27 2d 27 3b 0a 20 20 20 20 7d 0a 20 20 20  : '-';.    }.   
2ec0: 20 7a 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d   zSortOrder[i] =
2ed0: 20 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78   c;.    sqliteEx
2ee0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2ef0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2f00: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 7a 53 6f 72  xpr);.  }.  zSor
2f10: 74 4f 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d  tOrder[pOrderBy-
2f20: 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 73  >nExpr] = 0;.  s
2f30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2f40: 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79  , OP_SortMakeKey
2f50: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
2f60: 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56  r, 0);.  sqliteV
2f70: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
2f80: 31 2c 20 7a 53 6f 72 74 4f 72 64 65 72 2c 20 73  1, zSortOrder, s
2f90: 74 72 6c 65 6e 28 7a 53 6f 72 74 4f 72 64 65 72  trlen(zSortOrder
2fa0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  ));.  sqliteFree
2fb0: 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20  (zSortOrder);.  
2fc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2fd0: 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30  v, OP_SortPut, 0
2fe0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
2ff0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
3000: 20 61 20 50 33 20 61 72 67 75 6d 65 6e 74 20 74   a P3 argument t
3010: 6f 20 74 68 65 20 6c 61 73 74 20 56 44 42 45 20  o the last VDBE 
3020: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 61 73 0a  opcode that was.
3030: 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20 54 68 65  ** inserted. The
3040: 20 50 33 20 61 72 67 75 6d 65 6e 74 20 61 64 64   P3 argument add
3050: 65 64 20 69 73 20 61 20 73 74 72 69 6e 67 20 73  ed is a string s
3060: 75 69 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  uitable for the 
3070: 0a 2a 2a 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 6f  .** OP_MakeKey o
3080: 72 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20  r OP_MakeIdxKey 
3090: 6f 70 63 6f 64 65 73 2e 20 20 54 68 65 20 73 74  opcodes.  The st
30a0: 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f 66  ring consists of
30b0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 27  .** characters '
30c0: 74 27 20 6f 72 20 27 6e 27 20 64 65 70 65 6e 64  t' or 'n' depend
30d0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
30e0: 72 20 6e 6f 74 20 74 68 65 20 76 61 72 69 6f 75  r not the variou
30f0: 73 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74  s.** fields of t
3100: 68 65 20 6b 65 79 20 74 6f 20 62 65 20 67 65 6e  he key to be gen
3110: 65 72 61 74 65 64 20 73 68 6f 75 6c 64 20 62 65  erated should be
3120: 20 74 72 65 61 74 65 64 20 61 73 20 6e 75 6d 65   treated as nume
3130: 72 69 63 0a 2a 2a 20 6f 72 20 61 73 20 74 65 78  ric.** or as tex
3140: 74 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d  t.  See the OP_M
3150: 61 6b 65 4b 65 79 20 61 6e 64 20 4f 50 5f 4d 61  akeKey and OP_Ma
3160: 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 0a  keIdxKey opcode.
3170: 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ** documentation
3180: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
3190: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
31a0: 74 20 74 68 65 20 50 33 20 73 74 72 69 6e 67 2e  t the P3 string.
31b0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
31c0: 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79   sqliteAddIdxKey
31d0: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
31e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
31f0: 64 4b 65 79 54 79 70 65 28 56 64 62 65 20 2a 76  dKeyType(Vdbe *v
3200: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
3210: 73 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  st){.  int nColu
3220: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
3230: 70 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  pr;.  char *zTyp
3240: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
3250: 28 20 6e 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ( nColumn+1 );. 
3260: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 54   int i;.  if( zT
3270: 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ype==0 ) return;
3280: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
3290: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
32a0: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 73 71 6c 69   zType[i] = sqli
32b0: 74 65 45 78 70 72 54 79 70 65 28 70 45 4c 69 73  teExprType(pELis
32c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d  t->a[i].pExpr)==
32d0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 3f 20  SQLITE_SO_NUM ? 
32e0: 27 6e 27 20 3a 20 27 74 27 3b 0a 20 20 7d 0a 20  'n' : 't';.  }. 
32f0: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 30 3b 0a 20   zType[i] = 0;. 
3300: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
3310: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65  eP3(v, -1, zType
3320: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71  , nColumn);.  sq
3330: 6c 69 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b  liteFree(zType);
3340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3350: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
3360: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
3370: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
3380: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
3390: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
33a0: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
33b0: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
33c0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
33d0: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
33e0: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
33f0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
3400: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
3410: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
3420: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
3430: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
3440: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
3450: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
3460: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
3470: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
3480: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
3490: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
34a0: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
34b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
34c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
34d0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
34e0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3500: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
3510: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3520: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
3530: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
3540: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
3550: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
3560: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
3570: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
3580: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
3590: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
35a0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
35b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
35c0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
35d0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  in the source ta
35e0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
35f0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3600: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
3610: 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73   sort results us
3620: 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a  ing this key */.
3630: 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20    int distinct, 
3640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
3650: 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72  >=0, make sure r
3660: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69  esults are disti
3670: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  nct */.  int eDe
3680: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
3690: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
36a0: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
36b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
36c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
36d0: 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  * An argument to
36e0: 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65   the disposal me
36f0: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  thod */.  int iC
3700: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
3710: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3720: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
3730: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
3740: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
3750: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
3760: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
3770: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
3780: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
3790: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
37a0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  e;.  int i;..  i
37b0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
37c0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   0;.  assert( pE
37d0: 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  List!=0 );..  /*
37e0: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
37f0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
3800: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
3810: 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68  ment, then do th
3820: 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20  e check.  ** to 
3830: 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20  see if this row 
3840: 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74  should be output
3850: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
3860: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
3870: 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30  if( p->nOffset>0
3880: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
3890: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  dr = sqliteVdbeC
38a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
38b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
38c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
38d0: 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 2c 20  cr, p->nOffset, 
38e0: 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 73  addr+2);.      s
38f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3900: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
3910: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
3920: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69      if( p->nLimi
3930: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t>=0 ){.      sq
3940: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3950: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
3960: 6e 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  nLimit, iBreak);
3970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3980: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
3990: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
39a0: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
39b0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
39c0: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
39d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
39e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
39f0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
3a00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
3a10: 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  {.    nColumn = 
3a20: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3a30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
3a40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3a50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
3a60: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3a70: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3a80: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3a90: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3aa0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3ab0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3ac0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3ad0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3ae0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3af0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3b00: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3b10: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3b20: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3b30: 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 3e  .  if( distinct>
3b40: 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26 26 20  =0 && pEList && 
3b50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
3b60: 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41  ){.#if NULL_ALWA
3b70: 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20  YS_DISTINCT.    
3b80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3b90: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 70  v, OP_IsNull, -p
3ba0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 73 71  EList->nExpr, sq
3bb0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
3bc0: 64 64 72 28 76 29 2b 37 29 3b 0a 23 65 6e 64 69  ddr(v)+7);.#endi
3bd0: 66 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  f.    sqliteVdbe
3be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
3bf0: 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Key, pEList->nEx
3c00: 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
3c10: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
3c20: 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c  _format>=4 ) sql
3c30: 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 76 2c  iteAddKeyType(v,
3c40: 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
3c50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3c60: 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69   OP_Distinct, di
3c70: 73 74 69 6e 63 74 2c 20 73 71 6c 69 74 65 56 64  stinct, sqliteVd
3c80: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3c90: 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  +3);.    sqliteV
3ca0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3cb0: 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  op, pEList->nExp
3cc0: 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  r+1, 0);.    sql
3cd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3ce0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
3cf0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
3d00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3d10: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
3d20: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3d30: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3d40: 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  rKey, distinct, 
3d50: 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  0);.  }..  switc
3d60: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
3d70: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
3d80: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
3d90: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
3da0: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
3db0: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
3dc0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3dd0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
3de0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
3df0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3e00: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3e10: 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41  olumn, NULL_ALWA
3e20: 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20  YS_DISTINCT);.  
3e30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3e40: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
3e50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
3e60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3e70: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
3e80: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3ea0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
3eb0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
3ec0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
3ed0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
3ee0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
3ef0: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
3f00: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
3f10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f20: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3f30: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3f40: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3f50: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
3f60: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3f70: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3f90: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3fa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
3fb0: 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  cno, iParm, 0);.
3fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3fd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3fe0: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
3ff0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4000: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
4010: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
4020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4030: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4040: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
4050: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
4060: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
4070: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
4080: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
4090: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
40a0: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
40b0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
40c0: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
40d0: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
40e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
40f0: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
4100: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4110: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
4120: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4130: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4140: 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59  lumn, NULL_ALWAY
4150: 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20  S_DISTINCT);.   
4160: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4170: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
4180: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
4190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
41a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
41b0: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29  elete, iParm, 0)
41c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
41d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
41e0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
41f0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
4200: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
4210: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
4220: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
4230: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
4240: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
4250: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
4260: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
4270: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
4280: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
4290: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
42a0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
42b0: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
42c0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
42d0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
42e0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
42f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4300: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
4310: 4e 75 6c 6c 2c 20 2d 31 2c 20 6c 62 6c 29 3b 0a  Null, -1, lbl);.
4320: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4330: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
4340: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4350: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
4360: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4380: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4390: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
43a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
43b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
43c0: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
43d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
43e0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
43f0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
4400: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4410: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
4420: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
4430: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
4440: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
4450: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
4460: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
4470: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
4480: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
4490: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
44a0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
44b0: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
44c0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
44d0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
44e0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
44f0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4500: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
4510: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4520: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
4530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
4550: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4560: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
4570: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4580: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4590: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
45a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
45b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
45c0: 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61    /* Send the da
45d0: 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ta to the callba
45e0: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ck function..   
45f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4600: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
4610: 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a 20  ase SRT_Sorter: 
4620: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
4630: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4640: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4650: 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52 65  v, OP_SortMakeRe
4660: 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  c, nColumn, 0);.
4670: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4680: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4690: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
46a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
46b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
46c0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 3b  =SRT_Callback );
46d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
46e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
46f0: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
4700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
4710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4720: 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ..    /* Invoke 
4730: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
4740: 68 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c  handle the resul
4750: 74 73 2e 20 20 54 68 65 20 73 75 62 72 6f 75 74  ts.  The subrout
4760: 69 6e 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ine itself.    *
4770: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
4780: 20 66 6f 72 20 70 6f 70 70 69 6e 67 20 74 68 65   for popping the
4790: 20 72 65 73 75 6c 74 73 20 6f 66 66 20 6f 66 20   results off of 
47a0: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
47b0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
47c0: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
47d0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
47e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
47f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4800: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4810: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4820: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4830: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
4840: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
4850: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4860: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4870: 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72  P_Gosub, 0, iPar
4880: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
4890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
48a0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
48b0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
48c0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
48d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
48e0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
48f0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
4900: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
4910: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
4920: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
4930: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
4940: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4950: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
4960: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4970: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4980: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4990: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
49a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
49b0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
49c0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
49d0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
49e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
49f0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4a00: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4a10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4a20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4a30: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
4a40: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
4a50: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
4a60: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
4a70: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
4a80: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
4a90: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
4aa0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
4ab0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
4ac0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
4ad0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
4ae0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
4af0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
4b00: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
4b10: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
4b20: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
4b30: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
4b40: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
4b50: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 53 65 6c  eSortTail(.  Sel
4b60: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4b70: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4b80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
4b90: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
4ba0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4bb0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
4bc0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4bd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4be0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
4bf0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
4c00: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4c10: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
4c20: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
4c30: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
4c40: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
4c50: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4c60: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4c70: 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c 69 74 65  int end = sqlite
4c80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4c90: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
4ca0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4cb0: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
4cc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4cd0: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c  p(v, OP_Sort, 0,
4ce0: 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71   0);.  addr = sq
4cf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4d00: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4d10: 20 65 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e   end);.  if( p->
4d20: 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  nOffset>0 ){.   
4d30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4d40: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
4d50: 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 61 64 64 72  p->nOffset, addr
4d60: 2b 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  +4);.    sqliteV
4d70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4d80: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
4d90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4da0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
4db0: 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dr);.  }.  if( p
4dc0: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
4dd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4de0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
4df0: 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 65 6e 64  , p->nLimit, end
4e00: 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  );.  }.  switch(
4e10: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
4e20: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4e30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   {.      sqliteV
4e40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4e50: 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  ortCallback, nCo
4e60: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4e70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4e80: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4e90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
4ea0: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
4eb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4ec0: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
4ed0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
4ee0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4ef0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
4f00: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4f10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4f20: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
4f30: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4f40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4f50: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4f60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4f70: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4f80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4f90: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31  v, OP_IsNull, -1
4fa0: 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  , sqliteVdbeCurr
4fb0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4fc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4fd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
4fe0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
4ff0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5000: 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c  v, OP_PutStrKey,
5010: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
5020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5030: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
5040: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5050: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5060: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5070: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
5080: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
5090: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
50a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
50b0: 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 20 20 20  , 0, end);.     
50c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
50d0: 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f    case SRT_Subro
50e0: 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
50f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
5100: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
5110: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
5120: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5130: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69   OP_Column, -1-i
5140: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
5150: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5160: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
5170: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
5180: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5190: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
51a0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
51b0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
51c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
51d0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
51e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
51f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65    }.  sqliteVdbe
5200: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5210: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  , 0, addr);.  sq
5220: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5230: 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20  abel(v, end);.  
5240: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5250: 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65 74 2c  v, OP_SortReset,
5260: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
5270: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5280: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
5290: 65 20 56 44 42 45 20 74 68 65 20 64 61 74 61 74  e VDBE the datat
52a0: 79 70 65 73 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  ypes of.** colum
52b0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
52c0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   set..**.** This
52d0: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 67 65   routine only ge
52e0: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 69 66 20  nerates code if 
52f0: 74 68 65 20 22 50 52 41 47 4d 41 20 73 68 6f 77  the "PRAGMA show
5300: 5f 64 61 74 61 74 79 70 65 73 3d 6f 6e 22 0a 2a  _datatypes=on".*
5310: 2a 20 68 61 73 20 62 65 65 6e 20 65 78 65 63 75  * has been execu
5320: 74 65 64 2e 20 20 54 68 65 20 64 61 74 61 74 79  ted.  The dataty
5330: 70 65 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  pes are reported
5340: 20 6f 75 74 20 69 6e 20 74 68 65 20 61 7a 43 6f   out in the azCo
5350: 6c 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 74  l.** parameter t
5360: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
5370: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69  unction.  The fi
5380: 72 73 74 20 4e 20 61 7a 43 6f 6c 5b 5d 20 65 6e  rst N azCol[] en
5390: 74 72 69 65 73 0a 2a 2a 20 61 72 65 20 74 68 65  tries.** are the
53a0: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
53b0: 6c 75 6d 6e 73 2c 20 61 6e 64 20 74 68 65 20 73  lumns, and the s
53c0: 65 63 6f 6e 64 20 4e 20 65 6e 74 72 69 65 73 20  econd N entries 
53d0: 61 72 65 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  are the.** datat
53e0: 79 70 65 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  ypes for the col
53f0: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  umns..**.** The 
5400: 22 64 61 74 61 74 79 70 65 22 20 66 6f 72 20 61  "datatype" for a
5410: 20 72 65 73 75 6c 74 20 74 68 61 74 20 69 73 20   result that is 
5420: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 79  a column of a ty
5430: 70 65 20 69 73 20 74 68 65 0a 2a 2a 20 64 61 74  pe is the.** dat
5440: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
5450: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5460: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5470: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54   statement..** T
5480: 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  he datatype for 
5490: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
54a0: 20 65 69 74 68 65 72 20 54 45 58 54 20 6f 72 20   either TEXT or 
54b0: 4e 55 4d 45 52 49 43 2e 20 20 54 68 65 0a 2a 2a  NUMERIC.  The.**
54c0: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 20   datatype for a 
54d0: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
54e0: 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69  NTEGER..*/.stati
54f0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
5500: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
5510: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5520: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5530: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  ext */.  int bas
5540: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
5550: 56 44 42 45 20 63 75 72 73 6f 72 20 63 6f 72 72  VDBE cursor corr
5560: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 66 69 72  esponding to fir
5570: 73 74 20 65 6e 74 72 79 20 69 6e 20 70 54 61 62  st entry in pTab
5580: 4c 69 73 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  List */.  SrcLis
5590: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
55a0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
55b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
55c0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
55d0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
55e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
55f0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5600: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5620: 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62  pParse->useCallb
5630: 61 63 6b 20 26 26 20 28 70 50 61 72 73 65 2d 3e  ack && (pParse->
5640: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5650: 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 29 3d  TE_ReportTypes)=
5660: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5670: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
5680: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
5690: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
56a0: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
56b0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 68  i].pExpr;.    ch
56c0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
56d0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
56e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
56f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
5700: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
5710: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
5720: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5730: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
5740: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ].pTab;.      in
5750: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
5760: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 69  umn;.      if( i
5770: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
5780: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
5790: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
57a0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
57b0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
57c0: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
57d0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
57e0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
57f0: 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ER";.      }else
5800: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
5810: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
5820: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
5830: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5840: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
5850: 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54 45  rType(p)==SQLITE
5860: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
5870: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
5880: 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  T";.      }else{
5890: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
58a0: 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20 20   "NUMERIC";.    
58b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
58c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
58d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
58e0: 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  i + pEList->nExp
58f0: 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
5900: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
5910: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50 33 5f 53   -1, zType, P3_S
5920: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  TATIC);.  }.}../
5930: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
5940: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
5950: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
5960: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
5970: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
5980: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
5990: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
59a0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
59b0: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6f 6c 75 65  * azCol[] vaolue
59c0: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
59d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
59e0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
59f0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
5a00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5a10: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5a20: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
5a30: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
5a40: 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
5a50: 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65 6e  ding to first en
5a60: 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20  try in pTabList 
5a70: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
5a80: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
5a90: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
5aa0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5ab0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
5ac0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
5ad0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
5ae0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5af0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5b00: 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
5b10: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
5b20: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
5b30: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
5b40: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
5b50: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
5b60: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
5b70: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5b80: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
5b90: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  p;.    char *zTy
5ba0: 70 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  pe = 0;.    int 
5bb0: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a 20  showFullNames;. 
5bc0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
5bd0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
5be0: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
5bf0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
5c00: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
5c10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
5c20: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
5c30: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
5c40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5c50: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
5c60: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
5c70: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5c80: 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  3(v, -1, zName, 
5c90: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
5ca0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
5cb0: 20 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 46 75      }.    showFu
5cc0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72 73  llNames = (pPars
5cd0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
5ce0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
5cf0: 65 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  es)!=0;.    if( 
5d00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
5d10: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
5d20: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
5d30: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5d40: 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73 65  p->iTable - base
5d50: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68  ].pTab;.      ch
5d60: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
5d70: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
5d80: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
5d90: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
5da0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
5db0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
5dc0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
5dd0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
5de0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
5df0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
5e00: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57      zCol = "_ROW
5e10: 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7a 54  ID_";.        zT
5e20: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
5e30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5e40: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
5e50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
5e60: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 54 79  ame;.        zTy
5e70: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5e80: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
5e90: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5ea0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
5eb0: 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68 6f  pan.z[0] && !sho
5ec0: 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  wFullNames ){.  
5ed0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
5ee0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5ef0: 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  (v,OP_ColumnName
5f00: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
5f10: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5f20: 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73 70  eP3(v, -1, p->sp
5f30: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
5f40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5f50: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
5f60: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
5f70: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
5f80: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  List->nSrc>1 || 
5f90: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b  showFullNames ){
5fa0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
5fb0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
5fc0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
5fd0: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
5fe0: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69 54  TabList->a[p->iT
5ff0: 61 62 6c 65 20 2d 20 62 61 73 65 5d 2e 7a 41 6c  able - base].zAl
6000: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ias;.        if(
6010: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 7c   showFullNames |
6020: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
6030: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
6050: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
6060: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
6070: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
6080: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6090: 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69  OP_ColumnName, i
60a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
60b0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
60c0: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
60d0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
60e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
60f0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
6100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6110: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6120: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
6130: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
6140: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6150: 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c 20  P3(v, -1, zCol, 
6160: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6170: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
6180: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
6190: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
61a0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
61b0: 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f 6c  beAddOp(v,OP_Col
61c0: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a  umnName, i, 0);.
61d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
61e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
61f0: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
6200: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  an.n);.      sql
6210: 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53  iteVdbeCompressS
6220: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  pace(v, addr);. 
6230: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6240: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
6250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6260: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
6270: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
6280: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
6290: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
62a0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
62b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
62c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
62d0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  i, 0);.      sql
62e0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
62f0: 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73 74  v, -1, zName, st
6300: 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20  rlen(zName));.  
6310: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
6320: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
6330: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
6340: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
6350: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
6360: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6370: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
6380: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
6390: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
63a0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
63b0: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
63c0: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
63d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
63e0: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
63f0: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
6400: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6410: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
6420: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
6430: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
6440: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
6450: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
6460: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
6470: 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn z;.}../*.** F
6480: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
6490: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
64a0: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
64b0: 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74  t(Parse*, Select
64c0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  *);../*.** Given
64d0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
64e0: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
64f0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
6500: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
6510: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
6520: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
6530: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
6540: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
6550: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
6560: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
6570: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
6580: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
6590: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  b;.  int i;.  Ex
65a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
65b0: 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c  .  if( fillInCol
65c0: 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20  umnList(pParse, 
65d0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
65e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
65f0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
6600: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
6610: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
6620: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6630: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
6640: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
6650: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
6660: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
6670: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
6680: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
6690: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
66a0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
66b0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
66c0: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
66d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
66e0: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
66f0: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
6700: 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  l );.  for(i=0; 
6710: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
6720: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
6730: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
6740: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
6750: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
6760: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
6770: 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  eStrDup(pEList->
6780: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
6790: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70 45   }else if( (p=pE
67a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
67b0: 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  )->span.z && p->
67c0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
67d0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
67e0: 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ing(&pTab->aCol[
67f0: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70 61  i].zName, p->spa
6800: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c 20  n.z, p->span.n, 
6810: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
6820: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
6830: 26 26 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20  && p->pRight && 
6840: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
6850: 2e 7a 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  .z &&.          
6860: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
6870: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
6880: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
6890: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  (&pTab->aCol[i].
68a0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
68b0: 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f     p->pRight->to
68c0: 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69 67 68 74  ken.z, p->pRight
68d0: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
68e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
68f0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
6900: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
6910: 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  f, "column%d", i
6920: 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  +1);.      pTab-
6930: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  >aCol[i].zName =
6940: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 42   sqliteStrDup(zB
6950: 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  uf);.    }.  }. 
6960: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
6970: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  1;.  return pTab
6980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
6990: 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
69a0: 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74 68  statement, do th
69b0: 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a 2a  ree things..**.*
69c0: 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20 69  *    (1)  Fill i
69d0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
69e0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
69f0: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
6a00: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
6a10: 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74 20  defines the set 
6a20: 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73  of tables that s
6a30: 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65 64  hould be scanned
6a40: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  . .**.**    (2) 
6a50: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
6a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6a70: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
6a80: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
6a90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
6aa0: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
6ab0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
6ac0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
6ad0: 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74 68      (3)  Scan th
6ae0: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
6af0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
6b00: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
6b10: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
6b20: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
6b30: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
6b40: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
6b50: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
6b60: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
6b70: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
6b80: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
6b90: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
6ba0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
6bb0: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
6bc0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
6bd0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
6be0: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
6bf0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
6c00: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
6c10: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
6c20: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
6c30: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
6c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6c50: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
6c60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6c70: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
6c80: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
6c90: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6ca0: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
6cb0: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
6cc0: 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d  *pTab;..  if( p=
6cd0: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
6ce0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
6cf0: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
6d00: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
6d10: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c  >pEList;..  /* L
6d20: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
6d30: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
6d40: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  list..  */.  for
6d50: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
6d60: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
6d70: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6d80: 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20  a[i].pTab ){.   
6d90: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
6da0: 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
6db0: 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e!  No need to c
6dc0: 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20  ontinue */.     
6dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6de0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
6df0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
6e00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
6e10: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
6e20: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
6e30: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
6e40: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
6e50: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21  t->a[i].pSelect!
6e60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
6e70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6e80: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
6e90: 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61      char zFakeNa
6ea0: 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20  me[60];.        
6eb0: 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d  sprintf(zFakeNam
6ec0: 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  e, "sqlite_subqu
6ed0: 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20  ery_%p_",.      
6ee0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62       (void*)pTab
6ef0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
6f00: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
6f10: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 54  iteSetString(&pT
6f20: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
6f30: 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20  ias, zFakeName, 
6f40: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
6f50: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
6f60: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
6f70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65          sqliteRe
6f80: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
6f90: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
6fa0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
6fe0: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
6ff0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7000: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7010: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7020: 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72 61       pTab->isTra
7030: 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  nsient = 1;.    
7040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
7050: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
7060: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
7070: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7080: 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 4c  e */.      pTabL
7090: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  ist->a[i].pTab =
70a0: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
70b0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
70c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
70d0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
70e0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
7110: 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[i].zDatabase)
7120: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7130: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
7140: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
7150: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
7160: 61 62 6c 65 3a 20 25 53 22 2c 20 70 54 61 62 4c  able: %S", pTabL
7170: 69 73 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  ist, i);.       
7180: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7190: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61   }.      if( pTa
71a0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
71b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
71c0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
71d0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
71e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
71f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
7200: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
7210: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
7220: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
7230: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
7240: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
7250: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c  lect = sqliteSel
7260: 65 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65  ectDup(pTab->pSe
7270: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
7280: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
7290: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
72a0: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
72b0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
72c0: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
72d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
72e0: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
72f0: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
7300: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
7310: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
7320: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
7330: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
7340: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
7350: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
7360: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
7370: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
7380: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
7390: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
73a0: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
73b0: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
73c0: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
73d0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
73e0: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
73f0: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
7400: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
7410: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
7420: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
7430: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
7440: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
7450: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
7460: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
7470: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
7480: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
7490: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
74a0: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
74b0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
74c0: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
74d0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
74e0: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
74f0: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
7500: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
7510: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
7520: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7530: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
7540: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
7550: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
7560: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
7570: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
7580: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
7590: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
75a0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
75b0: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
75c0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
75d0: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
75e0: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
75f0: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
7600: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
7610: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
7620: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
7630: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
7640: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
7650: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
7660: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
7670: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
7680: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
7690: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
76a0: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
76b0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
76c0: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
76d0: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
76e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
76f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7700: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
7710: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
7720: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 66 6f  pNew = 0;.    fo
7730: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
7740: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
7750: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61      Expr *pE = a
7760: 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
7770: 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
7780: 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20  ALL &&.         
7790: 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f    (pE->op!=TK_DO
77a0: 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d  T || pE->pRight=
77b0: 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  =0 || pE->pRight
77c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
77d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
77e0: 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
77f0: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
7800: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
7810: 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
7820: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
7830: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
7840: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
7850: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
7860: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
7870: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
7880: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
7890: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
78a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
78b0: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
78c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
78d0: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
78e0: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
78f0: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
7900: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
7910: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
7920: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
7930: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
7940: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
7950: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
7960: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  hes */.        T
7970: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
7980: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
7990: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
79a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
79b0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
79c0: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
79d0: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
79e0: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
79f0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
7a00: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d  {.          pNam
7a10: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
7a20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
7a30: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
7a40: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
7a50: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
7a60: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
7a70: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
7a80: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
7a90: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
7aa0: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
7ab0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
7ac0: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
7ad0: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
7ae0: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
7af0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7b00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7b10: 20 20 20 69 66 28 20 70 4e 61 6d 65 20 26 26 20     if( pName && 
7b20: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
7b30: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
7b40: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
7b50: 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43      sqliteStrNIC
7b60: 6d 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61  mp(pName->z, zTa
7b70: 62 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29  bName, pName->n)
7b80: 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  !=0 ||.         
7b90: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
7ba0: 5b 70 4e 61 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29  [pName->n]!=0) )
7bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7bc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7bd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
7be0: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
7bf0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7c00: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
7c10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
7c20: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
7c30: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
7c40: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7c50: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
7c60: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
7c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
7c80: 30 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e  0 && (pTabList->
7c90: 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  a[i-1].jointype 
7ca0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
7cb0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
7cc0: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
7cd0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
7ce0: 2e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  .pTab, zName)>=0
7cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7d00: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
7d10: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
7d20: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
7d30: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
7d40: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
7d50: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7d70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7d80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
7d90: 20 69 66 28 20 69 3e 30 20 26 26 20 73 71 6c 69   if( i>0 && sqli
7da0: 74 65 49 64 4c 69 73 74 49 6e 64 65 78 28 70 54  teIdListIndex(pT
7db0: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70  abList->a[i-1].p
7dc0: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
7dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7de0: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
7df0: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
7e00: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
7e10: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
7e20: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
7e30: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
7e40: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7e50: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
7e60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7e70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7e80: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
7e90: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
7ea0: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
7eb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
7ec0: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
7ee0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e  ht->token.z = zN
7ef0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
7f00: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
7f10: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
7f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  ;.            pR
7f30: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  ight->token.dyn 
7f40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
7f50: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
7f60: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
7f70: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
7f80: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
7f90: 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  eExpr(TK_ID, 0, 
7fa0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
7fb0: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
7fc0: 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  iteExpr(TK_DOT, 
7fd0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
7fe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7ff0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
8000: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
8010: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
8020: 6e 2e 7a 20 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a  n.z = zTabName;.
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
8040: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  eft->token.n = s
8050: 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 3b  trlen(zTabName);
8060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8070: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Left->token.dyn 
8080: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
8090: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
80a0: 6e 67 28 28 63 68 61 72 2a 2a 29 26 70 45 78 70  ng((char**)&pExp
80b0: 72 2d 3e 73 70 61 6e 2e 7a 2c 20 7a 54 61 62 4e  r->span.z, zTabN
80c0: 61 6d 65 2c 20 22 2e 22 2c 20 7a 4e 61 6d 65 2c  ame, ".", zName,
80d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
80e0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
80f0: 20 3d 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d   = strlen(pExpr-
8100: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  >span.z);.      
8110: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
8120: 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
8130: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8140: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8160: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
8170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8180: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
8190: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
81a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
81b0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
81c0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
81d0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
81e0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8200: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
8210: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
8220: 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70  ppend(pNew, pExp
8230: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
8240: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8250: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
8260: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
8270: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
8280: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8290: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
82a0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
82b0: 20 25 54 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20   %T", pName);.  
82c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
82d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
82e0: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
82f0: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
8300: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
8310: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8320: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
8330: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
8340: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69      sqliteExprLi
8350: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
8360: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
8370: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
8380: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8390: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
83a0: 65 63 75 72 73 69 76 65 6c 79 20 75 6e 6c 69 6e  ecursively unlin
83b0: 6b 73 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  ks the Select.pS
83c0: 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70 6f 69 6e  rc.a[].pTab poin
83d0: 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20 73 65 6c  ters.** in a sel
83e0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
83f0: 49 74 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  It just sets the
8400: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 4e 55 4c   pointers to NUL
8410: 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  L.  This.** rout
8420: 69 6e 65 20 69 73 20 72 65 63 75 72 73 69 76 65  ine is recursive
8430: 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
8440: 61 74 20 69 66 20 74 68 65 20 53 65 6c 65 63 74  at if the Select
8450: 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65 6c 65 63  .pSrc.a[].pSelec
8460: 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 73 20  t.** pointer is 
8470: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69 73 20 72  not NULL, this r
8480: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8490: 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
84a0: 74 68 61 74 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  that pointer..**
84b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
84c0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
84d0: 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
84e0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  re that defines 
84f0: 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20 6f 72 64  a.** VIEW in ord
8500: 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e 79 20 62  er to undo any b
8510: 69 6e 64 69 6e 67 73 20 74 6f 20 74 61 62 6c 65  indings to table
8520: 73 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  s.  This is nece
8530: 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75 73 65  ssary.** because
8540: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 20 6d 69   those tables mi
8550: 67 68 74 20 62 65 20 44 52 4f 50 65 64 20 62 79  ght be DROPed by
8560: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 53 51   a subsequent SQ
8570: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76 6f  L command..*/.vo
8580: 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55  id sqliteSelectU
8590: 6e 62 69 6e 64 28 53 65 6c 65 63 74 20 2a 70 29  nbind(Select *p)
85a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  {.  int i;.  Src
85b0: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
85c0: 70 53 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSrc;.  Table *p
85d0: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
85e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
85f0: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
8600: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
8610: 20 28 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61   (pTab = pSrc->a
8620: 5b 69 5d 2e 70 54 61 62 29 21 3d 30 20 29 7b 0a  [i].pTab)!=0 ){.
8630: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
8640: 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
8650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c         sqliteDel
8660: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62  eteTable(0, pTab
8670: 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 20  );.#if 0.       
8680: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
8690: 65 74 65 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  ete(pSrc->a[i].p
86a0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
86b0: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pSrc->a[i].pSel
86c0: 65 63 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ect = 0;.#endif.
86d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
86e0: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20  rc->a[i].pTab = 
86f0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  0;.      if( pSr
8700: 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20  c->a[i].pSelect 
8710: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8720: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53  eSelectUnbind(pS
8730: 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  rc->a[i].pSelect
8740: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
8760: 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63  is routine assoc
8770: 69 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e  iates entries in
8780: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70   an ORDER BY exp
8790: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74  ression list wit
87a0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  h.** columns in 
87b0: 61 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65  a result.  For e
87c0: 61 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70  ach ORDER BY exp
87d0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63  ression, the opc
87e0: 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  ode of.** the to
87f0: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
8800: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
8810: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f  LUMN and the iCo
8820: 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  lumn value of.**
8830: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
8840: 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  ode is filled in
8850: 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d   with column num
8860: 62 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62  ber and the iTab
8870: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  le.** value of t
8880: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
8890: 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
88a0: 20 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65   iTable paramete
88b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  r..**.** If ther
88c0: 65 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45  e are prior SELE
88d0: 43 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79  CT clauses, they
88e0: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66   are processed f
88f0: 69 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a  irst.  A match.*
8900: 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20  * in an earlier 
8910: 53 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65  SELECT takes pre
8920: 63 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c  cedence over a l
8930: 61 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ater SELECT..**.
8940: 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61  ** Any entry tha
8950: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
8960: 20 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61   is flagged as a
8970: 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75  n error.  The nu
8980: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
8990: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
89a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
89b0: 65 20 64 6f 65 73 20 4e 4f 54 20 63 6f 72 72 65  e does NOT corre
89c0: 63 74 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 20  ctly initialize 
89d0: 74 68 65 20 45 78 70 72 2e 64 61 74 61 54 79 70  the Expr.dataTyp
89e0: 65 20 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74  e  field.** of t
89f0: 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  he ORDER BY expr
8a00: 65 73 73 69 6f 6e 73 2e 20 20 54 68 65 20 6d 75  essions.  The mu
8a10: 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64  ltiSelectSortOrd
8a20: 65 72 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  er() routine.** 
8a30: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
8a40: 6f 20 64 6f 20 74 68 61 74 20 61 66 74 65 72 20  o do that after 
8a50: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 73  the individual s
8a60: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
8a70: 0a 2a 2a 20 68 61 76 65 20 61 6c 6c 20 62 65 65  .** have all bee
8a80: 6e 20 61 6e 61 6c 79 7a 65 64 2e 20 20 54 68 69  n analyzed.  Thi
8a90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 61  s routine is una
8aa0: 62 6c 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 45  ble to compute E
8ab0: 78 70 72 2e 64 61 74 61 54 79 70 65 0a 2a 2a 20  xpr.dataType.** 
8ac0: 62 65 63 61 75 73 65 20 69 74 20 6d 75 73 74 20  because it must 
8ad0: 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
8ae0: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
8af0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
8b00: 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61  s.** have been a
8b10: 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74  nalyzed..*/.stat
8b20: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
8b30: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50  rbyToColumn(.  P
8b40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8b50: 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63         /* A plac
8b60: 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72  e to leave error
8b70: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
8b80: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
8b90: 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20         /* Match 
8ba0: 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  to result column
8bb0: 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54  s of this SELECT
8bc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8bd0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
8be0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61   The ORDER BY va
8bf0: 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67  lues to match ag
8c00: 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ainst columns */
8c10: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
8c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
8c30: 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20  sert this value 
8c40: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
8c50: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
8c60: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
8c70: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
8c80: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
8c90: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
8ca0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
8cb0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
8cc0: 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
8cd0: 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d  =0 || pOrderBy==
8ce0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8cf0: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
8d00: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
8d10: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
8d20: 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72  pr; i++){ pOrder
8d30: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
8d40: 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66  0; }.  }.  if( f
8d50: 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28  illInColumnList(
8d60: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
8d70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
8d80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
8d90: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
8da0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
8db0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
8dc0: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
8dd0: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
8de0: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
8df0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8e00: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
8e10: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8e20: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
8e30: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8e40: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
8e50: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
8e60: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8e70: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
8e80: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
8e90: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
8ea0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
8eb0: 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
8ec0: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
8ed0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
8ee0: 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
8ef0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
8f00: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
8f10: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
8f20: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 70       "ORDER BY p
8f30: 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c  osition %d shoul
8f40: 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  d be between 1 a
8f50: 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
8f60: 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e    iCol, pEList->
8f70: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
8f80: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
8f90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8fa0: 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f       if( !mustCo
8fb0: 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75  mplete ) continu
8fc0: 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b  e;.      iCol--;
8fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
8fe0: 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c  =0; iCol<0 && j<
8ff0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
9000: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
9010: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
9020: 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b  e && (pE->op==TK
9030: 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54  _ID || pE->op==T
9040: 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20  K_STRING) ){.   
9050: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
9060: 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20  , *zLabel;.     
9070: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73     zName = pELis
9080: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
9090: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
90a0: 45 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20  E->token.z );.  
90b0: 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73        zLabel = s
90c0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 2d  qliteStrNDup(pE-
90d0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 2d 3e 74 6f  >token.z, pE->to
90e0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  ken.n);.        
90f0: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c  sqliteDequote(zL
9100: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  abel);.        i
9110: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
9120: 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d  (zName, zLabel)=
9130: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
9140: 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20   iCol = j;.     
9150: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
9160: 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b  iteFree(zLabel);
9170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9180: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c  f( iCol<0 && sql
9190: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70  iteExprCompare(p
91a0: 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  E, pEList->a[j].
91b0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
91c0: 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20    iCol = j;.    
91d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
91e0: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
91f0: 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43     pE->op = TK_C
9200: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d  OLUMN;.      pE-
9210: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
9220: 0a 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c  .      pE->iTabl
9230: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
9240: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
9250: 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  .done = 1;.    }
9260: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
9270: 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  && mustComplete 
9280: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
9290: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
92a0: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
92b0: 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64  Y term number %d
92c0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
92d0: 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
92e0: 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  n", i+1);.      
92f0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72  nErr++;.      br
9300: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9310: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
9320: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
9330: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
9340: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
9350: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
9360: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
9370: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
9380: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
9390: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
93a0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
93b0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
93c0: 69 74 65 47 65 74 56 64 62 65 28 50 61 72 73 65  iteGetVdbe(Parse
93d0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
93e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
93f0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
9400: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
9410: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
9420: 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61  teVdbeCreate(pPa
9430: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20  rse->db);.  }.  
9440: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a  return v;.}../*.
9450: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9460: 73 65 74 73 20 74 68 65 20 45 78 70 72 2e 64 61  sets the Expr.da
9470: 74 61 54 79 70 65 20 66 69 65 6c 64 20 6f 6e 20  taType field on 
9480: 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a  all elements of.
9490: 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  ** the pOrderBy 
94a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
94b0: 20 20 54 68 65 20 70 4f 72 64 65 72 42 79 20 6c    The pOrderBy l
94c0: 69 73 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ist will have be
94d0: 65 6e 0a 2a 2a 20 73 65 74 20 75 70 20 62 79 20  en.** set up by 
94e0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
94f0: 6c 75 6d 6e 28 29 2e 20 20 48 65 6e 63 65 20 65  lumn().  Hence e
9500: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 68  ach expression h
9510: 61 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d  as.** a TK_COLUM
9520: 4e 20 61 73 20 69 74 73 20 72 6f 6f 74 20 6e 6f  N as its root no
9530: 64 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  de.  The Expr.iC
9540: 6f 6c 75 6d 6e 20 72 65 66 65 72 73 20 74 6f 20  olumn refers to 
9550: 61 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20  a .** column in 
9560: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
9570: 20 20 54 68 65 20 64 61 74 61 74 79 70 65 20 69    The datatype i
9580: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
9590: 53 4f 5f 54 45 58 54 0a 2a 2a 20 69 66 20 74 68  SO_TEXT.** if th
95a0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
95b0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 20 61 6e 64 20  column in p and 
95c0: 65 76 65 72 79 20 53 45 4c 45 43 54 20 74 6f 20  every SELECT to 
95d0: 74 68 65 20 6c 65 66 74 20 6f 66 0a 2a 2a 20 70  the left of.** p
95e0: 20 68 61 73 20 61 20 64 61 74 61 74 79 70 65 20   has a datatype 
95f0: 6f 66 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  of SQLITE_SO_TEX
9600: 54 2e 20 20 49 66 20 74 68 65 20 63 6f 6f 72 65  T.  If the coore
9610: 73 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  ssponding column
9620: 0a 2a 2a 20 69 6e 20 70 20 6f 72 20 61 6e 79 20  .** in p or any 
9630: 6f 66 20 74 68 65 20 6c 65 66 74 20 53 45 4c 45  of the left SELE
9640: 43 54 73 20 69 73 20 53 51 4c 49 54 45 5f 53 4f  CTs is SQLITE_SO
9650: 5f 4e 55 4d 2c 20 74 68 65 6e 20 74 68 65 20 64  _NUM, then the d
9660: 61 74 61 74 79 70 65 0a 2a 2a 20 6f 66 20 74 68  atatype.** of th
9670: 65 20 6f 72 64 65 72 2d 62 79 20 65 78 70 72 65  e order-by expre
9680: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
9690: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2e 0a 2a  SQLITE_SO_NUM..*
96a0: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  *.** Examples:.*
96b0: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
96c0: 54 41 42 4c 45 20 6f 6e 65 28 61 20 49 4e 54 45  TABLE one(a INTE
96d0: 47 45 52 2c 20 62 20 54 45 58 54 29 3b 0a 2a 2a  GER, b TEXT);.**
96e0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
96f0: 45 20 74 77 6f 28 63 20 56 41 52 43 48 41 52 28  E two(c VARCHAR(
9700: 35 29 2c 20 64 20 46 4c 4f 41 54 29 3b 0a 2a 2a  5), d FLOAT);.**
9710: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 62  .**     SELECT b
9720: 2c 20 62 20 46 52 4f 4d 20 6f 6e 65 20 55 4e 49  , b FROM one UNI
9730: 4f 4e 20 53 45 4c 45 43 54 20 64 2c 20 63 20 46  ON SELECT d, c F
9740: 52 4f 4d 20 74 77 6f 20 4f 52 44 45 52 20 42 59  ROM two ORDER BY
9750: 20 31 2c 20 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   1, 2;.**.** The
9760: 20 70 72 69 6d 61 72 79 20 73 6f 72 74 20 6b 65   primary sort ke
9770: 79 20 77 69 6c 6c 20 75 73 65 20 53 51 4c 49 54  y will use SQLIT
9780: 45 5f 53 4f 5f 4e 55 4d 20 62 65 63 61 75 73 65  E_SO_NUM because
9790: 20 74 68 65 20 22 64 22 20 69 6e 0a 2a 2a 20 74   the "d" in.** t
97a0: 68 65 20 73 65 63 6f 6e 64 20 53 45 4c 45 43 54  he second SELECT
97b0: 20 69 73 20 6e 75 6d 65 72 69 63 2e 20 20 54 68   is numeric.  Th
97c0: 65 20 31 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  e 1st column of 
97d0: 74 68 65 20 66 69 72 73 74 20 53 45 4c 45 43 54  the first SELECT
97e0: 0a 2a 2a 20 69 73 20 74 65 78 74 20 62 75 74 20  .** is text but 
97f0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
9800: 74 74 65 72 20 62 65 63 61 75 73 65 20 61 20 6e  tter because a n
9810: 75 6d 65 72 69 63 20 61 6c 77 61 79 73 20 6f 76  umeric always ov
9820: 65 72 72 69 64 65 73 0a 2a 2a 20 61 20 74 65 78  errides.** a tex
9830: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  t..**.** The sec
9840: 6f 6e 64 61 72 79 20 6b 65 79 20 77 69 6c 6c 20  ondary key will 
9850: 75 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 53  use the SQLITE_S
9860: 4f 5f 54 45 58 54 20 73 6f 72 74 20 6f 72 64 65  O_TEXT sort orde
9870: 72 20 62 65 63 61 75 73 65 0a 2a 2a 20 62 6f 74  r because.** bot
9880: 68 20 74 68 65 20 28 73 65 63 6f 6e 64 29 20 22  h the (second) "
9890: 62 22 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  b" in the first 
98a0: 53 45 4c 45 43 54 20 61 6e 64 20 74 68 65 20 22  SELECT and the "
98b0: 63 22 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  c" in the second
98c0: 0a 2a 2a 20 53 45 4c 45 43 54 20 68 61 76 65 20  .** SELECT have 
98d0: 61 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 65  a datatype of te
98e0: 78 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  xt..*/ .static v
98f0: 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63 74 53  oid multiSelectS
9900: 6f 72 74 4f 72 64 65 72 28 53 65 6c 65 63 74 20  ortOrder(Select 
9910: 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *p, ExprList *pO
9920: 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74 20 69  rderBy){.  int i
9930: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
9940: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4f 72 64  List;.  if( pOrd
9950: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
9960: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
9970: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9980: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
9990: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  i++){.      pOrd
99a0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
99b0: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c  ->dataType = SQL
99c0: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
99d0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
99e0: 20 7d 0a 20 20 6d 75 6c 74 69 53 65 6c 65 63 74   }.  multiSelect
99f0: 53 6f 72 74 4f 72 64 65 72 28 70 2d 3e 70 50 72  SortOrder(p->pPr
9a00: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  ior, pOrderBy);.
9a10: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
9a20: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
9a30: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
9a40: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
9a50: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
9a60: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
9a70: 20 20 20 69 66 28 20 70 45 2d 3e 64 61 74 61 54     if( pE->dataT
9a80: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  ype==SQLITE_SO_N
9a90: 55 4d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  UM ) continue;. 
9aa0: 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 69     assert( pE->i
9ab0: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20 20 20  Column>=0 );.   
9ac0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
9ad0: 70 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pr>pE->iColumn )
9ae0: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 64 61 74 61  {.      pE->data
9af0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 45 78 70  Type = sqliteExp
9b00: 72 54 79 70 65 28 70 45 4c 69 73 74 2d 3e 61 5b  rType(pEList->a[
9b10: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pE->iColumn].pEx
9b20: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
9b30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9b40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
9b50: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
9b60: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
9b70: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
9b80: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
9b90: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
9ba0: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
9bb0: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
9bc0: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
9bd0: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
9be0: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
9bf0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
9c00: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
9c10: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
9c20: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
9c30: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
9c40: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9c50: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9c60: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
9c70: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
9c80: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
9c90: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
9ca0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
9cb0: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
9cc0: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
9cd0: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
9ce0: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
9cf0: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
9d00: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
9d10: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
9d20: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
9d30: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
9d40: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
9d50: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
9d60: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
9d70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
9d80: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
9d90: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
9da0: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
9db0: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
9dc0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
9dd0: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
9de0: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
9df0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
9e10: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 63 20 46  --->  SELECT c F
9e20: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
9e30: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
9e40: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
9e50: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
9e60: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
9e70: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
9e80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9e90: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
9ea0: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
9eb0: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
9ec0: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
9ed0: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
9ee0: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
9ef0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
9f00: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
9f10: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
9f20: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
9f30: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
9f40: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
9f50: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
9f60: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
9f70: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
9f80: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
9f90: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
9fa0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
9fb0: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
9fc0: 61 72 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  arm){.  int rc; 
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9fe0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
9ff0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
a000: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
a010: 72 3b 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  r;     /* Anothe
a020: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
a030: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
a040: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
a050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
a060: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
a070: 69 73 20 56 44 42 45 20 2a 2f 0a 0a 20 20 2f 2a  is VDBE */..  /*
a080: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
a090: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
a0a0: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
a0b0: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74  SELECTs.  Only t
a0c0: 68 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45  he .  ** last SE
a0d0: 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
a0e0: 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
a0f0: 52 44 45 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20  RDER BY..  */.  
a100: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
a110: 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
a120: 6e 20 31 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  n 1;.  pPrior = 
a130: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  p->pPrior;.  if(
a140: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
a150: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  y ){.    sqliteE
a160: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
a170: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
a180: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
a190: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
a1a0: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
a1b0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
a1c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
a1d0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a1e0: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
a1f0: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
a200: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
a210: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
a220: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
a230: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
a240: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
a250: 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
a260: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
a270: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
a280: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
a290: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
a2a0: 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
a2b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a2c0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
a2d0: 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  p, iParm, 0);.  
a2e0: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61    eDest = SRT_Ta
a2f0: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
a300: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
a310: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
a320: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
a330: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
a340: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
a350: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
a360: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
a370: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
a380: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a390: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
a3a0: 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69  pPrior, eDest, i
a3b0: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Parm, 0, 0, 0);.
a3c0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
a3d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a3e0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
a3f0: 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
a400: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
a410: 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
a420: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Parm, 0, 0, 0);.
a430: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
a440: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
a450: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
a460: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
a470: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a480: 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f       /* For UNIO
a490: 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20  N ALL ... ORDER 
a4a0: 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  BY fall through 
a4b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
a4c0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
a4d0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
a4e0: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
a4f0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
a500: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
a510: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
a520: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
a530: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
a540: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   */.      int op
a550: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ;          /* On
a560: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
a570: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
a580: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
a590: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
a5a0: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
a5b0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
a5c0: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
a5d0: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
a5e0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
a5f0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
a600: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65  Y clause for the
a610: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f   right SELECT */
a620: 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ..      priorOp 
a630: 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  = p->op==TK_ALL 
a640: 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52  ? SRT_Table : SR
a650: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
a660: 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  f( eDest==priorO
a670: 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79  p && p->pOrderBy
a680: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
a690: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
a6a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
a6b0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
a6c0: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
a6d0: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
a6e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a6f0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50     unionTab = iP
a700: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
a710: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
a720: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
a730: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
a740: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
a750: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
a760: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
a770: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
a780: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
a790: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
a7a0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Tab++;.        i
a7b0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a  f( p->pOrderBy .
a7c0: 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63 68          && match
a7d0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
a7e0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
a7f0: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
a800: 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 1) ){.        
a810: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
a830: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20  ( p->op!=TK_ALL 
a840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a850: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a860: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69  OP_OpenTemp, uni
a870: 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20  onTab, 1);.     
a880: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a890: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
a8a0: 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Data, unionTab, 
a8b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
a8c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
a8d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a8e0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69  OP_OpenTemp, uni
a8f0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
a900: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
a910: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
a920: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a930: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
a940: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
a950: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
a960: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
a970: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
a980: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
a990: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a9a0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  n rc;..      /* 
a9b0: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
a9c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a9d0: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
a9e0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
a9f0: 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
aa00: 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
aa10: 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
aa20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
aa30: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
aa40: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
aa50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aa60: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
aa70: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
aa80: 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
aa90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
aaa0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
aab0: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
aac0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
aad0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
aae0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aaf0: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
ab00: 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  p, op, unionTab,
ab10: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
ab20: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
ab30: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
ab40: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
ab50: 79 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  y;.      if( rc 
ab60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ab70: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
ab80: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
ab90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
aba0: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
abb0: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
abc0: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
abd0: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
abe0: 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
abf0: 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  ( eDest!=priorOp
ac00: 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50   || unionTab!=iP
ac10: 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arm ){.        i
ac20: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
ac30: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
ac40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ac50: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
ac60: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
ac70: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
ac80: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
ac90: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
aca0: 70 2d 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e 70  p->base, 0, p->p
acb0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
acc0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
acd0: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Types(pParse, p-
ace0: 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20  >base, p->pSrc, 
acf0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
ad00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
ad10: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64 62  reak = sqliteVdb
ad20: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
ad30: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
ad40: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
ad50: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
ad60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ad70: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
ad80: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
ad90: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
ada0: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
adb0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
adc0: 20 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f     multiSelectSo
add0: 72 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f  rtOrder(p, p->pO
ade0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
adf0: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
ae00: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
ae10: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
ae20: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
ae30: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
ae60: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
ae70: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29    iCont, iBreak)
aea0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
aeb0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
aec0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
aed0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
aee0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
aef0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
af00: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
af10: 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
af20: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
af30: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
af40: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
af50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
af60: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
af70: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
af80: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
af90: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
afa0: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
afb0: 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  l(p, v, p->pELis
afc0: 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
afd0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20   iParm);.       
afe0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
aff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b000: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
b010: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
b020: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
b030: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
b040: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a 20  reak, iStart;.. 
b050: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
b060: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
b070: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
b080: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
b090: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
b0a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
b0b0: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
b0c0: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
b0d0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
b0e0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
b0f0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
b100: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
b110: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
b120: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
b130: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
b140: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
b150: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 6d  p->pOrderBy && m
b160: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
b170: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d 3e  umn(pParse,p,p->
b180: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
b190: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
b1a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
b1b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b1c0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
b1d0: 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20  mp, tab1, 1);.  
b1e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b1f0: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
b200: 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 0a  ata, tab1, 1);..
b210: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
b220: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
b230: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
b240: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
b250: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
b260: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
b270: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
b280: 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  or, SRT_Union, t
b290: 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ab1, 0, 0, 0);. 
b2a0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
b2b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
b2c0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
b2d0: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
b2e0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
b2f0: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
b300: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b310: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b320: 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b 0a  Temp, tab2, 1);.
b330: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b340: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
b350: 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29 3b  sData, tab2, 1);
b360: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
b370: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
b380: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
b390: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
b3a0: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
b3b0: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
b3c0: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
b3d0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
b3e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f  urn rc;..      /
b3f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b400: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
b410: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
b420: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
b430: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
b440: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
b450: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
b460: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
b470: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
b480: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
b490: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
b4a0: 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c  pParse, p->base,
b4b0: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
b4c0: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
b4d0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
b4e0: 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e  se, p->base, p->
b4f0: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
b500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b510: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56  iBreak = sqliteV
b520: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b530: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
b540: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
b550: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
b560: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b570: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
b580: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b590: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
b5a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
b5b0: 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30 29  ullKey, tab1, 0)
b5c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b5d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
b5e0: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
b5f0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 6d 75 6c 74  ont);.      mult
b600: 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72  iSelectSortOrder
b610: 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  (p, p->pOrderBy)
b620: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
b630: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
b640: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
b650: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
b660: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
b690: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
b6a0: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
b6d0: 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ak);.      if( r
b6e0: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
b6f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
b700: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
b710: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
b720: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b730: 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
b740: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
b750: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b760: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
b770: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
b780: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b790: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
b7a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b7b0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b7c0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
b7d0: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
b7e0: 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  ){.        gener
b7f0: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76  ateSortTail(p, v
b800: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
b810: 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
b820: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b840: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
b850: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
b860: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
b870: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
b880: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
b890: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
b8a0: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
b8b0: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
b8c0: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
b8d0: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
b8e0: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
b8f0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
b900: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
b910: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
b920: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
b930: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
b940: 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20  /* Issue a null 
b950: 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74  callback if that
b960: 20 69 73 20 77 68 61 74 20 74 68 65 20 75 73 65   is what the use
b970: 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  r wants..  */.  
b980: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
b990: 61 6c 6c 62 61 63 6b 20 26 26 0a 20 20 20 20 28  allback &&.    (
b9a0: 70 50 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62  pParse->useCallb
b9b0: 61 63 6b 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ack==0 || (pPars
b9c0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
b9d0: 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
b9e0: 63 6b 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20  ck)!=0).  ){.   
b9f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ba00: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62  (v, OP_NullCallb
ba10: 61 63 6b 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ack, p->pEList->
ba20: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  nExpr, 0);.  }. 
ba30: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ba40: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
ba50: 73 63 61 6e 20 74 68 72 6f 75 67 68 20 61 6e 20  scan through an 
ba60: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
ba70: 20 20 46 6f 72 20 65 76 65 72 79 20 72 65 66 65    For every refe
ba80: 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 61 20 63 6f  rence.** to a co
ba90: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
baa0: 6d 62 65 72 20 69 46 72 6f 6d 2c 20 63 68 61 6e  mber iFrom, chan
bab0: 67 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ge that referenc
bac0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e to the.** same
bad0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
bae0: 20 6e 75 6d 62 65 72 20 69 54 6f 2e 0a 2a 2f 0a   number iTo..*/.
baf0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
bb00: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 45  geTablesInList(E
bb10: 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 69  xprList*, int, i
bb20: 6e 74 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  nt);  /* Forward
bb30: 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   Declaration */.
bb40: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
bb50: 67 65 54 61 62 6c 65 73 28 45 78 70 72 20 2a 70  geTables(Expr *p
bb60: 45 78 70 72 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  Expr, int iFrom,
bb70: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66 28   int iTo){.  if(
bb80: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
bb90: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
bba0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
bbb0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
bbc0: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 70 45  =iFrom ){.    pE
bbd0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  xpr->iTable = iT
bbe0: 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
bbf0: 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78  changeTables(pEx
bc00: 70 72 2d 3e 70 4c 65 66 74 2c 20 69 46 72 6f 6d  pr->pLeft, iFrom
bc10: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e  , iTo);.    chan
bc20: 67 65 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e  geTables(pExpr->
bc30: 70 52 69 67 68 74 2c 20 69 46 72 6f 6d 2c 20 69  pRight, iFrom, i
bc40: 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54  To);.    changeT
bc50: 61 62 6c 65 73 49 6e 4c 69 73 74 28 70 45 78 70  ablesInList(pExp
bc60: 72 2d 3e 70 4c 69 73 74 2c 20 69 46 72 6f 6d 2c  r->pList, iFrom,
bc70: 20 69 54 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61   iTo);.  }.}.sta
bc80: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54  tic void changeT
bc90: 61 62 6c 65 73 49 6e 4c 69 73 74 28 45 78 70 72  ablesInList(Expr
bca0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
bcb0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
bcc0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  {.  if( pList ){
bcd0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
bce0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
bcf0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
bd00: 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65       changeTable
bd10: 73 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  s(pList->a[i].pE
bd20: 78 70 72 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29  xpr, iFrom, iTo)
bd30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
bd40: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
bd50: 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
bd60: 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
bd70: 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
bd80: 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
bd90: 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
bda0: 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
bdb0: 70 79 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  py of the corres
bdc0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 6e 74 72 79  ponding.** entry
bdd0: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
bde0: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
bdf0: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
be00: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
be10: 6e 67 65 64 2e 29 20 20 57 68 65 6e 20 6d 61 6b  nged.)  When mak
be20: 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ing a copy of an
be30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70   expression in p
be40: 45 4c 69 73 74 2c 20 63 68 61 6e 67 65 0a 2a 2a  EList, change.**
be50: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
be60: 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
be70: 69 53 75 62 20 69 6e 74 6f 20 72 65 66 65 72 65  iSub into refere
be80: 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 69 54  nces to table iT
be90: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  able..**.** This
bea0: 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
beb0: 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
bec0: 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
bed0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
bee0: 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
bef0: 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
bf00: 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
bf10: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
bf20: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
bf30: 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
bf40: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
bf50: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
bf60: 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
bf70: 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
bf80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
bf90: 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
bfa0: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
bfb0: 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
bfc0: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
bfd0: 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
bfe0: 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
bff0: 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
c000: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
c010: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
c020: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c030: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
c040: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
c050: 69 73 74 2a 2c 69 6e 74 29 3b 20 20 2f 2a 20 46  ist*,int);  /* F
c060: 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
c070: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
c080: 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72  Expr(Expr *pExpr
c090: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
c0a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
c0b0: 69 6e 74 20 69 53 75 62 29 7b 0a 20 20 69 66 28  int iSub){.  if(
c0c0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
c0d0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
c0e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
c0f0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
c100: 3d 69 54 61 62 6c 65 20 26 26 20 70 45 78 70 72  =iTable && pExpr
c110: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
c120: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
c130: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
c140: 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
c150: 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
c160: 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73  nExpr );.    ass
c170: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
c180: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
c190: 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
c1a0: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
c1b0: 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
c1c0: 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
c1d0: 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  mn].pExpr;.    a
c1e0: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29  ssert( pNew!=0 )
c1f0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
c200: 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20  = pNew->op;.    
c210: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
c220: 3d 20 70 4e 65 77 2d 3e 64 61 74 61 54 79 70 65  = pNew->dataType
c230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
c240: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
c250: 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
c260: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  t = sqliteExprDu
c270: 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a  p(pNew->pLeft);.
c280: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
c290: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
c2a0: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
c2b0: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  t = sqliteExprDu
c2c0: 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  p(pNew->pRight);
c2d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
c2e0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
c2f0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
c300: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
c310: 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74  tDup(pNew->pList
c320: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  );.    pExpr->iT
c330: 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
c340: 62 6c 65 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ble;.    pExpr->
c350: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
c360: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 45 78  iColumn;.    pEx
c370: 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
c380: 3e 69 41 67 67 3b 0a 20 20 20 20 73 71 6c 69 74  >iAgg;.    sqlit
c390: 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  eTokenCopy(&pExp
c3a0: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
c3b0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 73 71 6c  >token);.    sql
c3c0: 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45  iteTokenCopy(&pE
c3d0: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
c3e0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 69 66 28  ->span);.    if(
c3f0: 20 69 53 75 62 21 3d 69 54 61 62 6c 65 20 29 7b   iSub!=iTable ){
c400: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62  .      changeTab
c410: 6c 65 73 28 70 45 78 70 72 2c 20 69 53 75 62 2c  les(pExpr, iSub,
c420: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a   iTable);.    }.
c430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
c440: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
c450: 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
c460: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
c470: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
c480: 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
c490: 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a   pEList, iSub);.
c4a0: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
c4b0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
c4c0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20  iTable, pEList, 
c4d0: 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  iSub);.  }.}.sta
c4e0: 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45  tic void .substE
c4f0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
c500: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
c510: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
c520: 45 4c 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29  EList, int iSub)
c530: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
c540: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
c550: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
c560: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
c570: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
c580: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
c590: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
c5a0: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d  List, iSub);.  }
c5b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c5c0: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
c5d0: 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
c5e0: 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
c5f0: 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
c600: 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
c610: 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
c620: 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
c630: 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
c640: 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
c650: 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
c660: 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
c670: 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
c680: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
c690: 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
c6a0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
c6b0: 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
c6c0: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
c6d0: 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
c6e0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
c6f0: 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
c700: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
c710: 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
c720: 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
c730: 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
c740: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
c750: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
c760: 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
c770: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
c780: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
c790: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
c7a0: 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
c7b0: 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
c7c0: 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
c7d0: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
c7e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
c7f0: 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
c800: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c810: 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
c820: 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
c830: 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
c840: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c850: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
c860: 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
c870: 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
c880: 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
c890: 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
c8a0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
c8b0: 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
c8c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
c8d0: 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
c8e0: 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
c8f0: 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
c900: 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
c910: 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
c920: 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
c930: 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
c940: 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
c950: 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
c960: 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
c970: 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
c980: 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
c990: 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
c9a0: 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
c9b0: 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
c9c0: 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
c9d0: 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
c9e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
c9f0: 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
ca00: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ca10: 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
ca20: 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
ca30: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
ca40: 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
ca50: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
ca60: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
ca70: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ca80: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
ca90: 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
caa0: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
cab0: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
cac0: 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
cad0: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
cae0: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
caf0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
cb00: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
cb10: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
cb20: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
cb30: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
cb40: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
cb50: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
cb60: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
cb70: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
cb80: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
cb90: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
cba0: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
cbb0: 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
cbc0: 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
cbd0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
cbe0: 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
cbf0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
cc00: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
cc10: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
cc20: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
cc30: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
cc40: 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
cc50: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
cc60: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
cc70: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
cc80: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
cc90: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
cca0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
ccb0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
ccc0: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
ccd0: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
cce0: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
ccf0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
cd00: 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
cd10: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
cd20: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
cd30: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
cd40: 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
cd50: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  lauses..**.** In
cd60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
cd70: 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
cd80: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
cd90: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
cda0: 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
cdb0: 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
cdc0: 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
cdd0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
cde0: 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
cdf0: 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
ce00: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
ce10: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
ce20: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
ce30: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
ce40: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
ce50: 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
ce60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ce70: 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
ce80: 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
ce90: 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
cea0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
ceb0: 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
cec0: 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
ced0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
cee0: 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
cef0: 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
cf00: 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
cf10: 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
cf20: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
cf30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
cf40: 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
cf50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cf60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
cf70: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cf80: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
cf90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
cfa0: 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
cfb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
cfc0: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
cfd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
cfe0: 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
cff0: 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
d000: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
d010: 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
d020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
d030: 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
d040: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
d050: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
d060: 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
d070: 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
d080: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
d090: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
d0a0: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  .){.  Select *pS
d0b0: 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
d0c0: 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
d0d0: 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
d0e0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
d0f0: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
d100: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
d110: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
d120: 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
d130: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
d140: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
d150: 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
d160: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
d170: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
d180: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
d190: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ery */.  int i;.
d1a0: 20 20 69 6e 74 20 69 50 61 72 65 6e 74 2c 20 69    int iParent, i
d1b0: 53 75 62 3b 0a 20 20 45 78 70 72 20 2a 70 57 68  Sub;.  Expr *pWh
d1c0: 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ere;..  /* Check
d1d0: 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
d1e0: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
d1f0: 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
d200: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
d210: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
d220: 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
d230: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
d240: 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
d250: 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
d260: 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20 70  rc );.  pSub = p
d270: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53  Src->a[iFrom].pS
d280: 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
d290: 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
d2a0: 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
d2b0: 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
d2c0: 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75  n 0;.  if( subqu
d2d0: 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
d2e0: 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
d2f0: 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d  n 0;.  pSubSrc =
d300: 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
d310: 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
d320: 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
d330: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
d340: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
d350: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
d360: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  pSub->nLimit>=0)
d370: 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63   &&  (pSrc->nSrc
d380: 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
d390: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d3a0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44   }.  if( (p->isD
d3b0: 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c  istinct || p->nL
d3c0: 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71  imit>=0) && subq
d3d0: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
d3e0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
d3f0: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
d400: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
d410: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  rn 0;..  /* If w
d420: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
d430: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61  nt, it means fla
d440: 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
d450: 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  tted for the.  *
d460: 2a 20 69 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  * i-th entry of 
d470: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
d480: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
d490: 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  ry..  */.  iPare
d4a0: 6e 74 20 3d 20 70 2d 3e 62 61 73 65 20 2b 20 69  nt = p->base + i
d4b0: 46 72 6f 6d 3b 0a 20 20 69 53 75 62 20 3d 20 70  From;.  iSub = p
d4c0: 53 75 62 2d 3e 62 61 73 65 3b 0a 20 20 73 75 62  Sub->base;.  sub
d4d0: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  stExprList(p->pE
d4e0: 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
d4f0: 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75  Sub->pEList, iSu
d500: 62 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  b);.  pList = p-
d510: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
d520: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
d530: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
d540: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
d550: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
d560: 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
d570: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
d580: 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
d590: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
d5a0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
d5b0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
d5c0: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
d5d0: 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
d5e0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
d5f0: 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
d600: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
d610: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
d620: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
d630: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
d640: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
d650: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
d660: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 20 20  t, iSub);.  }.  
d670: 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
d680: 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
d690: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
d6a0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
d6b0: 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
d6c0: 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
d6d0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
d6e0: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e    changeTablesIn
d6f0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
d700: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
d710: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
d720: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
d730: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
d740: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
d750: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
d760: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 20 20  t, iSub);.  }.  
d770: 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
d780: 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
d790: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
d7a0: 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
d7b0: 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d 69    if( iParent!=i
d7c0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61  Sub ){.      cha
d7d0: 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65 72 65  ngeTables(pWhere
d7e0: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
d7f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
d800: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
d810: 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
d820: 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
d830: 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
d840: 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
d850: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
d860: 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
d870: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
d880: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
d890: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
d8a0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
d8b0: 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ub);.    if( pSu
d8c0: 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  b->pHaving ){.  
d8d0: 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e      Expr *pHavin
d8e0: 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  g = sqliteExprDu
d8f0: 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  p(pSub->pHaving)
d900: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 61 72  ;.      if( iPar
d910: 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20  ent!=iSub ){.   
d920: 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65       changeTable
d930: 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75 62 2c  s(pHaving, iSub,
d940: 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   iParent);.     
d950: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
d960: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
d970: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
d980: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e  sqliteExpr(TK_AN
d990: 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  D, p->pHaving, p
d9a0: 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20  Having, 0);.    
d9b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d9c0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48   p->pHaving = pH
d9d0: 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20  aving;.      }. 
d9e0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
d9f0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
da00: 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
da10: 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  By = sqliteExprL
da20: 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
da30: 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66 28 20  oupBy);.    if( 
da40: 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29 7b  iParent!=iSub ){
da50: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62  .      changeTab
da60: 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 47 72  lesInList(p->pGr
da70: 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69 50 61  oupBy, iSub, iPa
da80: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
da90: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
daa0: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
dab0: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
dac0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
dad0: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
dae0: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
daf0: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
db00: 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65 20  .    if( pWhere 
db10: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  ){.      p->pWhe
db20: 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  re = sqliteExpr(
db30: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72  TK_AND, p->pWher
db40: 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  e, pWhere, 0);. 
db50: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69 73     }.  }.  p->is
db60: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
db70: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
db80: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
db90: 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69   if( pSub->nLimi
dba0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t>=0 ){.    if( 
dbb0: 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  p->nLimit<0 ){. 
dbc0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
dbd0: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20   pSub->nLimit;. 
dbe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
dbf0: 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65  nLimit+p->nOffse
dc00: 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t > pSub->nLimit
dc10: 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29  +pSub->nOffset )
dc20: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
dc30: 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
dc40: 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74   + pSub->nOffset
dc50: 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   - p->nOffset;. 
dc60: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f     }.  }.  p->nO
dc70: 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e  ffset += pSub->n
dc80: 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 49 66  Offset;..  /* If
dc90: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f   the subquery co
dca0: 6e 74 61 69 6e 73 20 73 75 62 71 75 65 72 69 65  ntains subquerie
dcb0: 73 20 6f 66 20 69 74 73 20 6f 77 6e 2c 20 74 68  s of its own, th
dcc0: 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 2a 2a  at were not.  **
dcd0: 20 66 6c 61 74 74 65 6e 65 64 2c 20 74 68 65 6e   flattened, then
dce0: 20 63 6f 64 65 20 77 69 6c 6c 20 68 61 76 65 20   code will have 
dcf0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
dd00: 65 72 61 74 65 64 20 74 6f 20 70 75 74 0a 20 20  erated to put.  
dd10: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ** the results o
dd20: 66 20 74 68 6f 73 65 20 73 75 62 2d 73 75 62 71  f those sub-subq
dd30: 75 65 72 69 65 73 20 69 6e 74 6f 20 56 44 42 45  ueries into VDBE
dd40: 20 63 75 72 73 6f 72 73 20 72 65 6c 61 74 69 76   cursors relativ
dd50: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 75  e.  ** to the su
dd60: 62 71 75 65 72 79 2e 20 20 57 65 20 6d 75 73 74  bquery.  We must
dd70: 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63   translate the c
dd80: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74  ursor number int
dd90: 6f 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 73 75  o values.  ** su
dda0: 69 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62  itable for use b
ddb0: 79 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  y the outer quer
ddc0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
ddd0: 30 3b 20 69 3c 70 53 75 62 53 72 63 2d 3e 6e 53  0; i<pSubSrc->nS
dde0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64  rc; i++){.    Vd
ddf0: 62 65 20 2a 76 3b 0a 20 20 20 20 69 66 28 20 70  be *v;.    if( p
de00: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  SubSrc->a[i].pSe
de10: 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
de20: 75 65 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  ue;.    v = sqli
de30: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
de40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
de50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6e  eAddOp(v, OP_Ren
de60: 61 6d 65 43 75 72 73 6f 72 2c 20 70 53 75 62 2d  ameCursor, pSub-
de70: 3e 62 61 73 65 2b 69 2c 20 70 2d 3e 62 61 73 65  >base+i, p->base
de80: 2b 69 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  +i);.  }..  if( 
de90: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
dea0: 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69  Tab && pSrc->a[i
deb0: 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72  From].pTab->isTr
dec0: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 73  ansient ){.    s
ded0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
dee0: 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  (0, pSrc->a[iFro
def0: 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  m].pTab);.  }.  
df00: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
df10: 54 61 62 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  Tab = pSubSrc->a
df20: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 53 75 62  [0].pTab;.  pSub
df30: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d  Src->a[0].pTab =
df40: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   0;.  assert( pS
df50: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65  rc->a[iFrom].pSe
df60: 6c 65 63 74 3d 3d 70 53 75 62 20 29 3b 0a 20 20  lect==pSub );.  
df70: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
df80: 53 65 6c 65 63 74 20 3d 20 70 53 75 62 53 72 63  Select = pSubSrc
df90: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
dfa0: 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e    pSubSrc->a[0].
dfb0: 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
dfc0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
dfd0: 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
dfe0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
dff0: 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
e000: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
e010: 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d  d in as an argum
e020: 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
e030: 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20  .** is a simple 
e040: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
e050: 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20  uery.  If it is 
e060: 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63  and this query c
e070: 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69  an be.** satisfi
e080: 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ed using a singl
e090: 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65  e seek to the be
e0a0: 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f  ginning or end o
e0b0: 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  f an index,.** t
e0c0: 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65  hen generate the
e0d0: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53   code for this S
e0e0: 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e  ELECT and return
e0f0: 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20   1.  If this is 
e100: 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65  not a .** simple
e110: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
e120: 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75  query, then retu
e130: 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69  rn 0;.**.** A si
e140: 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mply min() or ma
e150: 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20  x() query looks 
e160: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
e170: 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61      SELECT min(a
e180: 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
e190: 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61      SELECT max(a
e1a0: 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
e1b0: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61  .** The query ma
e1c0: 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69  y have only a si
e1d0: 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74  ngle table in it
e1e0: 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e  s FROM argument.
e1f0: 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62    There.** can b
e200: 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72  e no GROUP BY or
e210: 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45   HAVING or WHERE
e220: 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72   clauses.  The r
e230: 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a  esult set must.*
e240: 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f  * be the min() o
e250: 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e  r max() of a sin
e260: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  gle column of th
e270: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
e280: 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d  lumn.** in the m
e290: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
e2a0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69  nction must be i
e2b0: 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ndexed..**.** Th
e2c0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
e2d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65  this routine are
e2e0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72   the same as for
e2f0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e   sqliteSelect().
e300: 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64  .** See the head
e310: 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  er comment on th
e320: 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  at routine for a
e330: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
e340: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
e350: 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   int simpleMinMa
e360: 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
e370: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
e380: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
e390: 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a  iParm){.  Expr *
e3a0: 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f  pExpr;.  int iCo
e3b0: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  l;.  Table *pTab
e3c0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
e3d0: 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56  .  int base;.  V
e3e0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65  dbe *v;.  int se
e3f0: 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  ekOp;.  int cont
e400: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 65 4c 69  ;.  ExprList eLi
e410: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
e420: 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
e430: 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Item;..  /* Chec
e440: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
e450: 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
e460: 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
e470: 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  ) query.  Return
e480: 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74  .  ** zero if it
e490: 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20   is  not..  */. 
e4a0: 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
e4b0: 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c   || p->pHaving |
e4c0: 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  | p->pWhere ) re
e4d0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
e4e0: 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29  >pSrc->nSrc!=1 )
e4f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e500: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e510: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
e520: 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
e530: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
e540: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
e550: 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
e560: 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
e570: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
e580: 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70  t==0 || pExpr->p
e590: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
e5a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
e5b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
e5c0: 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
e5d0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
e5e0: 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
e5f0: 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
e600: 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
e610: 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
e620: 65 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e  e if( sqliteStrN
e630: 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
e640: 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
e650: 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
e660: 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  OP_Last;.  }else
e670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
e680: 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 45    }.  pExpr = pE
e690: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
e6a0: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
e6b0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
e6c0: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
e6d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e6e0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d  Column;.  pTab =
e6f0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
e700: 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Tab;..  /* If we
e710: 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
e720: 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
e730: 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
e740: 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
e750: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
e760: 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
e770: 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
e780: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
e790: 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
e7a0: 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
e7b0: 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
e7c0: 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
e7d0: 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
e7e0: 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
e7f0: 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
e800: 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
e810: 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
e820: 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
e830: 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
e840: 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
e850: 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
e860: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
e870: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e880: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e890: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e8a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
e8b0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
e8c0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
e8d0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
e8e0: 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
e8f0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
e900: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
e910: 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
e920: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
e930: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
e940: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
e950: 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
e960: 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
e970: 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
e980: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
e990: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
e9a0: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
e9b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e9c0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
e9d0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 65 44 65  urn 0;.  if( eDe
e9e0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
e9f0: 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
ea00: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
ea10: 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e  se, p->base, p->
ea20: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
ea30: 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
ea40: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
ea50: 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53  , p->base, p->pS
ea60: 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  rc, p->pEList);.
ea70: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
ea80: 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e  ting code to fin
ea90: 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65  d the min or the
eaa0: 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79   max.  Basically
eab0: 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   all we have.  *
eac0: 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20  * to do is find 
ead0: 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65  the first or the
eae0: 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
eaf0: 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e  he chosen index.
eb00: 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69    If.  ** the mi
eb10: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
eb20: 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  on the INTEGER P
eb30: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
eb40: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a   find the first.
eb50: 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74    ** or last ent
eb60: 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  ry in the main t
eb70: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
eb80: 20 21 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61   !pParse->schema
eb90: 56 65 72 69 66 69 65 64 20 26 26 20 28 70 50 61  Verified && (pPa
eba0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
ebb0: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
ebc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ebd0: 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  eCodeVerifySchem
ebe0: 61 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20  a(pParse);.  }. 
ebf0: 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65 3b   base = p->base;
ec00: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
ec10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
ec20: 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b  , pTab->iDb, 0);
ec30: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
ec40: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
ec50: 64 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74  d, base, pTab->t
ec60: 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  num);.  sqliteVd
ec70: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
ec80: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
ec90: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  3_STATIC);.  if(
eca0: 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
ecb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ecc0: 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c  v, seekOp, base,
ecd0: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
ece0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ecf0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
ed00: 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a   pIdx->iDb, 0);.
ed10: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ed20: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
ed30: 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64 78  ad, base+1, pIdx
ed40: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
ed50: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ed60: 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61  v, -1, pIdx->zNa
ed70: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
ed80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ed90: 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62  dOp(v, seekOp, b
eda0: 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73  ase+1, 0);.    s
edb0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
edc0: 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20 62  , OP_IdxRecno, b
edd0: 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73  ase+1, 0);.    s
ede0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
edf0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
ee00: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  +1, 0);.    sqli
ee10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ee20: 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20  P_MoveTo, base, 
ee30: 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e  0);.  }.  eList.
ee40: 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d  nExpr = 1;.  mem
ee50: 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20  set(&eListItem, 
ee60: 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49  0, sizeof(eListI
ee70: 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61  tem));.  eList.a
ee80: 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20   = &eListItem;. 
ee90: 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70   eList.a[0].pExp
eea0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 63 6f 6e  r = pExpr;.  con
eeb0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  t = sqliteVdbeMa
eec0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 65  keLabel(v);.  se
eed0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
eee0: 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c  arse, p, &eList,
eef0: 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44   0, 0, 0, -1, eD
ef00: 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74  est, iParm, cont
ef10: 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74  , cont);.  sqlit
ef20: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
ef30: 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71  l(v, cont);.  sq
ef40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ef50: 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
ef60: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b   0);.  return 1;
ef70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
ef80: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
ef90: 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
efa0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
efb0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
efc0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
efd0: 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
efe0: 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
eff0: 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
f000: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
f010: 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
f020: 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
f030: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
f040: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
f050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
f070: 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
f080: 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
f090: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
f0a0: 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
f0b0: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
f0c0: 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
f0d0: 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
f0e0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
f0f0: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
f100: 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
f110: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
f120: 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62 6c  s keys of a tabl
f130: 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 50  e with cursor iP
f140: 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
f150: 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
f160: 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
f170: 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
f180: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a  ary table iParm.
f190: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
f1a0: 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
f1b0: 20 72 65 73 75 6c 74 73 20 66 6f 72 6d 20 74 68   results form th
f1c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
f1d0: 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
f1e0: 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
f1f0: 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
f200: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
f210: 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
f220: 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20  The table above 
f230: 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20  is incomplete.  
f240: 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74  Additional eDist
f250: 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61   value have be a
f260: 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68  dded.** since th
f270: 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77  is comment was w
f280: 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65  ritten.  See the
f290: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
f2a0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a  () function for.
f2b0: 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69  ** a complete li
f2c0: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c  sting of the all
f2d0: 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65  owed values of e
f2e0: 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d  Dest and their m
f2f0: 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  eanings..**.** T
f300: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f310: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
f320: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
f330: 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
f340: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
f350: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
f360: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
f370: 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
f380: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
f390: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f3a0: 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
f3b0: 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
f3c0: 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
f3d0: 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
f3e0: 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
f3f0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20   do that..**.** 
f400: 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72  The pParent, par
f410: 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61  entTab, and *pPa
f420: 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61  rentAgg fields a
f430: 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20  re filled in if 
f440: 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69  this.** SELECT i
f450: 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54  s a subquery.  T
f460: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
f470: 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  try to combine t
f480: 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  his SELECT.** wi
f490: 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f  th its parent to
f4a0: 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66   form a single f
f4b0: 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73  lat query.  In s
f4c0: 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68  o doing, it migh
f4d0: 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20  t.** change the 
f4e0: 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f  parent query fro
f4f0: 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  m a non-aggregat
f500: 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74  e to an aggregat
f510: 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20  e query..** For 
f520: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65  that reason, the
f530: 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67   pParentAgg flag
f540: 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20   is passed as a 
f550: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a  pointer, so it.*
f560: 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
f570: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
f580: 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  1:   The meaning
f590: 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20   of the pParent 
f5a0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
f5b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
f5c0: 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43  M t1 JOIN (SELEC
f5d0: 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52  T x, count(*) FR
f5e0: 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a  OM t2) JOIN t3;.
f5f0: 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  **    \         
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
f610: 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
f620: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f  ______/        /
f630: 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20  .**     \       
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f670: 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .**      \______
f680: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
f690: 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
f6a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
f6b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f6c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
f6d0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f6e0: 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68   first.   For th
f6f0: 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72  at call,.** pPar
f700: 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ent will be NULL
f710: 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72  .  During the pr
f720: 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
f730: 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69  outer query, thi
f740: 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  s .** routine is
f750: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
f760: 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ely to handle th
f770: 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72  e subquery.  For
f780: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a   the recursive.*
f790: 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20  * call, pParent 
f7a0: 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68  will point to th
f7b0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
f7c0: 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71  Because the subq
f7d0: 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73  uery is.** the s
f7e0: 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e  econd element in
f7f0: 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
f800: 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62  n, the parentTab
f810: 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
f820: 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64  ** be 1 (the 2nd
f830: 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e   value of a 0-in
f840: 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f  dexed array.).*/
f850: 0a 69 6e 74 20 73 71 6c 69 74 65 53 65 6c 65 63  .int sqliteSelec
f860: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
f870: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
f880: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
f890: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
f8a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f8b0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
f8c0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
f8d0: 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
f8e0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
f8f0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
f900: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
f910: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
f920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f930: 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
f940: 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
f950: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
f960: 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
f970: 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
f980: 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
f990: 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
f9a0: 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
f9b0: 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
f9c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
f9d0: 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
f9e0: 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
f9f0: 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
fa00: 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g        /* True
fa10: 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
fa20: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
fa30: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ions */.){.  int
fa40: 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   i;.  WhereInfo 
fa50: 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20  *pWInfo;.  Vdbe 
fa60: 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20  *v;.  int isAgg 
fa70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
fa80: 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
fa90: 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
faa0: 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
fab0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
fac0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
fad0: 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
fae0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
faf0: 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
fb00: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
fb10: 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
fb20: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
fb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fb40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
fb50: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
fb60: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
fb70: 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
fb80: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
fb90: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
fba0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
fbb0: 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
fbc0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
fbd0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
fbe0: 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
fbf0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
fc00: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
fc10: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
fc20: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
fc30: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
fc40: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
fc50: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
fc60: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
fc70: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
fc80: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
fc90: 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
fca0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61   set */.  int ba
fcb0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
fcc0: 20 2f 2a 20 46 69 72 73 74 20 63 75 72 73 6f 72   /* First cursor
fcd0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
fce0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  se */.  int rc =
fcf0: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
fd00: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
fd10: 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
fd20: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  tion */..  if( s
fd30: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
fd40: 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
fd50: 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65  Err || p==0 ) re
fd60: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
fd70: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
fd80: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
fd90: 45 43 54 2c 20 30 2c 20 30 29 20 29 20 72 65 74  ECT, 0, 0) ) ret
fda0: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 1;..  /* If 
fdb0: 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
fdc0: 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
fdd0: 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
fde0: 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
fdf0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
fe00: 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
fe10: 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
fe20: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
fe30: 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iParm);.  }..  /
fe40: 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
fe50: 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
fe60: 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
fe70: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
fe80: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
fe90: 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
fea0: 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42  Where;.  pOrderB
feb0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
fec0: 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
fed0: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
fee0: 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
fef0: 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
ff00: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
ff10: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
ff20: 61 20 62 6c 6f 63 6b 20 6f 66 20 56 44 42 45 20  a block of VDBE 
ff30: 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 66 6f 72  cursors, one for
ff40: 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
ff50: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
ff60: 20 20 2a 2a 20 54 68 65 20 57 48 45 52 45 20 70    ** The WHERE p
ff70: 72 6f 63 65 73 73 69 6e 67 20 72 65 71 75 69 72  rocessing requir
ff80: 65 73 20 74 68 61 74 20 74 68 65 20 63 75 72 73  es that the curs
ff90: 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ors for the tabl
ffa0: 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 46  es in the.  ** F
ffb0: 52 4f 4d 20 63 6c 61 75 73 65 20 62 65 20 63 6f  ROM clause be co
ffc0: 6e 73 65 63 75 74 69 76 65 2e 0a 20 20 2a 2f 0a  nsecutive..  */.
ffd0: 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65    base = p->base
ffe0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
fff0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
10000 2b 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  += pTabList->nSr
10010 63 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  c;..  /* .  ** D
10020 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
10030 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
10040 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
10050 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
10060 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
10070 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
10080 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
10090 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
100a0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
100b0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e  end;..  /* Expan
100c0 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20  d any "*" terms 
100d0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
100e0 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65  t.  (For example
100f0 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a   the "*" in.  **
10100 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
10110 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e  t1")  The fillIn
10120 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75  Columnlist() rou
10130 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73  tine also does s
10140 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  ome.  ** other h
10150 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65  ousekeeping - se
10160 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
10170 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73  ment for details
10180 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c  ..  */.  if( fil
10190 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
101a0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
101b0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
101c0 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20  .  }.  pWhere = 
101d0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c  p->pWhere;.  pEL
101e0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
101f0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
10200 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
10210 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
10220 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
10230 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
10240 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
10250 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
10260 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
10270 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
10280 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
10290 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
102a0 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
102b0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
102c0 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
102d0 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
102e0 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
102f0 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
10300 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
10310 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
10320 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
10330 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
10340 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
10350 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
10360 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
10370 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
10380 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
10390 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
103a0 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
103b0 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
103c0 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  :.      pOrderBy
103d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
103e0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
103f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
10400 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
10410 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
10420 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
10430 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
10440 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
10450 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
10460 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
10470 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
10480 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
10490 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
104a0 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
104b0 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
104c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
104d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
104e0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
104f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10500 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
10510 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
10520 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20  e, pTabList, 0, 
10530 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
10540 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
10550 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10560 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10570 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
10580 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
10590 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41 67  .pExpr, 1, &isAg
105a0 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
105b0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
105c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68   }.  }.  if( pWh
105d0 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ere ){.    if( s
105e0 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
105f0 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
10600 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
10610 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20  st, pWhere) ){. 
10620 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
10630 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
10640 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
10650 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68 65  eck(pParse, pWhe
10660 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  re, 0, 0) ){.   
10670 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10680 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
10690 6c 69 74 65 4f 72 61 63 6c 65 38 4a 6f 69 6e 46  liteOracle8JoinF
106a0 69 78 75 70 28 62 61 73 65 2c 20 70 54 61 62 4c  ixup(base, pTabL
106b0 69 73 74 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ist, pWhere);.  
106c0 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67 20  }.  if( pHaving 
106d0 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  ){.    if( pGrou
106e0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
106f0 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
10700 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
10710 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
10720 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
10730 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  ING");.      got
10740 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10750 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10760 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
10770 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70  (pParse, base, p
10780 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
10790 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
107a0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
107b0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
107c0 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
107d0 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  k(pParse, pHavin
107e0 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b  g, 1, &isAgg) ){
107f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
10800 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
10810 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  }.  if( pOrderBy
10820 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
10830 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
10840 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
10850 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
10860 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
10870 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
10880 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10890 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  eExprIsInteger(p
108a0 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43 6f  E, &iCol) && iCo
108b0 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
108c0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
108d0 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
108e0 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20  Delete(pE);.    
108f0 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42      pE = pOrderB
10900 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  y->a[i].pExpr = 
10910 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45  sqliteExprDup(pE
10920 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e  List->a[iCol-1].
10930 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
10940 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10950 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
10960 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61  Parse, base, pTa
10970 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
10980 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
10990 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
109a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
109b0 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
109c0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
109d0 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
109e0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
109f0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
10a00 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
10a10 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
10a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
10a30 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72  iteExprIsInteger
10a40 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29  (pE, &iCol)==0 )
10a50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10a60 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
10a70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
10a80 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20  "ORDER BY terms 
10a90 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d  must not be non-
10aa0 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
10ab0 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  s");.          g
10ac0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
10ad0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10ae0 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
10af0 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
10b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10b10 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
10b20 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
10b30 20 20 22 4f 52 44 45 52 20 42 59 20 63 6f 6c 75    "ORDER BY colu
10b40 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74  mn number %d out
10b50 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
10b60 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20  ld be ".        
10b70 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
10b80 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70  and %d", iCol, p
10b90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
10ba0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
10bb0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10bc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10bd0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72 6f  }.  }.  if( pGro
10be0 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  upBy ){.    for(
10bf0 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  i=0; i<pGroupBy-
10c00 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10c10 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
10c20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
10c30 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
10c40 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
10c50 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
10c60 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26 26  er(pE, &iCol) &&
10c70 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c   iCol>0 && iCol<
10c80 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
10c90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ca0 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
10cb0 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 47 72          pE = pGr
10cc0 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
10cd0 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  r = sqliteExprDu
10ce0 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  p(pEList->a[iCol
10cf0 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  -1].pExpr);.    
10d00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
10d10 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
10d20 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
10d30 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
10d40 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  t, pE) ){.      
10d50 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
10d60 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
10d70 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
10d80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c  heck(pParse, pE,
10d90 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20   isAgg, 0) ){.  
10da0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10db0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
10dc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
10dd0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
10de0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
10df0 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
10e00 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d  eger(pE, &iCol)=
10e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10e20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
10e30 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
10e40 20 20 20 22 47 52 4f 55 50 20 42 59 20 74 65 72     "GROUP BY ter
10e50 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ms must not be n
10e60 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  on-integer const
10e70 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ants");.        
10e80 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
10e90 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
10ea0 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
10eb0 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
10ec0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
10ed0 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
10ee0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
10ef0 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63 6f      "GROUP BY co
10f00 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
10f10 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
10f20 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
10f30 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
10f40 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c  1 and %d", iCol,
10f50 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
10f60 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10f70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10f80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10f90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
10fa0 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
10fb0 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
10fc0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
10fd0 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
10fe0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
10ff0 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
11000 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
11010 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
11020 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
11030 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
11040 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11050 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
11060 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
11070 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
11080 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
11090 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
110a0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
110b0 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  d;..  /* Identif
110c0 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
110d0 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  f we will be usi
110e0 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c  ng them in a cal
110f0 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
11100 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
11110 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
11120 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65  is going to some
11130 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69   other destinati
11140 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  on..  */.  if( e
11150 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
11160 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
11170 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
11180 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70  arse, p->base, p
11190 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
111a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
111b0 74 68 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f  the limiter.  */
111c0 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74  .  if( p->nLimit
111d0 3c 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  <=0 ){.    p->nL
111e0 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70  imit = -1;.    p
111f0 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->nOffset = 0;. 
11200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
11210 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
11220 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Mem++;.    sqlit
11230 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11240 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c  _Integer, -p->nL
11250 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  imit, 0);.    sq
11260 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11270 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
11280 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e  em, 1);.    p->n
11290 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  Limit = iMem;.  
112a0 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74    if( p->nOffset
112b0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  <=0 ){.      p->
112c0 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  nOffset = 0;.   
112d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4d   }else{.      iM
112e0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
112f0 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  m++;.      sqlit
11300 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11310 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f  _Integer, -p->nO
11320 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  ffset, 0);.     
11330 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11340 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
11350 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20   iMem, 1);.     
11360 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 69 4d   p->nOffset = iM
11370 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  em;.    }.  }.. 
11380 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
11390 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
113a0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
113b0 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  M clause.  */.  
113c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
113d0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
113e0 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
113f0 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d  t->a[i].pSelect=
11400 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11410 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
11420 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
11430 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
11440 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62  SRT_TempTable, b
11450 61 73 65 2b 69 2c 0a 20 20 20 20 20 20 20 20 20  ase+i,.         
11460 20 20 20 20 20 20 20 20 70 2c 20 69 2c 20 26 69          p, i, &i
11470 73 41 67 67 29 3b 0a 20 20 20 20 70 54 61 62 4c  sAgg);.    pTabL
11480 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
11490 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
114a0 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 65  Where;.    if( e
114b0 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
114c0 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  ck ){.      pOrd
114d0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
114e0 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47  By;.    }.    pG
114f0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
11500 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e  upBy;.    pHavin
11510 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
11520 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d      isDistinct =
11530 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
11540 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
11550 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69  to see if this i
11560 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61  s a subquery tha
11570 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65  t can be "flatte
11580 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61  ned" into its pa
11590 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c  rent..  ** If fl
115a0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f  attening is a po
115b0 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20  ssiblity, do so 
115c0 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
115d0 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20  iately.  .  */. 
115e0 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20   if( pParent && 
115f0 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20  pParentAgg &&.  
11600 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75      flattenSubqu
11610 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61 72  ery(pParse, pPar
11620 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
11630 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41  *pParentAgg, isA
11640 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69  gg) ){.    if( i
11650 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41  sAgg ) *pParentA
11660 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  gg = 1;.    retu
11670 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
11680 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
11690 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c   types if we wil
116a0 6c 20 62 65 20 75 73 69 6e 67 20 61 20 63 61 6c  l be using a cal
116b0 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
116c0 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
116d0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
116e0 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 64 65  is going to a de
116f0 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 0a  stination other.
11700 20 20 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c 6c    ** than a call
11710 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
11720 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
11730 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
11740 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
11750 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c  pParse, p->base,
11760 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
11770 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
11780 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
11790 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
117a0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
117b0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
117c0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
117d0 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
117e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
117f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
11800 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29  nTemp, iParm, 0)
11810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61  ;.  }..  /* Do a
11820 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67  n analysis of ag
11830 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69  gregate expressi
11840 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ons..  */.  sqli
11850 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 52  teAggregateInfoR
11860 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20  eset(pParse);.  
11870 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72  if( isAgg || pGr
11880 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73 73  oupBy ){.    ass
11890 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67  ert( pParse->nAg
118a0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67  g==0 );.    isAg
118b0 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  g = 1;.    for(i
118c0 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
118d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
118e0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41   if( sqliteExprA
118f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
11900 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
11910 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
11920 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
11930 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
11940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11950 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
11960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
11970 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
11980 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11990 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
119a0 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
119b0 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
119c0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
119d0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
119e0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
119f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11a00 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
11a10 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  & sqliteExprAnal
11a20 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
11a30 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20 29  arse, pHaving) )
11a40 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
11a50 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
11a60 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
11a70 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
11a80 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
11a90 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
11aa0 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11ab0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
11ac0 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  es(pParse, pOrde
11ad0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
11ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
11af0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11b20 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
11b30 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28  gator.  */.  if(
11b40 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 71   isAgg ){.    sq
11b50 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11b60 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30 2c   OP_AggReset, 0,
11b70 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a   pParse->nAgg);.
11b80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11b90 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
11ba0 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  ){.      FuncDef
11bb0 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69   *pFunc;.      i
11bc0 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72  f( (pFunc = pPar
11bd0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
11be0 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e  c)!=0 && pFunc->
11bf0 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a  xFinalize!=0 ){.
11c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11c10 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
11c20 67 49 6e 69 74 2c 20 30 2c 20 69 29 3b 0a 20 20  gInit, 0, i);.  
11c30 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11c40 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
11c50 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33  (char*)pFunc, P3
11c60 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20  _POINTER);.     
11c70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
11c80 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
11c90 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11ca0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
11cb0 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
11cc0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11cd0 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c  (v, OP_AggFocus,
11ce0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
11cf0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
11d00 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  ze the memory ce
11d10 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f 0a  ll to NULL.  */.
11d20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11d30 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  _Mem ){.    sqli
11d40 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11d50 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
11d60 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
11d70 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
11d80 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
11d90 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
11da0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11db0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
11dc0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
11dd0 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
11de0 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69  nct ){.    disti
11df0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
11e00 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
11e10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11e20 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69 6e  OpenTemp, distin
11e30 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ct, 1);.  }else{
11e40 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
11e50 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  -1;.  }..  /* Be
11e60 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
11e70 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49   scan.  */.  pWI
11e80 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72  nfo = sqliteWher
11e90 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
11ea0 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  ->base, pTabList
11eb0 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 0a 20 20  , pWhere, 0, .  
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 20 20 20 20 20 20 70 47 72 6f 75 70            pGroup
11ee0 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72  By ? 0 : &pOrder
11ef0 42 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  By);.  if( pWInf
11f00 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
11f10 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73  ct_end;..  /* Us
11f20 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
11f30 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20  nner loop if we 
11f40 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20  are not dealing 
11f50 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67  with.  ** aggreg
11f60 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
11f70 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  !isAgg ){.    if
11f80 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
11f90 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
11fa0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
11fb0 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
11fc0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
11fd0 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
11fe0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
11ff0 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
12000 61 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f  ak) ){.       go
12010 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12020 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
12030 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
12040 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65 73   with aggregates
12050 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70  , then do the sp
12060 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a  ecial aggregate.
12070 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e    ** processing.
12080 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a    .  */.  else{.
12090 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
120a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62   ){.      int lb
120b0 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  l1;.      for(i=
120c0 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
120d0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
120e0 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
120f0 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
12100 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
12110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12120 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12130 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70  v, OP_MakeKey, p
12140 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
12150 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
12160 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66  arse->db->file_f
12170 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74  ormat>=4 ) sqlit
12180 65 41 64 64 4b 65 79 54 79 70 65 28 76 2c 20 70  eAddKeyType(v, p
12190 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
121a0 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
121b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
121c0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
121d0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f  ddOp(v, OP_AggFo
121e0 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20  cus, 0, lbl1);. 
121f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12200 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
12210 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
12220 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
12230 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
12240 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12250 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
12260 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
12270 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
12280 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12290 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
122a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
122b0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
122c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
122d0 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  l1);.    }.    f
122e0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
122f0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
12300 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
12310 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
12320 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61 41   if( !pParse->aA
12330 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
12340 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
12350 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
12360 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
12370 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d  assert( pE->op==
12380 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
12390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
123a0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
123b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d    for(j=0; j<pE-
123c0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  >pList->nExpr; j
123d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
123e0 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
123f0 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d  arse, pE->pList-
12400 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
12410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12420 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12430 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
12440 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
12450 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12460 70 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c  p(v, OP_AggFunc,
12470 20 30 2c 20 70 45 2d 3e 70 4c 69 73 74 20 3f 20   0, pE->pList ? 
12480 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pE->pList->nExpr
12490 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73   : 0);.      ass
124a0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41 67  ert( pParse->aAg
124b0 67 5b 69 5d 2e 70 46 75 6e 63 21 3d 30 20 29 3b  g[i].pFunc!=0 );
124c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
124d0 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
124e0 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29  Func->xStep!=0 )
124f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
12500 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
12510 2c 20 28 63 68 61 72 2a 29 70 50 61 72 73 65 2d  , (char*)pParse-
12520 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2c 20  >aAgg[i].pFunc, 
12530 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
12540 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64   }.  }..  /* End
12550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
12560 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
12570 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70  sqliteWhereEnd(p
12580 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66  WInfo);..  /* If
12590 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69   we are processi
125a0 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77  ng aggregates, w
125b0 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70  e need to set up
125c0 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20   a second loop. 
125d0 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20   ** over all of 
125e0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61  the aggregate va
125f0 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73  lues and process
12600 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   them..  */.  if
12610 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ( isAgg ){.    i
12620 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69  nt endagg = sqli
12630 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
12640 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  v);.    int star
12650 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61  tagg;.    starta
12660 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  gg = sqliteVdbeA
12670 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65  ddOp(v, OP_AggNe
12680 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a  xt, 0, endagg);.
12690 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41      pParse->useA
126a0 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  gg = 1;.    if( 
126b0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
126c0 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
126d0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
126e0 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31 29  ng, startagg, 1)
126f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12700 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12710 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
12720 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
12730 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
12740 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
12750 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 73          iParm, s
12760 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67 29  tartagg, endagg)
12770 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
12780 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
12790 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
127a0 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
127b0 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20   0, startagg);. 
127c0 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
127d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
127e0 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
127f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12800 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
12810 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
12820 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
12830 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
12840 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
12850 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
12860 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
12870 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
12880 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
12890 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
128a0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
128b0 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  By ){.    genera
128c0 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c  teSortTail(p, v,
128d0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
128e0 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
128f0 20 7d 0a 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20   }...  /* Issue 
12900 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20  a null callback 
12910 69 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20  if that is what 
12920 74 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a  the user wants..
12930 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
12940 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26  ==SRT_Callback &
12950 26 0a 20 20 20 20 28 70 50 61 72 73 65 2d 3e 75  &.    (pParse->u
12960 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c  seCallback==0 ||
12970 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
12980 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c  ags & SQLITE_Nul
12990 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20  lCallback)!=0). 
129a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
129b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
129c0 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69  llCallback, pELi
129d0 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  st->nExpr, 0);. 
129e0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c   }..  /* The SEL
129f0 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
12a00 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
12a10 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
12a20 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
12a30 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
12a40 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
12a50 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
12a60 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
12a70 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
12a80 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
12a90 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
12aa0 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
12ab0 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
12ac0 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
12ad0 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74 65   sqliteAggregate
12ae0 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73 65  InfoReset(pParse
12af0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12b00 7d 0a                                            }.