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

Artifact 14e2e2a512f4edfc75fb310ebcb502ff3ee87402:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 33 30  select.c,v 1.130
0200: 20 32 30 30 33 2f 30 33 2f 33 31 20 31 33 3a 33   2003/03/31 13:3
0210: 36 3a 30 39 20 64 72 68 20 45 78 70 20 24 0a 2a  6:09 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: 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
ce90: 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
cea0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
ceb0: 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
cec0: 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
ced0: 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
cee0: 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
cef0: 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
cf00: 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
cf10: 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
cf20: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
cf30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
cf40: 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
cf50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cf60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
cf70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cf80: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
cf90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
cfa0: 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
cfb0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
cfc0: 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
cfd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
cfe0: 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
cff0: 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
d000: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
d010: 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
d020: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
d030: 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
d040: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
d050: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
d060: 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
d070: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
d080: 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
d090: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
d0a0: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
d0b0: 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
d0c0: 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
d0d0: 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
d0e0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
d0f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
d100: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
d110: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
d120: 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
d130: 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
d140: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
d150: 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
d160: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
d170: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
d180: 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
d190: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  uery */.  int i;
d1a0: 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 2c 20  .  int iParent, 
d1b0: 69 53 75 62 3b 0a 20 20 45 78 70 72 20 2a 70 57  iSub;.  Expr *pW
d1c0: 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  here;..  /* Chec
d1d0: 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
d1e0: 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
d1f0: 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
d200: 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  f not..  */.  if
d210: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
d220: 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
d230: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
d240: 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
d250: 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
d260: 53 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20  Src );.  pSub = 
d270: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
d280: 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
d290: 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
d2a0: 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
d2b0: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
d2c0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71  rn 0;.  if( subq
d2d0: 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
d2e0: 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
d2f0: 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20  rn 0;.  pSubSrc 
d300: 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
d310: 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
d320: 29 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  );.  if( pSubSrc
d330: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
d340: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75  rn 0;.  if( (pSu
d350: 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  b->isDistinct ||
d360: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30   pSub->nLimit>=0
d370: 29 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72  ) &&  (pSrc->nSr
d380: 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
d390: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
d3a0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73    }.  if( (p->is
d3b0: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e  Distinct || p->n
d3c0: 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62  Limit>=0) && sub
d3d0: 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
d3e0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
d3f0: 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
d400: 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
d410: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
d420: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
d430: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
d440: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
d450: 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
d460: 2a 2a 20 69 2d 74 68 20 65 6e 74 72 79 20 6f 66  ** i-th entry of
d470: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
d480: 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
d490: 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72  ery..  */.  iPar
d4a0: 65 6e 74 20 3d 20 70 2d 3e 62 61 73 65 20 2b 20  ent = p->base + 
d4b0: 69 46 72 6f 6d 3b 0a 20 20 69 53 75 62 20 3d 20  iFrom;.  iSub = 
d4c0: 70 53 75 62 2d 3e 62 61 73 65 3b 0a 20 20 73 75  pSub->base;.  su
d4d0: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
d4e0: 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
d4f0: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
d500: 75 62 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  ub);.  pList = p
d510: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
d520: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
d530: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
d540: 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
d550: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
d560: 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
d570: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
d580: 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
d590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
d5a0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
d5b0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45  sqliteStrNDup(pE
d5c0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78  xpr->span.z, pEx
d5d0: 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20  pr->span.n);.   
d5e0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41   }.  }.  if( isA
d5f0: 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  gg ){.    substE
d600: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
d610: 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
d620: 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62  ub->pEList, iSub
d630: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
d640: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
d650: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
d660: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 20  st, iSub);.  }. 
d670: 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
d680: 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rBy ){.    asser
d690: 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
d6a0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  0 );.    p->pOrd
d6b0: 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
d6c0: 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d  derBy;.    pSub-
d6d0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
d6e0: 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49     changeTablesI
d6f0: 6e 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  nList(p->pOrderB
d700: 79 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74  y, iSub, iParent
d710: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
d720: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
d730: 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
d740: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
d750: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
d760: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 20  st, iSub);.  }. 
d770: 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
d780: 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
d790: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
d7a0: 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
d7b0: 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d     if( iParent!=
d7c0: 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68  iSub ){.      ch
d7d0: 61 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65 72  angeTables(pWher
d7e0: 65 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74  e, iSub, iParent
d7f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
d800: 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
d810: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
d820: 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
d830: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
d840: 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
d850: 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
d860: 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
d870: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
d880: 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
d890: 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
d8a0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69   pSub->pEList, i
d8b0: 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53  Sub);.    if( pS
d8c0: 75 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20  ub->pHaving ){. 
d8d0: 20 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69       Expr *pHavi
d8e0: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ng = sqliteExprD
d8f0: 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
d900: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 61  );.      if( iPa
d910: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
d920: 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c        changeTabl
d930: 65 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75 62  es(pHaving, iSub
d940: 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , iParent);.    
d950: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
d960: 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
d970: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
d980: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
d990: 4e 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ND, p->pHaving, 
d9a0: 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20  pHaving, 0);.   
d9b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d9c0: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
d9d0: 48 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a  Having;.      }.
d9e0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
d9f0: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
da00: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
da10: 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72  pBy = sqliteExpr
da20: 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47  ListDup(pSub->pG
da30: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66 28  roupBy);.    if(
da40: 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29   iParent!=iSub )
da50: 7b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61  {.      changeTa
da60: 62 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 47  blesInList(p->pG
da70: 72 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69 50  roupBy, iSub, iP
da80: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
da90: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68  }else if( p->pWh
daa0: 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ere==0 ){.    p-
dab0: 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
dac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
dad0: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65  ubstExpr(p->pWhe
dae0: 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
daf0: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
db00: 3b 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65  ;.    if( pWhere
db10: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68   ){.      p->pWh
db20: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
db30: 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65  (TK_AND, p->pWhe
db40: 72 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  re, pWhere, 0);.
db50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69      }.  }.  p->i
db60: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
db70: 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
db80: 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a  b->isDistinct;..
db90: 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d    if( pSub->nLim
dba0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  it>=0 ){.    if(
dbb0: 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a   p->nLimit<0 ){.
dbc0: 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20        p->nLimit 
dbd0: 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a  = pSub->nLimit;.
dbe0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
dbf0: 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73  >nLimit+p->nOffs
dc00: 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  et > pSub->nLimi
dc10: 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20  t+pSub->nOffset 
dc20: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d  ){.      p->nLim
dc30: 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69  it = pSub->nLimi
dc40: 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65  t + pSub->nOffse
dc50: 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t - p->nOffset;.
dc60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
dc70: 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e  Offset += pSub->
dc80: 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 49  nOffset;..  /* I
dc90: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  f the subquery c
dca0: 6f 6e 74 61 69 6e 73 20 73 75 62 71 75 65 72 69  ontains subqueri
dcb0: 65 73 20 6f 66 20 69 74 73 20 6f 77 6e 2c 20 74  es of its own, t
dcc0: 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 2a  hat were not.  *
dcd0: 2a 20 66 6c 61 74 74 65 6e 65 64 2c 20 74 68 65  * flattened, the
dce0: 6e 20 63 6f 64 65 20 77 69 6c 6c 20 68 61 76 65  n code will have
dcf0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
dd00: 6e 65 72 61 74 65 64 20 74 6f 20 70 75 74 0a 20  nerated to put. 
dd10: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 73 20   ** the results 
dd20: 6f 66 20 74 68 6f 73 65 20 73 75 62 2d 73 75 62  of those sub-sub
dd30: 71 75 65 72 69 65 73 20 69 6e 74 6f 20 56 44 42  queries into VDB
dd40: 45 20 63 75 72 73 6f 72 73 20 72 65 6c 61 74 69  E cursors relati
dd50: 76 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ve.  ** to the s
dd60: 75 62 71 75 65 72 79 2e 20 20 57 65 20 6d 75 73  ubquery.  We mus
dd70: 74 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20  t translate the 
dd80: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e  cursor number in
dd90: 74 6f 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 73  to values.  ** s
dda0: 75 69 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20  uitable for use 
ddb0: 62 79 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  by the outer que
ddc0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
ddd0: 3d 30 3b 20 69 3c 70 53 75 62 53 72 63 2d 3e 6e  =0; i<pSubSrc->n
dde0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56  Src; i++){.    V
ddf0: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 66 28 20  dbe *v;.    if( 
de00: 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  pSubSrc->a[i].pS
de10: 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
de20: 6e 75 65 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  nue;.    v = sql
de30: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
de40: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  e);.    sqliteVd
de50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
de60: 6e 61 6d 65 43 75 72 73 6f 72 2c 20 70 53 75 62  nameCursor, pSub
de70: 2d 3e 62 61 73 65 2b 69 2c 20 70 2d 3e 62 61 73  ->base+i, p->bas
de80: 65 2b 69 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  e+i);.  }..  if(
de90: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
dea0: 70 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b  pTab && pSrc->a[
deb0: 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54  iFrom].pTab->isT
dec0: 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
ded0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
dee0: 65 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72  e(0, pSrc->a[iFr
def0: 6f 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 7d 0a 20  om].pTab);.  }. 
df00: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
df10: 70 54 61 62 20 3d 20 70 53 75 62 53 72 63 2d 3e  pTab = pSubSrc->
df20: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 53 75  a[0].pTab;.  pSu
df30: 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20  bSrc->a[0].pTab 
df40: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
df50: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53  Src->a[iFrom].pS
df60: 65 6c 65 63 74 3d 3d 70 53 75 62 20 29 3b 0a 20  elect==pSub );. 
df70: 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
df80: 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 53 72  pSelect = pSubSr
df90: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
dfa0: 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d  .  pSubSrc->a[0]
dfb0: 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
dfc0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
dfd0: 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75  te(pSub);.  retu
dfe0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 1;.}../*.** A
dff0: 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
e000: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
e010: 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75  ed in as an argu
e020: 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69  ment to see if i
e030: 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65  t.** is a simple
e040: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
e050: 71 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73  query.  If it is
e060: 20 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20   and this query 
e070: 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66  can be.** satisf
e080: 69 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ied using a sing
e090: 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62  le seek to the b
e0a0: 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20  eginning or end 
e0b0: 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20  of an index,.** 
e0c0: 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68  then generate th
e0d0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  e code for this 
e0e0: 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72  SELECT and retur
e0f0: 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73  n 1.  If this is
e100: 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c   not a .** simpl
e110: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
e120: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74   query, then ret
e130: 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73  urn 0;.**.** A s
e140: 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d  imply min() or m
e150: 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73  ax() query looks
e160: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
e170: 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  *    SELECT min(
e180: 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
e190: 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  *    SELECT max(
e1a0: 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a  a) FROM table;.*
e1b0: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d  *.** The query m
e1c0: 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ay have only a s
e1d0: 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69  ingle table in i
e1e0: 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74  ts FROM argument
e1f0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20  .  There.** can 
e200: 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f  be no GROUP BY o
e210: 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52  r HAVING or WHER
e220: 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  E clauses.  The 
e230: 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a  result set must.
e240: 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20  ** be the min() 
e250: 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69  or max() of a si
e260: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ngle column of t
e270: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63  he table.  The c
e280: 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  olumn.** in the 
e290: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
e2a0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
e2b0: 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  indexed..**.** T
e2c0: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
e2d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72   this routine ar
e2e0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f  e the same as fo
e2f0: 72 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 29  r sqliteSelect()
e300: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
e310: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
e320: 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  hat routine for 
e330: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
e340: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
e350: 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d  c int simpleMinM
e360: 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70  axQuery(Parse *p
e370: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e380: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
e390: 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20   iParm){.  Expr 
e3a0: 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43  *pExpr;.  int iC
e3b0: 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ol;.  Table *pTa
e3c0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
e3d0: 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
e3e0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73  Vdbe *v;.  int s
e3f0: 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e  eekOp;.  int con
e400: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 65 4c  t;.  ExprList eL
e410: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
e420: 70 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73  prList_item eLis
e430: 74 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65  tItem;..  /* Che
e440: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
e450: 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
e460: 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
e470: 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
e480: 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
e490: 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
e4a0: 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
e4b0: 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
e4c0: 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
e4d0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
e4e0: 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
e4f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e500: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
e510: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
e520: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
e530: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
e540: 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
e550: 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
e560: 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
e570: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69    if( pExpr->pLi
e580: 73 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  st==0 || pExpr->
e590: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
e5a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e5b0: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
e5c0: 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=3 ) return 0;.
e5d0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e    if( sqliteStrN
e5e0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
e5f0: 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
e600: 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
e610: 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c  OP_Rewind;.  }el
e620: 73 65 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  se if( sqliteStr
e630: 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b  NICmp(pExpr->tok
e640: 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30  en.z,"max",3)==0
e650: 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
e660: 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73   OP_Last;.  }els
e670: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
e680: 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70  .  }.  pExpr = p
e690: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
e6a0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
e6b0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
e6c0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
e6d0: 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e    iCol = pExpr->
e6e0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20  iColumn;.  pTab 
e6f0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
e700: 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  pTab;..  /* If w
e710: 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69  e get to here, i
e720: 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72  t means the quer
e730: 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  y is of the corr
e740: 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43  ect form..  ** C
e750: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
e760: 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64  e we have an ind
e770: 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78  ex and make pIdx
e780: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20   point to the.  
e790: 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  ** appropriate i
e7a0: 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69  ndex.  If the mi
e7b0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
e7c0: 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  on an INTEGER PR
e7d0: 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63  IMARY.  ** key c
e7e0: 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20  olumn, no index 
e7f0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  is necessary so 
e800: 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c  set pIdx to NULL
e810: 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73  .  If no.  ** us
e820: 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f  able index is fo
e830: 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  und, return 0.. 
e840: 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30   */.  if( iCol<0
e850: 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30   ){.    pIdx = 0
e860: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
e870: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
e880: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e890: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
e8a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
e8b0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b  x->nColumn>=1 );
e8c0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
e8d0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
e8e0: 6f 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ol ) break;.    
e8f0: 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  }.    if( pIdx==
e900: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
e910: 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
e920: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
e930: 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
e940: 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20  g the callback. 
e950: 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
e960: 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
e970: 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
e980: 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20  g to a table or 
e990: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20  a memory cell.. 
e9a0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
e9b0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e9c0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
e9d0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 65 44  turn 0;.  if( eD
e9e0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
e9f0: 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
ea00: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
ea10: 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d  rse, p->base, p-
ea20: 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74  >pSrc, p->pEList
ea30: 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  );.    generateC
ea40: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
ea50: 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e 70  e, p->base, p->p
ea60: 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  Src, p->pEList);
ea70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
ea80: 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
ea90: 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
eaa0: 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
eab0: 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
eac0: 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
ead0: 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
eae0: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
eaf0: 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
eb00: 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
eb10: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
eb20: 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
eb30: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
eb40: 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
eb50: 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
eb60: 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
eb70: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
eb80: 28 20 21 70 50 61 72 73 65 2d 3e 73 63 68 65 6d  ( !pParse->schem
eb90: 61 56 65 72 69 66 69 65 64 20 26 26 20 28 70 50  aVerified && (pP
eba0: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
ebb0: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
ebc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
ebd0: 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  teCodeVerifySche
ebe0: 6d 61 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  ma(pParse);.  }.
ebf0: 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65    base = p->base
ec00: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
ec10: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
ec20: 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
ec30: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
ec40: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
ec50: 61 64 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e  ad, base, pTab->
ec60: 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 56  tnum);.  sqliteV
ec70: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
ec80: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
ec90: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  P3_STATIC);.  if
eca0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
ecb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ecc0: 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
ecd0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
ece0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ecf0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
ed00: 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b  , pIdx->iDb, 0);
ed10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
ed20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
ed30: 65 61 64 2c 20 62 61 73 65 2b 31 2c 20 70 49 64  ead, base+1, pId
ed40: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71  x->tnum);.    sq
ed50: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
ed60: 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
ed70: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
ed80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
ed90: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
eda0: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
edb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
edc0: 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20  v, OP_IdxRecno, 
edd0: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
ede0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
edf0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
ee00: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
ee10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ee20: 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c  OP_MoveTo, base,
ee30: 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
ee40: 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
ee50: 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
ee60: 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
ee70: 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
ee80: 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
ee90: 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
eea0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 63 6f  pr = pExpr;.  co
eeb0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
eec0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73  akeLabel(v);.  s
eed0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
eee0: 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74  Parse, p, &eList
eef0: 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65  , 0, 0, 0, -1, e
ef00: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e  Dest, iParm, con
ef10: 74 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  t, cont);.  sqli
ef20: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
ef30: 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73  el(v, cont);.  s
ef40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ef50: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
ef60: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  , 0);.  return 1
ef70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
ef80: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
ef90: 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
efa0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
efb0: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
efc0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
efd0: 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
efe0: 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76  ding on the.** v
eff0: 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e  alue of eDest an
f000: 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  d iParm..**.**  
f010: 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20     eDest Value  
f020: 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20       Result.**  
f030: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
f040: 20 20 20 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 2d 0a 2a  --------------.*
f070: 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
f080: 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
f090: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
f0a0: 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
f0b0: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
f0c0: 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
f0d0: 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
f0e0: 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
f0f0: 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  l iParm.**.**   
f100: 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
f110: 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
f120: 61 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62  as keys of a tab
f130: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
f140: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
f150: 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
f160: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
f170: 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
f180: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
f190: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
f1a0: 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
f1b0: 65 20 72 65 73 75 6c 74 73 20 66 6f 72 6d 20 74  e results form t
f1c0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f1d0: 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
f1e0: 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20      SRT_Table   
f1f0: 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
f200: 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
f210: 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
f220: 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65   The table above
f230: 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20   is incomplete. 
f240: 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73   Additional eDis
f250: 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65 20  t value have be 
f260: 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74  added.** since t
f270: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20  his comment was 
f280: 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68  written.  See th
f290: 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  e selectInnerLoo
f2a0: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
f2b0: 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c  .** a complete l
f2c0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c  isting of the al
f2d0: 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20  lowed values of 
f2e0: 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20  eDest and their 
f2f0: 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20  meanings..**.** 
f300: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
f310: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
f320: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
f330: 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
f340: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
f350: 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
f360: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
f370: 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
f380: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
f390: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f3a0: 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
f3b0: 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
f3c0: 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
f3d0: 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
f3e0: 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
f3f0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  o do that..**.**
f400: 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61   The pParent, pa
f410: 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50  rentTab, and *pP
f420: 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20  arentAgg fields 
f430: 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66  are filled in if
f440: 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20   this.** SELECT 
f450: 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20  is a subquery.  
f460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
f470: 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20   try to combine 
f480: 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77  this SELECT.** w
f490: 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74  ith its parent t
f4a0: 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  o form a single 
f4b0: 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20  flat query.  In 
f4c0: 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67  so doing, it mig
f4d0: 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65  ht.** change the
f4e0: 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72   parent query fr
f4f0: 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61  om a non-aggrega
f500: 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61  te to an aggrega
f510: 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72  te query..** For
f520: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68   that reason, th
f530: 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61  e pParentAgg fla
f540: 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61  g is passed as a
f550: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a   pointer, so it.
f560: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
f570: 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  d..**.** Example
f580: 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e   1:   The meanin
f590: 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74  g of the pParent
f5a0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
f5b0: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
f5c0: 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45  OM t1 JOIN (SELE
f5d0: 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46  CT x, count(*) F
f5e0: 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b  ROM t2) JOIN t3;
f5f0: 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20  .**    \        
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
f610: 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
f620: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
f630: 2f 0a 2a 2a 20 20 20 20 20 5c 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 20                  
f670: 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f  /.**      \_____
f680: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
f690: 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
f6a0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
f6b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f6c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
f6d0: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f6e0: 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74  y first.   For t
f6f0: 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61  hat call,.** pPa
f700: 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  rent will be NUL
f710: 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70  L.  During the p
f720: 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
f730: 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68   outer query, th
f740: 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  is .** routine i
f750: 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
f760: 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74  vely to handle t
f770: 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f  he subquery.  Fo
f780: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a  r the recursive.
f790: 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74  ** call, pParent
f7a0: 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74   will point to t
f7b0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
f7c0: 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62   Because the sub
f7d0: 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20  query is.** the 
f7e0: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69  second element i
f7f0: 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  n a three-way jo
f800: 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61  in, the parentTa
f810: 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  b parameter will
f820: 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e  .** be 1 (the 2n
f830: 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69  d value of a 0-i
f840: 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a  ndexed array.).*
f850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 53 65 6c 65  /.int sqliteSele
f860: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
f870: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
f880: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
f890: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
f8a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
f8b0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
f8c0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
f8d0: 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ed. */.  int eDe
f8e0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
f8f0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
f900: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
f910: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f930: 41 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64  A parameter used
f940: 20 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69   by the eDest di
f950: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
f960: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
f970: 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  nt,       /* Ano
f980: 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20  ther SELECT for 
f990: 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20  which this is a 
f9a0: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69  sub-query */.  i
f9b0: 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20  nt parentTab,   
f9c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
f9d0: 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  n pParent->pSrc 
f9e0: 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  of this query */
f9f0: 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41  .  int *pParentA
fa00: 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  gg        /* Tru
fa10: 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65  e if pParent use
fa20: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
fa30: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tions */.){.  in
fa40: 74 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f  t i;.  WhereInfo
fa50: 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65   *pWInfo;.  Vdbe
fa60: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67   *v;.  int isAgg
fa70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
fa80: 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
fa90: 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
faa0: 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
fab0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
fac0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
fad0: 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
fae0: 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
faf0: 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
fb00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
fb10: 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
fb20: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
fb30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
fb40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
fb50: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
fb60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
fb70: 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
fb80: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
fb90: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
fba0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
fbb0: 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
fbc0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
fbd0: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
fbe0: 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
fbf0: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
fc00: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
fc10: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
fc20: 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
fc30: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
fc40: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
fc50: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
fc60: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
fc70: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
fc80: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
fc90: 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
fca0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
fcb0: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
fcc0: 20 20 2f 2a 20 46 69 72 73 74 20 63 75 72 73 6f    /* First curso
fcd0: 72 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  r available for 
fce0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  use */.  int rc 
fcf0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
fd00: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
fd10: 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
fd20: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
fd30: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
fd40: 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
fd50: 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72  nErr || p==0 ) r
fd60: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
fd70: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
fd80: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
fd90: 4c 45 43 54 2c 20 30 2c 20 30 29 20 29 20 72 65  LECT, 0, 0) ) re
fda0: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  turn 1;..  /* If
fdb0: 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
fdc0: 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
fdd0: 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
fde0: 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
fdf0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
fe00: 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
fe10: 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
fe20: 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
fe30: 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20   iParm);.  }..  
fe40: 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
fe50: 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
fe60: 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
fe70: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
fe80: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
fe90: 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
fea0: 70 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72  pWhere;.  pOrder
feb0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
fec0: 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
fed0: 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
fee0: 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
fef0: 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  ng;.  isDistinct
ff00: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
ff10: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
ff20: 20 61 20 62 6c 6f 63 6b 20 6f 66 20 56 44 42 45   a block of VDBE
ff30: 20 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 66 6f   cursors, one fo
ff40: 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20  r each table in 
ff50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
ff60: 0a 20 20 2a 2a 20 54 68 65 20 57 48 45 52 45 20  .  ** The WHERE 
ff70: 70 72 6f 63 65 73 73 69 6e 67 20 72 65 71 75 69  processing requi
ff80: 72 65 73 20 74 68 61 74 20 74 68 65 20 63 75 72  res that the cur
ff90: 73 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61 62  sors for the tab
ffa0: 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
ffb0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 65 20 63  FROM clause be c
ffc0: 6f 6e 73 65 63 75 74 69 76 65 2e 0a 20 20 2a 2f  onsecutive..  */
ffd0: 0a 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73  .  base = p->bas
ffe0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
fff0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
10000 20 2b 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   += pTabList->nS
10010 72 63 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rc;..  /* .  ** 
10020 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65  Do not even atte
10030 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20  mpt to generate 
10040 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68  any code if we h
10050 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  ave already seen
10060 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66  .  ** errors bef
10070 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
10080 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20   starts..  */.  
10090 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
100a0 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
100b0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61  _end;..  /* Expa
100c0 6e 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73  nd any "*" terms
100d0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
100e0 65 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c  et.  (For exampl
100f0 65 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a  e the "*" in.  *
10100 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  * "SELECT * FROM
10110 20 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49   t1")  The fillI
10120 6e 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f  nColumnlist() ro
10130 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
10140 73 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20  some.  ** other 
10150 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73  housekeeping - s
10160 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
10170 6d 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c  mment for detail
10180 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69  s..  */.  if( fi
10190 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  llInColumnList(p
101a0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
101b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
101c0 3b 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d  ;.  }.  pWhere =
101d0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45   p->pWhere;.  pE
101e0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
101f0 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
10200 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
10210 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
10220 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
10230 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
10240 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
10250 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
10260 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
10270 2f 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  /.  if( (eDest==
10280 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
10290 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
102a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
102b0 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
102c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
102d0 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
102e0 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
102f0 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
10300 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
10310 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
10320 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
10330 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
10340 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
10350 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
10360 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
10370 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
10380 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
10390 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65  _Union:.    case
103a0 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20   SRT_Except:.   
103b0 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72   case SRT_Discar
103c0 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  d:.      pOrderB
103d0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  y = 0;.      bre
103e0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
103f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10400 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
10410 70 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64  point, we should
10420 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20   have allocated 
10430 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20  all the cursors 
10440 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65  that we.  ** nee
10450 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71  d to handle subq
10460 75 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72  uerys and tempor
10470 61 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20  ary tables.  .  
10480 2a 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20  **.  ** Resolve 
10490 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
104a0 20 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74   and do a semant
104b0 69 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c  ics check on all
104c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
104d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
104e0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
104f0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
10500 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
10510 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
10520 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 30 2c  se, pTabList, 0,
10530 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
10540 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  xpr) ){.      go
10550 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
10560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
10570 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
10580 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  rse, pEList->a[i
10590 5d 2e 70 45 78 70 72 2c 20 31 2c 20 26 69 73 41  ].pExpr, 1, &isA
105a0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  gg) ){.      got
105b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
105c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
105d0 68 65 72 65 20 29 7b 0a 20 20 20 20 69 66 28 20  here ){.    if( 
105e0 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
105f0 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
10600 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
10610 69 73 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a  ist, pWhere) ){.
10620 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10630 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
10640 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
10650 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57 68  heck(pParse, pWh
10660 65 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  ere, 0, 0) ){.  
10670 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
10680 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  end;.    }.    s
10690 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a 6f 69 6e  qliteOracle8Join
106a0 46 69 78 75 70 28 62 61 73 65 2c 20 70 54 61 62  Fixup(base, pTab
106b0 4c 69 73 74 2c 20 70 57 68 65 72 65 29 3b 0a 20  List, pWhere);. 
106c0 20 7d 0a 20 20 69 66 28 20 70 48 61 76 69 6e 67   }.  if( pHaving
106d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 47 72 6f   ){.    if( pGro
106e0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
106f0 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
10700 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50  pParse, "a GROUP
10710 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65   BY clause is re
10720 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41  quired before HA
10730 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 67 6f  VING");.      go
10740 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
10750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
10760 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
10770 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
10780 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
10790 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  , pHaving) ){.  
107a0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
107b0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
107c0 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
107d0 63 6b 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  ck(pParse, pHavi
107e0 6e 67 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29  ng, 1, &isAgg) )
107f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
10800 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
10810 20 7d 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42   }.  if( pOrderB
10820 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
10830 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
10840 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
10850 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
10860 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
10870 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
10880 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
10890 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
108a0 70 45 2c 20 26 69 43 6f 6c 29 20 26 26 20 69 43  pE, &iCol) && iC
108b0 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45  ol>0 && iCol<=pE
108c0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
108d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
108e0 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
108f0 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72       pE = pOrder
10900 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
10910 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
10920 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d  EList->a[iCol-1]
10930 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
10940 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10950 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
10960 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54  pParse, base, pT
10970 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
10980 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pE) ){.        g
10990 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
109a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
109b0 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
109c0 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
109d0 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
109e0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
109f0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
10a00 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10a10 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
10a20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
10a30 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65  liteExprIsIntege
10a40 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20  r(pE, &iCol)==0 
10a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10a60 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
10a70 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
10a80 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73   "ORDER BY terms
10a90 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
10aa0 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
10ab0 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ts");.          
10ac0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
10ad0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10ae0 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
10af0 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
10b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10b10 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
10b20 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
10b30 20 20 20 22 4f 52 44 45 52 20 42 59 20 63 6f 6c     "ORDER BY col
10b40 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
10b50 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
10b60 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
10b70 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
10b80 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20   and %d", iCol, 
10b90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
10ba0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
10bb0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
10bc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10bd0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47 72   }.  }.  if( pGr
10be0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f 72  oupBy ){.    for
10bf0 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
10c00 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10c10 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
10c20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
10c30 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70  pGroupBy->a[i].p
10c40 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
10c50 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
10c60 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 26  ger(pE, &iCol) &
10c70 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  & iCol>0 && iCol
10c80 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
10c90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10ca0 65 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  eExprDelete(pE);
10cb0 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 47  .        pE = pG
10cc0 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
10cd0 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  pr = sqliteExprD
10ce0 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
10cf0 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
10d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
10d10 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
10d20 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
10d30 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
10d40 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  st, pE) ){.     
10d50 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10d60 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
10d70 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10d80 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
10d90 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20  , isAgg, 0) ){. 
10da0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
10db0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
10dc0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10dd0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
10de0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  E) ){.        if
10df0 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  ( sqliteExprIsIn
10e00 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
10e10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10e20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
10e30 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
10e40 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 74 65      "GROUP BY te
10e50 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  rms must not be 
10e60 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73  non-integer cons
10e70 74 61 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  tants");.       
10e80 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10e90 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  nd;.        }els
10ea0 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c  e if( iCol<=0 ||
10eb0 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
10ec0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
10ed0 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
10ee0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
10ef0 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63       "GROUP BY c
10f00 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20  olumn number %d 
10f10 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
10f20 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
10f30 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e          "between
10f40 20 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c   1 and %d", iCol
10f50 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
10f60 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
10f70 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
10f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10f90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
10fa0 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65  heck for the spe
10fb0 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d  cial case of a m
10fc0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
10fd0 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66  nction by itself
10fe0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  .  ** in the res
10ff0 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ult set..  */.  
11000 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  if( simpleMinMax
11010 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
11020 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29   eDest, iParm) )
11030 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  {.    rc = 0;.  
11040 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
11050 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  d;.  }..  /* Beg
11060 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
11070 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
11080 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
11090 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
110a0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
110b0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd;..  /* Identi
110c0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
110d0 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
110e0 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
110f0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
11100 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
11110 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
11120 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
11130 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
11140 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
11150 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
11160 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
11170 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
11180 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20  Parse, p->base, 
11190 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
111a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
111b0 20 74 68 65 20 6c 69 6d 69 74 65 72 0a 20 20 2a   the limiter.  *
111c0 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69  /.  if( p->nLimi
111d0 74 3c 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  t<=0 ){.    p->n
111e0 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
111f0 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->nOffset = 0;.
11200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
11210 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
11220 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nMem++;.    sqli
11230 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11240 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
11250 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73  Limit, 0);.    s
11260 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11270 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
11280 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e  Mem, 1);.    p->
11290 6e 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  nLimit = iMem;. 
112a0 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65     if( p->nOffse
112b0 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  t<=0 ){.      p-
112c0 3e 6e 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >nOffset = 0;.  
112d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
112e0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
112f0 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  em++;.      sqli
11300 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11310 50 5f 49 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e  P_Integer, -p->n
11320 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
11330 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11340 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
11350 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  , iMem, 1);.    
11360 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 69    p->nOffset = i
11370 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Mem;.    }.  }..
11380 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11390 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
113a0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
113b0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  OM clause.  */. 
113c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
113d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
113e0 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  {.    if( pTabLi
113f0 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
11400 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
11410 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74      sqliteSelect
11420 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
11430 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  t->a[i].pSelect,
11440 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20   SRT_TempTable, 
11450 62 61 73 65 2b 69 2c 0a 20 20 20 20 20 20 20 20  base+i,.        
11460 20 20 20 20 20 20 20 20 20 70 2c 20 69 2c 20 26           p, i, &
11470 69 73 41 67 67 29 3b 0a 20 20 20 20 70 54 61 62  isAgg);.    pTab
11480 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
11490 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
114a0 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20  pWhere;.    if( 
114b0 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
114c0 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  ack ){.      pOr
114d0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
114e0 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rBy;.    }.    p
114f0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
11500 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69  oupBy;.    pHavi
11510 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
11520 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
11530 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
11540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
11550 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
11560 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
11570 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
11580 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
11590 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
115a0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
115b0 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
115c0 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
115d0 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
115e0 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
115f0 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
11600 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
11610 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
11620 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
11630 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
11640 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
11650 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
11660 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Agg = 1;.    ret
11670 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
11680 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
11690 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
116a0 6c 6c 20 62 65 20 75 73 69 6e 67 20 61 20 63 61  ll be using a ca
116b0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
116c0 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
116d0 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
116e0 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 64   is going to a d
116f0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
11700 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 63 61 6c  .  ** than a cal
11710 6c 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  lback..  */.  if
11720 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
11730 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e  lback ){.    gen
11740 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
11750 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
11760 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
11770 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  st);.  }..  /* I
11780 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
11790 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
117a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
117b0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
117c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
117d0 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
117e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
117f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
11800 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30  enTemp, iParm, 0
11810 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20  );.  }..  /* Do 
11820 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61  an analysis of a
11830 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
11840 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ions..  */.  sql
11850 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  iteAggregateInfo
11860 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20  Reset(pParse);. 
11870 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47   if( isAgg || pG
11880 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 61 73  roupBy ){.    as
11890 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41  sert( pParse->nA
118a0 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41  gg==0 );.    isA
118b0 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  gg = 1;.    for(
118c0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
118d0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
118e0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
118f0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
11900 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
11910 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
11920 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
11930 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11940 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
11950 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
11960 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
11970 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
11980 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
11990 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
119a0 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
119b0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
119c0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
119d0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
119e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
119f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11a00 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
11a10 26 26 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  && sqliteExprAna
11a20 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
11a30 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 29 20  Parse, pHaving) 
11a40 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
11a50 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
11a60 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
11a70 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
11a80 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
11a90 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11aa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
11ab0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
11ac0 74 65 73 28 70 50 61 72 73 65 2c 20 70 4f 72 64  tes(pParse, pOrd
11ad0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
11ae0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
11af0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
11b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11b10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
11b20 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
11b30 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66  egator.  */.  if
11b40 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
11b50 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11b60 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 30  , OP_AggReset, 0
11b70 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b  , pParse->nAgg);
11b80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11b90 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
11ba0 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  +){.      FuncDe
11bb0 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  f *pFunc;.      
11bc0 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61  if( (pFunc = pPa
11bd0 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
11be0 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d  nc)!=0 && pFunc-
11bf0 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
11c00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
11c10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
11c20 67 67 49 6e 69 74 2c 20 30 2c 20 69 29 3b 0a 20  ggInit, 0, i);. 
11c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
11c40 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
11c50 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50   (char*)pFunc, P
11c60 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
11c70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11c80 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
11c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
11ca0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
11cb0 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
11cc0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11cd0 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
11ce0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
11cf0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
11d00 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
11d10 65 6c 6c 20 74 6f 20 4e 55 4c 4c 0a 20 20 2a 2f  ell to NULL.  */
11d20 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
11d30 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c  T_Mem ){.    sql
11d40 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11d50 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11d60 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
11d70 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
11d80 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
11d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
11da0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11db0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
11dc0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
11dd0 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
11de0 69 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74  inct ){.    dist
11df0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
11e00 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
11e10 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11e20 5f 4f 70 65 6e 54 65 6d 70 2c 20 64 69 73 74 69  _OpenTemp, disti
11e30 6e 63 74 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  nct, 1);.  }else
11e40 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
11e50 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42   -1;.  }..  /* B
11e60 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
11e70 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57  e scan.  */.  pW
11e80 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65  Info = sqliteWhe
11e90 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
11ea0 70 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73  p->base, pTabLis
11eb0 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 0a 20  t, 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 20 70 47 72 6f 75             pGrou
11ee0 70 42 79 20 3f 20 30 20 3a 20 26 70 4f 72 64 65  pBy ? 0 : &pOrde
11ef0 72 42 79 29 3b 0a 20 20 69 66 28 20 70 57 49 6e  rBy);.  if( pWIn
11f00 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
11f10 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55  ect_end;..  /* U
11f20 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
11f30 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65  inner loop if we
11f40 20 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67   are not dealing
11f50 20 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65   with.  ** aggre
11f60 67 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28  gates.  */.  if(
11f70 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69   !isAgg ){.    i
11f80 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  f( selectInnerLo
11f90 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
11fa0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
11fb0 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20  erBy, distinct, 
11fc0 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  eDest,.         
11fd0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d             iParm
11fe0 2c 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69  , pWInfo->iConti
11ff0 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  nue, pWInfo->iBr
12000 65 61 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 67  eak) ){.       g
12010 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
12020 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12030 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  If we are dealin
12040 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  g with aggregate
12050 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73  s, then do the s
12060 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65  pecial aggregate
12070 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
12080 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  .  .  */.  else{
12090 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
120a0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  y ){.      int l
120b0 62 6c 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  bl1;.      for(i
120c0 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
120d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
120e0 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
120f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
12100 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  upBy->a[i].pExpr
12110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12120 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12130 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20  (v, OP_MakeKey, 
12140 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
12150 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
12160 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
12170 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69  format>=4 ) sqli
12180 74 65 41 64 64 4b 65 79 54 79 70 65 28 76 2c 20  teAddKeyType(v, 
12190 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
121a0 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64   lbl1 = sqliteVd
121b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
121c0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
121d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46  AddOp(v, OP_AggF
121e0 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a  ocus, 0, lbl1);.
121f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12200 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
12210 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12220 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
12230 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
12240 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
12250 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
12260 2c 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  , pParse->aAgg[i
12270 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
12280 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12290 70 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20  p(v, OP_AggSet, 
122a0 30 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, i);.      }. 
122b0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
122c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
122d0 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bl1);.    }.    
122e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
122f0 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
12300 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
12310 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
12320 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 61    if( !pParse->a
12330 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
12340 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
12350 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  E = pParse->aAgg
12360 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
12370 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d   assert( pE->op=
12380 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
12390 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
123a0 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
123b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
123c0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
123d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
123e0 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
123f0 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74  Parse, pE->pList
12400 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
12410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
12430 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
12440 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
12450 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12460 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63  Op(v, OP_AggFunc
12470 2c 20 30 2c 20 70 45 2d 3e 70 4c 69 73 74 20 3f  , 0, pE->pList ?
12480 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pE->pList->nExp
12490 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 61 73  r : 0);.      as
124a0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41  sert( pParse->aA
124b0 67 67 5b 69 5d 2e 70 46 75 6e 63 21 3d 30 20 29  gg[i].pFunc!=0 )
124c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
124d0 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
124e0 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20  pFunc->xStep!=0 
124f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
12500 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
12510 31 2c 20 28 63 68 61 72 2a 29 70 50 61 72 73 65  1, (char*)pParse
12520 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 2c  ->aAgg[i].pFunc,
12530 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
12540 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e    }.  }..  /* En
12550 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
12560 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20  can loop..  */. 
12570 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e 64 28   sqliteWhereEnd(
12580 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
12590 66 20 77 65 20 61 72 65 20 70 72 6f 63 65 73 73  f we are process
125a0 69 6e 67 20 61 67 67 72 65 67 61 74 65 73 2c 20  ing aggregates, 
125b0 77 65 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75  we need to set u
125c0 70 20 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a  p a second loop.
125d0 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
125e0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 76   the aggregate v
125f0 61 6c 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73  alues and proces
12600 73 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69  s them..  */.  i
12610 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
12620 69 6e 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c  int endagg = sql
12630 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
12640 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  (v);.    int sta
12650 72 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74  rtagg;.    start
12660 61 67 67 20 3d 20 73 71 6c 69 74 65 56 64 62 65  agg = sqliteVdbe
12670 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e  AddOp(v, OP_AggN
12680 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b  ext, 0, endagg);
12690 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 75 73 65  .    pParse->use
126a0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Agg = 1;.    if(
126b0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
126c0 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61    sqliteExprIfFa
126d0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
126e0 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31  ing, startagg, 1
126f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12700 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
12710 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
12720 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
12730 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
12740 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
12750 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20           iParm, 
12760 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67  startagg, endagg
12770 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
12780 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12790 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
127a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
127b0 2c 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a  , 0, startagg);.
127c0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
127d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
127e0 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dagg);.    sqlit
127f0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
12800 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
12810 20 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67    pParse->useAgg
12820 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
12830 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
12840 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
12850 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
12860 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
12870 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
12880 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
12890 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
128a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
128b0 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
128c0 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76  ateSortTail(p, v
128d0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
128e0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
128f0 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 73 73 75 65    }...  /* Issue
12900 20 61 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b   a null callback
12910 20 69 66 20 74 68 61 74 20 69 73 20 77 68 61 74   if that is what
12920 20 74 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e   the user wants.
12930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
12940 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
12950 26 26 0a 20 20 20 20 28 70 50 61 72 73 65 2d 3e  &&.    (pParse->
12960 75 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c  useCallback==0 |
12970 7c 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  | (pParse->db->f
12980 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75  lags & SQLITE_Nu
12990 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a  llCallback)!=0).
129a0 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56    ){.    sqliteV
129b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
129c0 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c  ullCallback, pEL
129d0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  ist->nExpr, 0);.
129e0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45    }..  /* The SE
129f0 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
12a00 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
12a10 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
12a20 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
12a30 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
12a40 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
12a50 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
12a60 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
12a70 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
12a80 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
12a90 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
12aa0 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
12ab0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
12ac0 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
12ad0 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74    sqliteAggregat
12ae0 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73  eInfoReset(pPars
12af0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
12b00 0a 7d 0a                                         .}.