/ Hex Artifact Content
Login

Artifact 07140aaf5f2e209dd7bf8a681401a412ce16dc04:


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 32  select.c,v 1.132
0200: 20 32 30 30 33 2f 30 34 2f 31 37 20 32 32 3a 35   2003/04/17 22:5
0210: 37 3a 35 34 20 64 72 68 20 45 78 70 20 24 0a 2a  7:54 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 4c 6f 63 61 74 65 54 61 62   sqliteLocateTab
70c0: 6c 65 28 70 50 61 72 73 65 2c 70 54 61 62 4c 69  le(pParse,pTabLi
70d0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 70  st->a[i].zName,p
70e0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44  TabList->a[i].zD
70f0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
7100: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
7110: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7130: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
7140: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
7150: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
7160: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
7170: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
7180: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71a0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
71b0: 74 65 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  te(pTabList->a[i
71c0: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
71d0: 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b      pTabList->a[
71e0: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
71f0: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 54 61  iteSelectDup(pTa
7200: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
7210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7220: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
7230: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
7240: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
7250: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
7260: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
7270: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
7280: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
7290: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
72a0: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
72b0: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
72c0: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
72d0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
72e0: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
72f0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
7300: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
7310: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
7320: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
7330: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
7340: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
7350: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
7360: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
7370: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
7380: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
7390: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
73a0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
73b0: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
73c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
73d0: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
73e0: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
73f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
7400: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
7410: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
7420: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
7430: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
7440: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
7450: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
7460: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
7470: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
7480: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
7490: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
74a0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
74b0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
74c0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
74d0: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
74e0: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
74f0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
7500: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
7510: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
7520: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
7530: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
7540: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
7550: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
7560: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
7570: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
7580: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
7590: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
75a0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
75b0: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
75c0: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
75d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
75e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
75f0: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
7600: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
7610: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
7620: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
7630: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
7640: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
7650: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
7660: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
7670: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
7680: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7690: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
76a0: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
76b0: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
76c0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
76d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
76e0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
76f0: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
7700: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
7710: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
7720: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
7730: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
7740: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
7750: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
7760: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
7770: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
7780: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
7790: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
77a0: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
77b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
77c0: 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  ew = sqliteExprL
77d0: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
77e0: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
77f0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
7800: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
7810: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
7820: 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  e;.        a[k].
7830: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
7840: 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
7850: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
7860: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
7870: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7880: 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
7890: 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
78a0: 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
78b0: 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
78c0: 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
78d0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
78e0: 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
78f0: 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
7900: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d       Token *pNam
7910: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
7920: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
7930: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
7940: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
7950: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
7960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7970: 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65 66 74  ame = &pE->pLeft
7980: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
7990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
79a0: 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    pName = 0;.   
79b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
79c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
79d0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
79e0: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
79f0: 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74  *pTab = pTabList
7a00: 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[i].pTab;.   
7a10: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
7a20: 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69 73 74  bName = pTabList
7a30: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[i].zAlias;. 
7a40: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
7a50: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
7a60: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20  Name[0]==0 ){ . 
7a70: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
7a80: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
7a90: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
7aa0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61           if( pNa
7ab0: 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d  me && (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 7c 7c 20 0a 20 20 20 20 20 20 20  ]==0 || .       
7ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7af0: 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65 2d 3e  StrNICmp(pName->
7b00: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70 4e 61  z, zTabName, pNa
7b10: 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20 20 20  me->n)!=0 ||.   
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
7b30: 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e 6e 5d  abName[pName->n]
7b40: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
7b50: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7b70: 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
7b80: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
7b90: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
7ba0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
7bb0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7bc0: 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  r, *pLeft, *pRig
7bd0: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
7be0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
7bf0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
7c00: 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
7c10: 69 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62  if( i>0 && (pTab
7c20: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69  List->a[i-1].joi
7c30: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
7c40: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
7c50: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
7c60: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
7c70: 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a 4e 61  a[i-1].pTab, zNa
7c80: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7c90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7ca0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
7cb0: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
7cc0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
7ce0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
7cf0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
7d00: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7d10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7d20: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
7d30: 26 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e  & sqliteIdListIn
7d40: 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  dex(pTabList->a[
7d50: 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61  i-1].pUsing, zNa
7d60: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
7d70: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
7d80: 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
7d90: 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
7da0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
7dc0: 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
7dd0: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
7de0: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
7df0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7e00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7e10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
7e20: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70  ight = sqliteExp
7e30: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
7e40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
7e50: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62  f( pRight==0 ) b
7e60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7e70: 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e    pRight->token.
7e80: 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  z = zName;.     
7e90: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
7ea0: 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  oken.n = strlen(
7eb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
7ec0: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
7ed0: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
7ee0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
7ef0: 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d  ame && pTabList-
7f00: 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
7f10: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
7f20: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
7f30: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
7f40: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7f50: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
7f60: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
7f70: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
7f80: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
7f90: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7fb0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54 61 62  ->token.z = zTab
7fc0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7fd0: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
7fe0: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 62  .n = strlen(zTab
7ff0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
8000: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
8010: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
8020: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
8030: 65 74 53 74 72 69 6e 67 28 28 63 68 61 72 2a 2a  etString((char**
8040: 29 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  )&pExpr->span.z,
8050: 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22 2c 20   zTabName, ".", 
8060: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
8070: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8080: 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  span.n = strlen(
8090: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a  pExpr->span.z);.
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
80b0: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
80c0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
80d0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
80e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
80f0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
8100: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
8110: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
8120: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
8130: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8140: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8150: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
8160: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8170: 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74  >span = pExpr->t
8180: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
8190: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
81a0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70  pNew = sqliteExp
81b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
81c0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
81d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
81e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
81f0: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
8200: 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
8210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8220: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
8230: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
8240: 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 4e 61 6d  table: %T", pNam
8250: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
8260: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
8270: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
8280: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
8290: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
82a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
82b0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
82c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
82d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
82e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
82f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
8300: 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
8310: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8330: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
8340: 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c   unlinks the Sel
8350: 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61  ect.pSrc.a[].pTa
8360: 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e  b pointers.** in
8370: 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63 74   a select struct
8380: 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73 65  ure.  It just se
8390: 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ts the pointers 
83a0: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a  to NULL.  This.*
83b0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 63  * routine is rec
83c0: 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73 65  ursive in the se
83d0: 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65 20  nse that if the 
83e0: 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e  Select.pSrc.a[].
83f0: 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74  pSelect.** point
8400: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
8410: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8420: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
8430: 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74  ly on that point
8440: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
8450: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8460: 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20 73   on the Select s
8470: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
8480: 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57 20  fines a.** VIEW 
8490: 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f  in order to undo
84a0: 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74 6f   any bindings to
84b0: 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 69   tables.  This i
84c0: 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62  s necessary.** b
84d0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61 62  ecause those tab
84e0: 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52 4f  les might be DRO
84f0: 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71 75  Ped by a subsequ
8500: 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e  ent SQL command.
8510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
8520: 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c 65  electUnbind(Sele
8530: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
8540: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
8550: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54 61   = p->pSrc;.  Ta
8560: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
8570: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
8580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
8590: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
85a0: 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70     if( (pTab = p
85b0: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 21  Src->a[i].pTab)!
85c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
85d0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
85e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
85f0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
8600: 2c 20 70 54 61 62 29 3b 0a 23 69 66 20 30 0a 20  , pTab);.#if 0. 
8610: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c         sqliteSel
8620: 65 63 74 44 65 6c 65 74 65 28 70 53 72 63 2d 3e  ectDelete(pSrc->
8630: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
8640: 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69         pSrc->a[i
8650: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 23  ].pSelect = 0;.#
8660: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
8670: 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70      pSrc->a[i].p
8680: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Tab = 0;.      i
8690: 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  f( pSrc->a[i].pS
86a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
86b0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62   sqliteSelectUnb
86c0: 69 6e 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  ind(pSrc->a[i].p
86d0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
86e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
86f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8700: 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72   associates entr
8710: 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ies in an ORDER 
8720: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  BY expression li
8730: 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d  st with.** colum
8740: 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20  ns in a result. 
8750: 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20   For each ORDER 
8760: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  BY expression, t
8770: 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20  he opcode of.** 
8780: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
8790: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
87a0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
87b0: 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  he iColumn value
87c0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
87d0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
87e0: 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75  led in with colu
87f0: 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  mn number and th
8800: 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  e iTable.** valu
8810: 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  e of the top-lev
8820: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
8830: 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61  d with iTable pa
8840: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  rameter..**.** I
8850: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f  f there are prio
8860: 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73  r SELECT clauses
8870: 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65  , they are proce
8880: 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d  ssed first.  A m
8890: 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61  atch.** in an ea
88a0: 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b  rlier SELECT tak
88b0: 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76  es precedence ov
88c0: 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43  er a later SELEC
88d0: 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74  T..**.** Any ent
88e0: 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ry that does not
88f0: 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65   match is flagge
8900: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  d as an error.  
8910: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
8920: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
8930: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
8940: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
8950: 20 63 6f 72 72 65 63 74 6c 79 20 69 6e 69 74 69   correctly initi
8960: 61 6c 69 7a 65 20 74 68 65 20 45 78 70 72 2e 64  alize the Expr.d
8970: 61 74 61 54 79 70 65 20 20 66 69 65 6c 64 0a 2a  ataType  field.*
8980: 2a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  * of the ORDER B
8990: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  Y expressions.  
89a0: 54 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 53  The multiSelectS
89b0: 6f 72 74 4f 72 64 65 72 28 29 20 72 6f 75 74 69  ortOrder() routi
89c0: 6e 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63 61  ne.** must be ca
89d0: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 61 74 20  lled to do that 
89e0: 61 66 74 65 72 20 74 68 65 20 69 6e 64 69 76 69  after the indivi
89f0: 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61 74  dual select stat
8a00: 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20 61  ements.** have a
8a10: 6c 6c 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64  ll been analyzed
8a20: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8a30: 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  is unable to com
8a40: 70 75 74 65 20 45 78 70 72 2e 64 61 74 61 54 79  pute Expr.dataTy
8a50: 70 65 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74  pe.** because it
8a60: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
8a70: 62 65 66 6f 72 65 20 74 68 65 20 69 6e 64 69 76  before the indiv
8a80: 69 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61  idual select sta
8a90: 74 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20  tements.** have 
8aa0: 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a  been analyzed..*
8ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
8ac0: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8ad0: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
8ae0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8af0: 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65  A place to leave
8b00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
8b10: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
8b20: 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  lect,        /* 
8b30: 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20  Match to result 
8b40: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20  columns of this 
8b50: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72  SELECT */.  Expr
8b60: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8b70: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
8b80: 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61   BY values to ma
8b90: 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75  tch against colu
8ba0: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  mns */.  int iTa
8bb0: 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
8bc0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20   /* Insert this 
8bd0: 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20  value in iTable 
8be0: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d  */.  int mustCom
8bf0: 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20  plete        /* 
8c00: 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45  If TRUE all ORDE
8c10: 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68  R BYs must match
8c20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72   */.){.  int nEr
8c30: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  r = 0;.  int i, 
8c40: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
8c50: 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  EList;..  if( pS
8c60: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64  elect==0 || pOrd
8c70: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
8c80: 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f   1;.  if( mustCo
8c90: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f  mplete ){.    fo
8ca0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8cb0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20  y->nExpr; i++){ 
8cc0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8cd0: 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20  one = 0; }.  }. 
8ce0: 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d   if( fillInColum
8cf0: 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  nList(pParse, pS
8d00: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
8d10: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
8d20: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
8d30: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 74  r ){.    if( mat
8d40: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
8d50: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
8d60: 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  t->pPrior, pOrde
8d70: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  rBy, iTable, 0) 
8d80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8d90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
8da0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
8db0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
8dc0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8dd0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8de0: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64   Expr *pE = pOrd
8df0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8e00: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
8e10: 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   -1;.    if( pOr
8e20: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
8e30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8e40: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
8e50: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
8e60: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
8e70: 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
8e80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
8e90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8ea0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8eb0: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
8ec0: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
8ed0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
8ee0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
8ef0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
8f00: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
8f10: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
8f20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8f30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
8f40: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
8f50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
8f60: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
8f70: 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30   for(j=0; iCol<0
8f80: 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45   && j<pEList->nE
8f90: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
8fa0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a   if( pEList->a[j
8fb0: 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e  ].zName && (pE->
8fc0: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d  op==TK_ID || pE-
8fd0: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20  >op==TK_STRING) 
8fe0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8ff0: 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b  *zName, *zLabel;
9000: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
9010: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
9020: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
9030: 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  ert( pE->token.z
9040: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62   );.        zLab
9050: 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  el = sqliteStrND
9060: 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  up(pE->token.z, 
9070: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pE->token.n);.  
9080: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
9090: 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ote(zLabel);.   
90a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
90b0: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
90c0: 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20  abel)==0 ){ .   
90d0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
90e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
90f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c     sqliteFree(zL
9100: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  abel);.      }. 
9110: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
9120: 26 26 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d  && sqliteExprCom
9130: 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d  pare(pE, pEList-
9140: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[j].pExpr) ){.
9150: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
9160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9170: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
9180: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
9190: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
91a0: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
91b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
91c0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
91d0: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
91e0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
91f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
9200: 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d  Col<0 && mustCom
9210: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73  plete ){.      s
9220: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
9230: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f  arse,.        "O
9240: 52 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d  RDER BY term num
9250: 62 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20  ber %d does not 
9260: 6d 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74  match any result
9270: 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a   column", i+1);.
9280: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
9290: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
92a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
92b0: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rr;  .}../*.** G
92c0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
92d0: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
92e0: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
92f0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9300: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
9310: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9320: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
9330: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
9340: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
9350: 65 20 2a 73 71 6c 69 74 65 47 65 74 56 64 62 65  e *sqliteGetVdbe
9360: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
9370: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
9380: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
9390: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
93a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
93b0: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 72 65 61  = sqliteVdbeCrea
93c0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
93d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
93e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
93f0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 45  utine sets the E
9400: 78 70 72 2e 64 61 74 61 54 79 70 65 20 66 69 65  xpr.dataType fie
9410: 6c 64 20 6f 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e  ld on all elemen
9420: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 4f 72  ts of.** the pOr
9430: 64 65 72 42 79 20 65 78 70 72 65 73 73 69 6f 6e  derBy expression
9440: 20 6c 69 73 74 2e 20 20 54 68 65 20 70 4f 72 64   list.  The pOrd
9450: 65 72 42 79 20 6c 69 73 74 20 77 69 6c 6c 20 68  erBy list will h
9460: 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 65 74 20  ave been.** set 
9470: 75 70 20 62 79 20 6d 61 74 63 68 4f 72 64 65 72  up by matchOrder
9480: 62 79 54 6f 43 6f 6c 75 6d 6e 28 29 2e 20 20 48  byToColumn().  H
9490: 65 6e 63 65 20 65 61 63 68 20 65 78 70 72 65 73  ence each expres
94a0: 73 69 6f 6e 20 68 61 73 0a 2a 2a 20 61 20 54 4b  sion has.** a TK
94b0: 5f 43 4f 4c 55 4d 4e 20 61 73 20 69 74 73 20 72  _COLUMN as its r
94c0: 6f 6f 74 20 6e 6f 64 65 2e 20 20 54 68 65 20 45  oot node.  The E
94d0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 72 65 66 65  xpr.iColumn refe
94e0: 72 73 20 74 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75  rs to a .** colu
94f0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
9500: 20 73 65 74 2e 20 20 20 54 68 65 20 64 61 74 61   set.   The data
9510: 74 79 70 65 20 69 73 20 73 65 74 20 74 6f 20 53  type is set to S
9520: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a  QLITE_SO_TEXT.**
9530: 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   if the correspo
9540: 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  nding column in 
9550: 70 20 61 6e 64 20 65 76 65 72 79 20 53 45 4c 45  p and every SELE
9560: 43 54 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  CT to the left o
9570: 66 0a 2a 2a 20 70 20 68 61 73 20 61 20 64 61 74  f.** p has a dat
9580: 61 74 79 70 65 20 6f 66 20 53 51 4c 49 54 45 5f  atype of SQLITE_
9590: 53 4f 5f 54 45 58 54 2e 20 20 49 66 20 74 68 65  SO_TEXT.  If the
95a0: 20 63 6f 6f 72 65 73 73 70 6f 6e 64 69 6e 67 20   cooressponding 
95b0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f  column.** in p o
95c0: 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6c 65 66  r any of the lef
95d0: 74 20 53 45 4c 45 43 54 73 20 69 73 20 53 51 4c  t SELECTs is SQL
95e0: 49 54 45 5f 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e  ITE_SO_NUM, then
95f0: 20 74 68 65 20 64 61 74 61 74 79 70 65 0a 2a 2a   the datatype.**
9600: 20 6f 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   of the order-by
9610: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73   expression is s
9620: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f  et to SQLITE_SO_
9630: 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  NUM..**.** Examp
9640: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  les:.**.**     C
9650: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 6e 65 28  REATE TABLE one(
9660: 61 20 49 4e 54 45 47 45 52 2c 20 62 20 54 45 58  a INTEGER, b TEX
9670: 54 29 3b 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  T);.**     CREAT
9680: 45 20 54 41 42 4c 45 20 74 77 6f 28 63 20 56 41  E TABLE two(c VA
9690: 52 43 48 41 52 28 35 29 2c 20 64 20 46 4c 4f 41  RCHAR(5), d FLOA
96a0: 54 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  T);.**.**     SE
96b0: 4c 45 43 54 20 62 2c 20 62 20 46 52 4f 4d 20 6f  LECT b, b FROM o
96c0: 6e 65 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  ne UNION SELECT 
96d0: 64 2c 20 63 20 46 52 4f 4d 20 74 77 6f 20 4f 52  d, c FROM two OR
96e0: 44 45 52 20 42 59 20 31 2c 20 32 3b 0a 2a 2a 0a  DER BY 1, 2;.**.
96f0: 2a 2a 20 54 68 65 20 70 72 69 6d 61 72 79 20 73  ** The primary s
9700: 6f 72 74 20 6b 65 79 20 77 69 6c 6c 20 75 73 65  ort key will use
9710: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 62   SQLITE_SO_NUM b
9720: 65 63 61 75 73 65 20 74 68 65 20 22 64 22 20 69  ecause the "d" i
9730: 6e 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  n.** the second 
9740: 53 45 4c 45 43 54 20 69 73 20 6e 75 6d 65 72 69  SELECT is numeri
9750: 63 2e 20 20 54 68 65 20 31 73 74 20 63 6f 6c 75  c.  The 1st colu
9760: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
9770: 53 45 4c 45 43 54 0a 2a 2a 20 69 73 20 74 65 78  SELECT.** is tex
9780: 74 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  t but that does 
9790: 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
97a0: 73 65 20 61 20 6e 75 6d 65 72 69 63 20 61 6c 77  se a numeric alw
97b0: 61 79 73 20 6f 76 65 72 72 69 64 65 73 0a 2a 2a  ays overrides.**
97c0: 20 61 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54   a text..**.** T
97d0: 68 65 20 73 65 63 6f 6e 64 61 72 79 20 6b 65 79  he secondary key
97e0: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 53 51   will use the SQ
97f0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 73 6f 72  LITE_SO_TEXT sor
9800: 74 20 6f 72 64 65 72 20 62 65 63 61 75 73 65 0a  t order because.
9810: 2a 2a 20 62 6f 74 68 20 74 68 65 20 28 73 65 63  ** both the (sec
9820: 6f 6e 64 29 20 22 62 22 20 69 6e 20 74 68 65 20  ond) "b" in the 
9830: 66 69 72 73 74 20 53 45 4c 45 43 54 20 61 6e 64  first SELECT and
9840: 20 74 68 65 20 22 63 22 20 69 6e 20 74 68 65 20   the "c" in the 
9850: 73 65 63 6f 6e 64 0a 2a 2a 20 53 45 4c 45 43 54  second.** SELECT
9860: 20 68 61 76 65 20 61 20 64 61 74 61 74 79 70 65   have a datatype
9870: 20 6f 66 20 74 65 78 74 2e 0a 2a 2f 20 0a 73 74   of text..*/ .st
9880: 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 53  atic void multiS
9890: 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 53  electSortOrder(S
98a0: 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69  elect *p, ExprLi
98b0: 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20  st *pOrderBy){. 
98c0: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
98d0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 69 66  st *pEList;.  if
98e0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
98f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 3d  return;.  if( p=
9900: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
9910: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
9920: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9930: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
9940: 2e 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65  .pExpr->dataType
9950: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
9960: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  T;.    }.    ret
9970: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d 75 6c 74 69  urn;.  }.  multi
9980: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
9990: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64 65  p->pPrior, pOrde
99a0: 72 42 79 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rBy);.  pEList =
99b0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
99c0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
99d0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
99e0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
99f0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9a00: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
9a10: 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54  >dataType==SQLIT
9a20: 45 5f 53 4f 5f 4e 55 4d 20 29 20 63 6f 6e 74 69  E_SO_NUM ) conti
9a30: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
9a40: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   pE->iColumn>=0 
9a50: 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  );.    if( pELis
9a60: 74 2d 3e 6e 45 78 70 72 3e 70 45 2d 3e 69 43 6f  t->nExpr>pE->iCo
9a70: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 45  lumn ){.      pE
9a80: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 73 71 6c  ->dataType = sql
9a90: 69 74 65 45 78 70 72 54 79 70 65 28 70 45 4c 69  iteExprType(pELi
9aa0: 73 74 2d 3e 61 5b 70 45 2d 3e 69 43 6f 6c 75 6d  st->a[pE->iColum
9ab0: 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  n].pExpr);.    }
9ac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9ad0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9ae0: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
9af0: 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20  a query that is 
9b00: 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e  really the union
9b10: 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74  .** or intersect
9b20: 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ion of two or mo
9b30: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
9b40: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  ies..**.** "p" p
9b50: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
9b60: 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
9b70: 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
9b80: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
9b90: 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
9ba0: 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
9bb0: 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
9bc0: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
9bd0: 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
9be0: 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
9bf0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
9c00: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
9c10: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
9c20: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
9c30: 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
9c40: 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
9c50: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
9c60: 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
9c70: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
9c80: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
9c90: 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
9ca0: 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
9cb0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
9cc0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
9cd0: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
9ce0: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
9cf0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
9d00: 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
9d10: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
9d20: 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
9d30: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
9d40: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
9d50: 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
9d60: 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
9d70: 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
9d90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9da0: 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
9db0: 43 54 20 63 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT c FROM t1.**.
9dc0: 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
9dd0: 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
9de0: 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
9df0: 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
9e00: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
9e10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9e20: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
9e30: 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
9e40: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
9e50: 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
9e60: 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
9e70: 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
9e80: 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
9e90: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
9ea0: 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
9eb0: 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
9ec0: 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
9ed0: 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
9ee0: 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
9ef0: 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
9f00: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
9f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
9f20: 75 6c 74 69 53 65 6c 65 63 74 28 50 61 72 73 65  ultiSelect(Parse
9f30: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
9f40: 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
9f50: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 69 6e  int iParm){.  in
9f60: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
9f70: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
9f80: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
9f90: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
9fa0: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 2f 2a 20  *pPrior;     /* 
9fb0: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
9fc0: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
9fd0: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
9fe0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
9ff0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
a000: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
a010: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
a020: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
a030: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20  ER BY clause on 
a040: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
a050: 4f 6e 6c 79 20 74 68 65 20 0a 20 20 2a 2a 20 6c  Only the .  ** l
a060: 61 73 74 20 53 45 4c 45 43 54 20 69 6e 20 74 68  ast SELECT in th
a070: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
a080: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  e an ORDER BY.. 
a090: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   */.  if( p==0 |
a0a0: 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  | p->pPrior==0 )
a0b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50 72   return 1;.  pPr
a0c0: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
a0d0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
a0e0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
a0f0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
a100: 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
a110: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
a120: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
a130: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
a140: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
a150: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
a160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
a170: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
a180: 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69  valid query engi
a190: 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65  ne.  If not, cre
a1a0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
a1b0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
a1c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a1d0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
a1e0: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 72  turn 1;..  /* Cr
a1f0: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
a200: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
a210: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
a220: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  y.  */.  if( eDe
a230: 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
a240: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
a250: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
a260: 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
a270: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
a280: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
a290: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
a2a0: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
a2b0: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
a2c0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
a2d0: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
a2e0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a2f0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
a300: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
a310: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a320: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
a330: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44  arse, pPrior, eD
a340: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
a350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
a360: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a370: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
a380: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
a390: 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65   rc = sqliteSele
a3a0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
a3b0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
a3c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  , 0);.        p-
a3d0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
a3e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
a3f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a410: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
a420: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
a430: 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68  ORDER BY fall th
a440: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
a450: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
a460: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
a470: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
a480: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
a490: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
a4a0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
a4b0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
a4c0: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
a4d0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
a4e0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
a4f0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
a500: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
a510: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
a520: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
a530: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
a540: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
a550: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
a560: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
a570: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
a580: 64 65 72 42 79 3b 20 20 2f 2a 20 54 68 65 20 4f  derBy;  /* The O
a590: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
a5a0: 6f 72 20 74 68 65 20 72 69 67 68 74 20 53 45 4c  or the right SEL
a5b0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 20 20 70 72  ECT */..      pr
a5c0: 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54  iorOp = p->op==T
a5d0: 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c  K_ALL ? SRT_Tabl
a5e0: 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  e : SRT_Union;. 
a5f0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
a600: 70 72 69 6f 72 4f 70 20 26 26 20 70 2d 3e 70 4f  priorOp && p->pO
a610: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
a620: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
a630: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
a640: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
a650: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
a660: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
a670: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
a680: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
a690: 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20  b = iParm;.     
a6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a6b0: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
a6c0: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
a6d0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
a6e0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
a6f0: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
a700: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
a710: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a720: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
a730: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a740: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
a750: 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26  erBy .        &&
a760: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
a770: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
a780: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e   p->pOrderBy, un
a790: 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20  ionTab, 1) ){.  
a7a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a7b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a7c0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
a7d0: 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  K_ALL ){.       
a7e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a7f0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
a800: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b  p, unionTab, 1);
a810: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a820: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a830: 5f 4b 65 79 41 73 44 61 74 61 2c 20 75 6e 69 6f  _KeyAsData, unio
a840: 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20  nTab, 1);.      
a850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a860: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a870: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
a880: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  p, unionTab, 0);
a890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a8a0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
a8b0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
a8c0: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
a8d0: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
a8e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
a8f0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
a900: 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  ior, priorOp, un
a910: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29  ionTab, 0, 0, 0)
a920: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
a930: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
a940: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
a950: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
a960: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
a970: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
a980: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
a990: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
a9a0: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
a9b0: 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
a9c0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
a9d0: 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
a9e0: 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
a9f0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
aa00: 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
aa10: 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
aa20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aa30: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
aa40: 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
aa50: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
aa60: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
aa70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
aa80: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
aa90: 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69  arse, p, op, uni
aaa0: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 29 3b  onTab, 0, 0, 0);
aab0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
aac0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
aad0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
aae0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 69  OrderBy;.      i
aaf0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ab00: 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  c;..      /* Con
ab10: 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
ab20: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
ab30: 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
ab40: 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
ab50: 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
ab60: 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
ab70: 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20       */      .  
ab80: 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70      if( eDest!=p
ab90: 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54  riorOp || unionT
aba0: 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20  ab!=iParm ){.   
abb0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
abc0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
abd0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abe0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
abf0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
ac00: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
ac10: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
ac20: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
ac30: 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 30  arse, p->base, 0
ac40: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
ac50: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
ac60: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
ac70: 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d 3e  se, p->base, p->
ac80: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 29  pSrc, p->pEList)
ac90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aca0: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
acb0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
acc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
acd0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
ace0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
acf0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ad00: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
ad10: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
ad20: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
ad30: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56 64 62  tart = sqliteVdb
ad40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
ad50: 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 53 65  .        multiSe
ad60: 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2c  lectSortOrder(p,
ad70: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
ad80: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
ad90: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
ada0: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
adb0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
adc0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f             p->pO
adf0: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
ae00: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
ae30: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
ae40: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ae50: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
ae60: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
ae70: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
ae80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ae90: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
aea0: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
aeb0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
aec0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
aed0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
aee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
aef0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
af00: 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
af10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
af20: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
af30: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53         generateS
af40: 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 2d  ortTail(p, v, p-
af50: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
af60: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
af70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
af80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
af90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
afa0: 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20  INTERSECT: {.   
afb0: 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
afc0: 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  2;.      int iCo
afd0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
afe0: 72 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  rt;..      /* IN
aff0: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
b000: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
b010: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
b020: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
b030: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
b040: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
b050: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
b060: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
b070: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
b080: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
b090: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
b0a0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
b0b0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b0c0: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
b0d0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
b0e0: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
b0f0: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
b100: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
b110: 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74  ,p,p->pOrderBy,t
b120: 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  ab1,1) ){.      
b130: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b140: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b150: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b160: 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c 20  OpenTemp, tab1, 
b170: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b180: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b190: 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 31 2c  KeyAsData, tab1,
b1a0: 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   1);..      /* C
b1b0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
b1c0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
b1d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b1e0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
b1f0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
b200: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
b210: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
b220: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
b230: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
b240: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
b250: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
b260: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
b270: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
b280: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
b290: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
b2a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b2b0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32  P_OpenTemp, tab2
b2c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
b2d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b2e0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
b2f0: 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  2, 1);.      p->
b300: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
b310: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c    rc = sqliteSel
b320: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53  ect(pParse, p, S
b330: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20  RT_Union, tab2, 
b340: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b350: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
b360: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  or;.      if( rc
b370: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
b380: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
b390: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
b3a0: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
b3b0: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
b3c0: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
b3d0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
b3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
b3f0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
b400: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
b410: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
b420: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b430: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Names(pParse, p-
b440: 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c  >base, 0, p->pEL
b450: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 67 65  ist);.        ge
b460: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
b470: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
b480: 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70  e, p->pSrc, p->p
b490: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
b4a0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
b4b0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
b4c0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
b4d0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
b4e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b4f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b500: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
b510: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
b520: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
b530: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b540: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
b550: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
b560: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b570: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
b580: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
b590: 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72    multiSelectSor
b5a0: 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72  tOrder(p, p->pOr
b5b0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 72 63  derBy);.      rc
b5c0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
b5d0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
b5e0: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
b5f0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
b600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
b620: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
b630: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
b660: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
b670: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b680: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
b690: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
b6a0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
b6b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
b6c0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  p(v, OP_Next, ta
b6d0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
b6e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
b6f0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
b700: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
b710: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b720: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
b730: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
b740: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b750: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
b760: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
b770: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
b780: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
b790: 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  l(p, v, p->pELis
b7a0: 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
b7b0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d   iParm);.      }
b7c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b7d0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
b7e0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
b7f0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
b800: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
b810: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
b820: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
b830: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
b840: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
b850: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
b860: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
b870: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
b880: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
b890: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
b8a0: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
b8b0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
b8c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
b8d0: 20 7d 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61   }..  /* Issue a
b8e0: 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69   null callback i
b8f0: 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74  f that is what t
b900: 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20  he user wants.. 
b910: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
b920: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26 26  =SRT_Callback &&
b930: 0a 20 20 20 20 28 70 50 61 72 73 65 2d 3e 75 73  .    (pParse->us
b940: 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20  eCallback==0 || 
b950: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
b960: 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c  gs & SQLITE_Null
b970: 43 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20 20  Callback)!=0).  
b980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
b990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
b9a0: 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 45  lCallback, p->pE
b9b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
b9c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
b9e0: 69 76 65 6c 79 20 73 63 61 6e 20 74 68 72 6f 75  ively scan throu
b9f0: 67 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  gh an expression
ba00: 20 74 72 65 65 2e 20 20 46 6f 72 20 65 76 65 72   tree.  For ever
ba10: 79 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  y reference.** t
ba20: 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  o a column in ta
ba30: 62 6c 65 20 6e 75 6d 62 65 72 20 69 46 72 6f 6d  ble number iFrom
ba40: 2c 20 63 68 61 6e 67 65 20 74 68 61 74 20 72 65  , change that re
ba50: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
ba60: 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 6e  * same column in
ba70: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
ba80: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
ba90: 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e  d changeTablesIn
baa0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 20  List(ExprList*, 
bab0: 69 6e 74 2c 20 69 6e 74 29 3b 20 20 2f 2a 20 46  int, int);  /* F
bac0: 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
bad0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
bae0: 64 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 45  d changeTables(E
baf0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
bb00: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
bb10: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
bb20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
bb30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
bb40: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
bb50: 54 61 62 6c 65 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Table==iFrom ){.
bb60: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
bb70: 65 20 3d 20 69 54 6f 3b 0a 20 20 7d 65 6c 73 65  e = iTo;.  }else
bb80: 7b 0a 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c  {.    changeTabl
bb90: 65 73 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  es(pExpr->pLeft,
bba0: 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20   iFrom, iTo);.  
bbb0: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70    changeTables(p
bbc0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 46  Expr->pRight, iF
bbd0: 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63  rom, iTo);.    c
bbe0: 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73  hangeTablesInLis
bbf0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
bc00: 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20 20 7d  iFrom, iTo);.  }
bc10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
bc20: 68 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73  hangeTablesInLis
bc30: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
bc40: 74 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  t, int iFrom, in
bc50: 74 20 69 54 6f 29 7b 0a 20 20 69 66 28 20 70 4c  t iTo){.  if( pL
bc60: 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ist ){.    int i
bc70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
bc80: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
bc90: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 6e 67  ++){.      chang
bca0: 65 54 61 62 6c 65 73 28 70 4c 69 73 74 2d 3e 61  eTables(pList->a
bcb0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 46 72 6f 6d  [i].pExpr, iFrom
bcc0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
bcd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  }.}../*.** Scan 
bce0: 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
bcf0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
bd00: 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
bd10: 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
bd20: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
bd30: 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
bd40: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
bd50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
bd60: 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
bd70: 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
bd80: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
bd90: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
bda0: 20 75 6e 63 68 61 6e 67 65 64 2e 29 20 20 57 68   unchanged.)  Wh
bdb0: 65 6e 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  en making a copy
bdc0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
bdd0: 6e 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 68 61  n in pEList, cha
bde0: 6e 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  nge.** reference
bdf0: 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
be00: 74 61 62 6c 65 20 69 53 75 62 20 69 6e 74 6f 20  table iSub into 
be10: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
be20: 62 6c 65 20 69 54 61 62 6c 65 2e 0a 2a 2a 0a 2a  ble iTable..**.*
be30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
be40: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
be50: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
be60: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
be70: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
be80: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
be90: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
bea0: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
beb0: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
bec0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
bed0: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
bee0: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
bef0: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
bf00: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
bf10: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
bf20: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
bf30: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
bf40: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
bf50: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
bf60: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
bf70: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
bf80: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
bf90: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
bfa0: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
bfb0: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
bfc0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
bfd0: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
bfe0: 2c 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 29 3b  ,ExprList*,int);
bff0: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63    /* Forward Dec
c000: 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l */.static void
c010: 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20   substExpr(Expr 
c020: 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62  *pExpr, int iTab
c030: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
c040: 4c 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29 7b  List, int iSub){
c050: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c060: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
c070: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
c080: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
c090: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
c0a0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
c0b0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =0 ){.    Expr *
c0c0: 70 4e 65 77 3b 0a 20 20 20 20 61 73 73 65 72 74  pNew;.    assert
c0d0: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
c0e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
c0f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
c100: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
c110: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
c120: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
c130: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
c140: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 );.    pNew = 
c150: 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
c160: 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
c170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
c180: 77 21 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70  w!=0 );.    pExp
c190: 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
c1a0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74  ;.    pExpr->dat
c1b0: 61 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61  aType = pNew->da
c1c0: 74 61 54 79 70 65 3b 0a 20 20 20 20 61 73 73 65  taType;.    asse
c1d0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
c1e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72  ==0 );.    pExpr
c1f0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
c200: 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ExprDup(pNew->pL
c210: 65 66 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  eft);.    assert
c220: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
c230: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c240: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
c250: 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52  ExprDup(pNew->pR
c260: 69 67 68 74 29 3b 0a 20 20 20 20 61 73 73 65 72  ight);.    asser
c270: 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
c280: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c290: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45  >pList = sqliteE
c2a0: 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d  xprListDup(pNew-
c2b0: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  >pList);.    pEx
c2c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65  pr->iTable = pNe
c2d0: 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70  w->iTable;.    p
c2e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
c2f0: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
c300: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
c310: 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
c320: 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79   sqliteTokenCopy
c330: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
c340: 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
c350: 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f     sqliteTokenCo
c360: 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  py(&pExpr->span,
c370: 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20   &pNew->span);. 
c380: 20 20 20 69 66 28 20 69 53 75 62 21 3d 69 54 61     if( iSub!=iTa
c390: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ble ){.      cha
c3a0: 6e 67 65 54 61 62 6c 65 73 28 70 45 78 70 72 2c  ngeTables(pExpr,
c3b0: 20 69 53 75 62 2c 20 69 54 61 62 6c 65 29 3b 0a   iSub, iTable);.
c3c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c3d0: 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78     substExpr(pEx
c3e0: 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
c3f0: 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29  e, pEList, iSub)
c400: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
c410: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
c420: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69  Table, pEList, i
c430: 53 75 62 29 3b 0a 20 20 20 20 73 75 62 73 74 45  Sub);.    substE
c440: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
c450: 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
c460: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d  List, iSub);.  }
c470: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 0a  .}.static void .
c480: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
c490: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
c4a0: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
c4b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 69 6e 74  ist *pEList, int
c4c0: 20 69 53 75 62 29 7b 0a 20 20 69 6e 74 20 69 3b   iSub){.  int i;
c4d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c4e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
c4f0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
c500: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
c510: 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e  ubstExpr(pList->
c520: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
c530: 6c 65 2c 20 70 45 4c 69 73 74 2c 20 69 53 75 62  le, pEList, iSub
c540: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
c550: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
c560: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
c570: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
c580: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
c590: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
c5a0: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
c5b0: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
c5c0: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
c5d0: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
c5e0: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
c5f0: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
c600: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
c610: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
c620: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
c630: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
c640: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
c650: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
c660: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
c670: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
c680: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
c690: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
c6a0: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
c6b0: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
c6c0: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
c6d0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
c6e0: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
c6f0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
c700: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
c710: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
c720: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
c730: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
c740: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
c750: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
c760: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
c770: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c780: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
c790: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
c7a0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
c7b0: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
c7c0: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
c7d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
c7e0: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
c7f0: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
c800: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
c810: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
c820: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
c830: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
c840: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
c850: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
c860: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
c870: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
c880: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
c890: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
c8a0: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
c8b0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
c8c0: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
c8d0: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
c8e0: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
c8f0: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
c900: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
c910: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
c920: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
c930: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
c940: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
c950: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
c960: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
c970: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
c980: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
c990: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
c9a0: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
c9b0: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
c9c0: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
c9d0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
c9e0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
c9f0: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
ca00: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
ca10: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
ca20: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
ca30: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
ca40: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
ca50: 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
ca60: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
ca70: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
ca80: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
ca90: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
caa0: 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
cab0: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
cac0: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
cad0: 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
cae0: 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
caf0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
cb00: 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
cb10: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
cb20: 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
cb30: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cb40: 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
cb50: 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
cb60: 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
cb70: 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
cb80: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
cb90: 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
cba0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
cbb0: 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
cbc0: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
cbd0: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
cbe0: 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
cbf0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
cc00: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
cc10: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
cc20: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
cc30: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
cc40: 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
cc50: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
cc60: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
cc70: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
cc80: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
cc90: 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
cca0: 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
ccb0: 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
ccc0: 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
ccd0: 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
cce0: 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
ccf0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
cd00: 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
cd10: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
cd20: 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
cd30: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
cd40: 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
cd50: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
cd60: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
cd70: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
cd80: 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
cd90: 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
cda0: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
cdb0: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
cdc0: 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
cdd0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
cde0: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
cdf0: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
ce00: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
ce10: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
ce20: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
ce30: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
ce40: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
ce50: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
ce60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
ce70: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
ce80: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
ce90: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
cea0: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
ceb0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
cec0: 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
ced0: 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
cee0: 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
cef0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
cf00: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
cf10: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
cf20: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
cf30: 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
cf40: 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
cf50: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
cf60: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
cf70: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
cf80: 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
cf90: 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
cfa0: 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
cfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cfc0: 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
cfd0: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
cfe0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
cff0: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
d000: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
d010: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
d020: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
d030: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
d040: 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
d050: 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
d060: 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
d070: 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
d080: 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
d090: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
d0a0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
d0b0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d0c0: 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
d0d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
d0e0: 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
d0f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d100: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
d110: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
d120: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
d130: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 50 61  int i;.  int iPa
d140: 72 65 6e 74 2c 20 69 53 75 62 3b 0a 20 20 45 78  rent, iSub;.  Ex
d150: 70 72 20 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f  pr *pWhere;..  /
d160: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
d170: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
d180: 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
d190: 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
d1a0: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  /.  if( p==0 ) r
d1b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
d1c0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
d1d0: 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
d1e0: 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
d1f0: 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
d200: 53 75 62 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46  Sub = pSrc->a[iF
d210: 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  rom].pSelect;.  
d220: 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
d230: 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
d240: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
d250: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d260: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
d270: 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
d280: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
d290: 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
d2a0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
d2b0: 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 70  ubSrc );.  if( p
d2c0: 53 75 62 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  SubSrc->nSrc!=1 
d2d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
d2e0: 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
d2f0: 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69  nct || pSub->nLi
d300: 6d 69 74 3e 3d 30 29 20 26 26 20 20 28 70 53 72  mit>=0) &&  (pSr
d310: 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
d320: 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
d330: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
d340: 28 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  (p->isDistinct |
d350: 7c 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20  | p->nLimit>=0) 
d360: 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
d370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d380: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
d390: 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
d3a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d3b0: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
d3c0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
d3d0: 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
d3e0: 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
d3f0: 74 68 65 0a 20 20 2a 2a 20 69 2d 74 68 20 65 6e  the.  ** i-th en
d400: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
d410: 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
d420: 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
d430: 20 20 69 50 61 72 65 6e 74 20 3d 20 70 2d 3e 62    iParent = p->b
d440: 61 73 65 20 2b 20 69 46 72 6f 6d 3b 0a 20 20 69  ase + iFrom;.  i
d450: 53 75 62 20 3d 20 70 53 75 62 2d 3e 62 61 73 65  Sub = pSub->base
d460: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
d470: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  t(p->pEList, iPa
d480: 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
d490: 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 70 4c 69  st, iSub);.  pLi
d4a0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
d4b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
d4c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
d4d0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
d4e0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
d4f0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26  >a[i].zName==0 &
d500: 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74  & (pExpr = pList
d510: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
d520: 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  pan.z!=0 ){.    
d530: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
d540: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
d550: 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  Dup(pExpr->span.
d560: 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
d570: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
d580: 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
d590: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
d5a0: 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
d5b0: 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
d5c0: 2c 20 69 53 75 62 29 3b 0a 20 20 20 20 73 75 62  , iSub);.    sub
d5d0: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
d5e0: 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
d5f0: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
d600: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
d610: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
d620: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
d630: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
d640: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
d650: 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
d660: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
d670: 3d 20 30 3b 0a 20 20 20 20 63 68 61 6e 67 65 54  = 0;.    changeT
d680: 61 62 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70  ablesInList(p->p
d690: 4f 72 64 65 72 42 79 2c 20 69 53 75 62 2c 20 69  OrderBy, iSub, i
d6a0: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  Parent);.  }else
d6b0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
d6c0: 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
d6d0: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
d6e0: 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
d6f0: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
d700: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
d710: 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
d720: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78  Where = sqliteEx
d730: 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
d740: 72 65 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  re);.    if( iPa
d750: 72 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20  rent!=iSub ){.  
d760: 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73      changeTables
d770: 28 70 57 68 65 72 65 2c 20 69 53 75 62 2c 20 69  (pWhere, iSub, i
d780: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  Parent);.    }. 
d790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
d7a0: 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
d7b0: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
d7c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d7d0: 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
d7e0: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
d7f0: 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
d800: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
d810: 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
d820: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
d830: 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
d840: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
d850: 69 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  if( pSub->pHavin
d860: 67 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  g ){.      Expr 
d870: 2a 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  *pHaving = sqlit
d880: 65 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  eExprDup(pSub->p
d890: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69  Having);.      i
d8a0: 66 28 20 69 50 61 72 65 6e 74 21 3d 69 53 75 62  f( iParent!=iSub
d8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 6e   ){.        chan
d8c0: 67 65 54 61 62 6c 65 73 28 70 48 61 76 69 6e 67  geTables(pHaving
d8d0: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
d8e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d8f0: 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
d900: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
d910: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70  ving = sqliteExp
d920: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61  r(TK_AND, p->pHa
d930: 76 69 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30  ving, pHaving, 0
d940: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d950: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69          p->pHavi
d960: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
d970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d980: 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
d990: 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  pBy==0 );.    p-
d9a0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
d9b0: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 53  teExprListDup(pS
d9c0: 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  ub->pGroupBy);. 
d9d0: 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d     if( iParent!=
d9e0: 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68  iSub ){.      ch
d9f0: 61 6e 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74  angeTablesInList
da00: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 53  (p->pGroupBy, iS
da10: 75 62 2c 20 69 50 61 72 65 6e 74 29 3b 0a 20 20  ub, iParent);.  
da20: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
da30: 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29 7b 0a  p->pWhere==0 ){.
da40: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
da50: 70 57 68 65 72 65 3b 0a 20 20 7d 65 6c 73 65 7b  pWhere;.  }else{
da60: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
da70: 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
da80: 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c  t, pSub->pEList,
da90: 20 69 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20   iSub);.    if( 
daa0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
dab0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
dac0: 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70  teExpr(TK_AND, p
dad0: 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
dae0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
daf0: 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
db00: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
db10: 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
db20: 6e 63 74 3b 0a 0a 20 20 69 66 28 20 70 53 75 62  nct;..  if( pSub
db30: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->nLimit>=0 ){. 
db40: 20 20 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74     if( p->nLimit
db50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  <0 ){.      p->n
db60: 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c  Limit = pSub->nL
db70: 69 6d 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  imit;.    }else 
db80: 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 2b 70 2d  if( p->nLimit+p-
db90: 3e 6e 4f 66 66 73 65 74 20 3e 20 70 53 75 62 2d  >nOffset > pSub-
dba0: 3e 6e 4c 69 6d 69 74 2b 70 53 75 62 2d 3e 6e 4f  >nLimit+pSub->nO
dbb0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
dbc0: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->nLimit = pSub-
dbd0: 3e 6e 4c 69 6d 69 74 20 2b 20 70 53 75 62 2d 3e  >nLimit + pSub->
dbe0: 6e 4f 66 66 73 65 74 20 2d 20 70 2d 3e 6e 4f 66  nOffset - p->nOf
dbf0: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  fset;.    }.  }.
dc00: 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2b 3d 20    p->nOffset += 
dc10: 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 3b 0a 0a  pSub->nOffset;..
dc20: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
dc30: 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 73 75  uery contains su
dc40: 62 71 75 65 72 69 65 73 20 6f 66 20 69 74 73 20  bqueries of its 
dc50: 6f 77 6e 2c 20 74 68 61 74 20 77 65 72 65 20 6e  own, that were n
dc60: 6f 74 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 65  ot.  ** flattene
dc70: 64 2c 20 74 68 65 6e 20 63 6f 64 65 20 77 69 6c  d, then code wil
dc80: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
dc90: 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 74 6f  een generated to
dca0: 20 70 75 74 0a 20 20 2a 2a 20 74 68 65 20 72 65   put.  ** the re
dcb0: 73 75 6c 74 73 20 6f 66 20 74 68 6f 73 65 20 73  sults of those s
dcc0: 75 62 2d 73 75 62 71 75 65 72 69 65 73 20 69 6e  ub-subqueries in
dcd0: 74 6f 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  to VDBE cursors 
dce0: 72 65 6c 61 74 69 76 65 0a 20 20 2a 2a 20 74 6f  relative.  ** to
dcf0: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
dd00: 57 65 20 6d 75 73 74 20 74 72 61 6e 73 6c 61 74  We must translat
dd10: 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
dd20: 62 65 72 20 69 6e 74 6f 20 76 61 6c 75 65 73 0a  ber into values.
dd30: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
dd40: 72 20 75 73 65 20 62 79 20 74 68 65 20 6f 75 74  r use by the out
dd50: 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
dd60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 75 62   for(i=0; i<pSub
dd70: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
dd80: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
dd90: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 61    if( pSubSrc->a
dda0: 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
ddb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 76   continue;.    v
ddc0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
ddd0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
dde0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ddf0: 20 4f 50 5f 52 65 6e 61 6d 65 43 75 72 73 6f 72   OP_RenameCursor
de00: 2c 20 70 53 75 62 2d 3e 62 61 73 65 2b 69 2c 20  , pSub->base+i, 
de10: 70 2d 3e 62 61 73 65 2b 69 29 3b 0a 20 20 7d 0a  p->base+i);.  }.
de20: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69  .  if( pSrc->a[i
de30: 46 72 6f 6d 5d 2e 70 54 61 62 20 26 26 20 70 53  From].pTab && pS
de40: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
de50: 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
de60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  {.    sqliteDele
de70: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 72 63 2d  teTable(0, pSrc-
de80: 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61 62 29 3b  >a[iFrom].pTab);
de90: 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 61 5b 69  .  }.  pSrc->a[i
dea0: 46 72 6f 6d 5d 2e 70 54 61 62 20 3d 20 70 53 75  From].pTab = pSu
deb0: 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  bSrc->a[0].pTab;
dec0: 0a 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d  .  pSubSrc->a[0]
ded0: 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 61 73 73  .pTab = 0;.  ass
dee0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 46 72  ert( pSrc->a[iFr
def0: 6f 6d 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 53 75  om].pSelect==pSu
df00: 62 20 29 3b 0a 20 20 70 53 72 63 2d 3e 61 5b 69  b );.  pSrc->a[i
df10: 46 72 6f 6d 5d 2e 70 53 65 6c 65 63 74 20 3d 20  From].pSelect = 
df20: 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  pSubSrc->a[0].pS
df30: 65 6c 65 63 74 3b 0a 20 20 70 53 75 62 53 72 63  elect;.  pSubSrc
df40: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
df50: 20 30 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65   0;.  sqliteSele
df60: 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
df70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
df80: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
df90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
dfa0: 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
dfb0: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
dfc0: 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
dfd0: 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
dfe0: 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
dff0: 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
e000: 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
e010: 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
e020: 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
e030: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e040: 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
e050: 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
e060: 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
e070: 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
e080: 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
e090: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
e0a0: 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
e0b0: 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
e0c0: 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
e0d0: 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
e0e0: 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
e0f0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
e100: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
e110: 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
e120: 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
e130: 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
e140: 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
e150: 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
e160: 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
e170: 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
e180: 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
e190: 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
e1a0: 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
e1b0: 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
e1c0: 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
e1d0: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
e1e0: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
e1f0: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
e200: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
e210: 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
e220: 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
e230: 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
e240: 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
e250: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
e260: 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
e270: 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
e280: 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 53 65   as for sqliteSe
e290: 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74  lect()..** See t
e2a0: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
e2b0: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
e2c0: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
e2d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
e2e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70  .static int simp
e2f0: 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61  leMinMaxQuery(Pa
e300: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
e310: 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73  ect *p, int eDes
e320: 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
e330: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
e340: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c  int iCol;.  Tabl
e350: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
e360: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61   *pIdx;.  int ba
e370: 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  se;.  Vdbe *v;. 
e380: 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69   int seekOp;.  i
e390: 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c  nt cont;.  ExprL
e3a0: 69 73 74 20 65 4c 69 73 74 3b 0a 20 20 73 74 72  ist eList;.  str
e3b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e3c0: 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 0a 20 20  m eListItem;..  
e3d0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
e3e0: 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
e3f0: 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
e400: 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
e410: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
e420: 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
e430: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e440: 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
e450: 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
e460: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
e470: 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53   if( p->pSrc->nS
e480: 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
e490: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
e4a0: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
e4b0: 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20  turn 0;.  pExpr 
e4c0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
e4d0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
e4e0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
e4f0: 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
e500: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
e510: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  r->pList==0 || p
e520: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
e530: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
e540: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
e550: 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
e560: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
e570: 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72  teStrNICmp(pExpr
e580: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c  ->token.z,"min",
e590: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
e5a0: 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b  kOp = OP_Rewind;
e5b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
e5c0: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78 70  iteStrNICmp(pExp
e5d0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
e5e0: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
e5f0: 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  ekOp = OP_Last;.
e600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
e610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78  urn 0;.  }.  pEx
e620: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  pr = pExpr->pLis
e630: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
e640: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
e650: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
e660: 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70  rn 0;.  iCol = p
e670: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
e680: 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
e690: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
e6a0: 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
e6b0: 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
e6c0: 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
e6d0: 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
e6e0: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
e6f0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
e700: 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
e710: 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
e720: 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
e730: 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
e740: 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
e750: 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
e760: 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
e770: 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
e780: 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
e790: 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
e7a0: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
e7b0: 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
e7c0: 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
e7d0: 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
e7e0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
e7f0: 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
e800: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
e810: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e820: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e830: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
e840: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
e850: 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
e860: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e870: 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72 65 61 6b  0]==iCol ) break
e880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e890: 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
e8a0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64   0;.  }..  /* Id
e8b0: 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
e8c0: 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
e8d0: 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c  e using the call
e8e0: 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
e8f0: 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
e900: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
e910: 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
e920: 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
e930: 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ell..  */.  v = 
e940: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
e950: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
e960: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
e970: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
e980: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
e990: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
e9a0: 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61  es(pParse, p->ba
e9b0: 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e  se, p->pSrc, p->
e9c0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 67 65 6e  pEList);.    gen
e9d0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
e9e0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
e9f0: 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45  , p->pSrc, p->pE
ea00: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
ea10: 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   Generating code
ea20: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e   to find the min
ea30: 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61   or the max.  Ba
ea40: 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68  sically all we h
ea50: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
ea60: 73 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  s find the first
ea70: 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74   or the last ent
ea80: 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e  ry in the chosen
ea90: 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a   index.  If.  **
eaa0: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
eab0: 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e  x() is on the IN
eac0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ead0: 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65  Y, then find the
eae0: 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c   first.  ** or l
eaf0: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
eb00: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a   main table..  *
eb10: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
eb20: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
eb30: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
eb40: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
eb50: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20  nTrans)==0 ){.  
eb60: 20 20 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69    sqliteCodeVeri
eb70: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  fySchema(pParse)
eb80: 3b 0a 20 20 7d 0a 20 20 62 61 73 65 20 3d 20 70  ;.  }.  base = p
eb90: 2d 3e 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  ->base;.  sqlite
eba0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ebb0: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
ebc0: 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
ebd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ebe0: 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65 2c 20  OpenRead, base, 
ebf0: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 73  pTab->tnum);.  s
ec00: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
ec10: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
ec20: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
ec30: 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74  ;.  cont = sqlit
ec40: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
ec50: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
ec60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
ec70: 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
ec80: 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  p, base, 0);.  }
ec90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
eca0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ecb0: 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69  Integer, pIdx->i
ecc0: 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
ecd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ece0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73 65  P_OpenRead, base
ecf0: 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b  +1, pIdx->tnum);
ed00: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
ed10: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
ed20: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
ed30: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
ed40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  teVdbeAddOp(v, s
ed50: 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31 2c 20 30  eekOp, base+1, 0
ed60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
ed70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
ed80: 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31 2c 20 30  Recno, base+1, 0
ed90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
eda0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
edb0: 73 65 2c 20 62 61 73 65 2b 31 2c 20 30 29 3b 0a  se, base+1, 0);.
edc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
edd0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f  dOp(v, OP_MoveTo
ede0: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a  , base, 0);.  }.
edf0: 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20    eList.nExpr = 
ee00: 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69  1;.  memset(&eLi
ee10: 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  stItem, 0, sizeo
ee20: 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20  f(eListItem));. 
ee30: 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73   eList.a = &eLis
ee40: 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61  tItem;.  eList.a
ee50: 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
ee60: 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  r;.  selectInner
ee70: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
ee80: 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  &eList, 0, 0, 0,
ee90: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
eea0: 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 29 3b 0a  m, cont, cont);.
eeb0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
eec0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
eed0: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  );.  sqliteVdbeA
eee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
eef0: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 72 65  , base, 0);.  re
ef00: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
ef10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
ef20: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c  or the given SEL
ef30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
ef40: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
ef50: 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
ef60: 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
ef70: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
ef80: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44  e.** value of eD
ef90: 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a  est and iParm..*
efa0: 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56  *.**     eDest V
efb0: 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75 6c  alue       Resul
efc0: 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
efd0: 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f000: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
f010: 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
f020: 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
f030: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
f040: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
f050: 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
f060: 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
f070: 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
f080: 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a  ry cell iParm.**
f090: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
f0a0: 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65          Store re
f0b0: 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
f0c0: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 63 75   a table with cu
f0d0: 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  rsor iParm.**.**
f0e0: 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
f0f0: 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
f100: 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
f110: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f120: 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
f130: 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
f140: 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
f150: 66 6f 72 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  form the tempora
f160: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
f170: 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
f180: 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
f190: 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
f1a0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
f1b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
f1c0: 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70   above is incomp
f1d0: 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61  lete.  Additiona
f1e0: 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61  l eDist value ha
f1f0: 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73  ve be added.** s
f200: 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e  ince this commen
f210: 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20  t was written.  
f220: 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e  See the selectIn
f230: 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69  nerLoop() functi
f240: 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70  on for.** a comp
f250: 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20  lete listing of 
f260: 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  the allowed valu
f270: 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  es of eDest and 
f280: 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a  their meanings..
f290: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f2a0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
f2b0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
f2c0: 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
f2d0: 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
f2e0: 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
f2f0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
f300: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
f310: 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
f320: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
f330: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
f340: 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
f350: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
f360: 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
f370: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
f380: 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
f390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
f3a0: 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61  nt, parentTab, a
f3b0: 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66  nd *pParentAgg f
f3c0: 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64  ields are filled
f3d0: 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53   in if this.** S
f3e0: 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75  ELECT is a subqu
f3f0: 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ery.  This routi
f400: 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f  ne may try to co
f410: 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43  mbine this SELEC
f420: 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61  T.** with its pa
f430: 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73  rent to form a s
f440: 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79  ingle flat query
f450: 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20  .  In so doing, 
f460: 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e  it might.** chan
f470: 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  ge the parent qu
f480: 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61  ery from a non-a
f490: 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61  ggregate to an a
f4a0: 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
f4b0: 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73  ** For that reas
f4c0: 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41  on, the pParentA
f4d0: 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65  gg flag is passe
f4e0: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20  d as a pointer, 
f4f0: 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20  so it.** can be 
f500: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
f510: 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20  xample 1:   The 
f520: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  meaning of the p
f530: 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
f540: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
f550: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  T * FROM t1 JOIN
f560: 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e   (SELECT x, coun
f570: 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f  t(*) FROM t2) JO
f580: 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20  IN t3;.**    \  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62      \_______ sub
f5b0: 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20  query _______/  
f5c0: 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c        /.**     \
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20        /.**      
f610: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
f620: 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
f630: 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
f640: 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69  _____/.**.** Thi
f650: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f660: 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65  led for the oute
f670: 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20  r query first.  
f680: 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a   For that call,.
f690: 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  ** pParent will 
f6a0: 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67  be NULL.  During
f6b0: 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
f6c0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
f6d0: 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75  ry, this .** rou
f6e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
f6f0: 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61  ecursively to ha
f700: 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72  ndle the subquer
f710: 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75  y.  For the recu
f720: 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70  rsive.** call, p
f730: 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e  Parent will poin
f740: 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  t to the outer q
f750: 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74  uery.  Because t
f760: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a  he subquery is.*
f770: 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  * the second ele
f780: 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d  ment in a three-
f790: 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61  way join, the pa
f7a0: 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65  rentTab paramete
f7b0: 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28  r will.** be 1 (
f7c0: 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66  the 2nd value of
f7d0: 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72   a 0-indexed arr
f7e0: 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ay.).*/.int sqli
f7f0: 74 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  teSelect(.  Pars
f800: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f810: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
f820: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
f830: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
f840: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
f850: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
f860: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69  ng coded. */.  i
f870: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
f880: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
f890: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
f8a0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
f8b0: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
f8c0: 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65     /* A paramete
f8d0: 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44  r used by the eD
f8e0: 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  est disposal met
f8f0: 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  hod */.  Select 
f900: 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
f910: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
f920: 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
f930: 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
f940: 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
f950: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
f960: 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
f970: 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
f980: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
f990: 61 72 65 6e 74 41 67 67 20 20 20 20 20 20 20 20  arentAgg        
f9a0: 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
f9b0: 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
f9c0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
f9d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
f9e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a  reInfo *pWInfo;.
f9f0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
fa00: 20 69 73 41 67 67 20 3d 20 30 3b 20 20 20 20 20   isAgg = 0;     
fa10: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
fa20: 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
fa30: 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
fa40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
fa50: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
fa60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
fa70: 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
fa80: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
fa90: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
faa0: 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
fab0: 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
fac0: 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
fad0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
fae0: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
faf0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
fb00: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
fb10: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
fb20: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
fb30: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
fb40: 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
fb50: 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
fb60: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
fb70: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
fb80: 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
fb90: 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
fba0: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
fbb0: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
fbc0: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
fbd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
fbe0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
fbf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
fc00: 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
fc10: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
fc20: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
fc30: 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
fc40: 20 69 6e 74 20 62 61 73 65 3b 20 20 20 20 20 20   int base;      
fc50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
fc60: 20 63 75 72 73 6f 72 20 61 76 61 69 6c 61 62 6c   cursor availabl
fc70: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 20 20 69  e for use */.  i
fc80: 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
fc90: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
fca0: 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
fcb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
fcc0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
fcd0: 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
fce0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
fcf0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
fd00: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
fd10: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fd20: 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
fd30: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  ) ) return 1;.. 
fd40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
fd50: 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
fd60: 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
fd70: 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
fd80: 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
fd90: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
fda0: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
fdb0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
fdc0: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
fdd0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f   }..  /* Make lo
fde0: 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
fdf0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
fe00: 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
fe10: 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
fe20: 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
fe30: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
fe40: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
fe50: 72 64 65 72 42 79 3b 0a 20 20 70 47 72 6f 75 70  rderBy;.  pGroup
fe60: 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
fe70: 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
fe80: 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69  >pHaving;.  isDi
fe90: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
fea0: 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 20 41 6c  stinct;..  /* Al
feb0: 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
fec0: 66 20 56 44 42 45 20 63 75 72 73 6f 72 73 2c 20  f VDBE cursors, 
fed0: 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 74 61 62  one for each tab
fee0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
fef0: 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 54 68 65 20  lause..  ** The 
ff00: 57 48 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67  WHERE processing
ff10: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74   requires that t
ff20: 68 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74  he cursors for t
ff30: 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
ff40: 0a 20 20 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  .  ** FROM claus
ff50: 65 20 62 65 20 63 6f 6e 73 65 63 75 74 69 76 65  e be consecutive
ff60: 2e 0a 20 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20  ..  */.  base = 
ff70: 70 2d 3e 62 61 73 65 20 3d 20 70 50 61 72 73 65  p->base = pParse
ff80: 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65  ->nTab;.  pParse
ff90: 2d 3e 6e 54 61 62 20 2b 3d 20 70 54 61 62 4c 69  ->nTab += pTabLi
ffa0: 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
ffb0: 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
ffc0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
ffd0: 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
ffe0: 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
fff0: 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
10000 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
10010 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
10020 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
10030 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
10040 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
10050 2a 20 45 78 70 61 6e 64 20 61 6e 79 20 22 2a 22  * Expand any "*"
10060 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65   terms in the re
10070 73 75 6c 74 20 73 65 74 2e 20 20 28 46 6f 72 20  sult set.  (For 
10080 65 78 61 6d 70 6c 65 20 74 68 65 20 22 2a 22 20  example the "*" 
10090 69 6e 0a 20 20 2a 2a 20 22 53 45 4c 45 43 54 20  in.  ** "SELECT 
100a0 2a 20 46 52 4f 4d 20 74 31 22 29 20 20 54 68 65  * FROM t1")  The
100b0 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 6c 69 73   fillInColumnlis
100c0 74 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  t() routine also
100d0 20 64 6f 65 73 20 73 6f 6d 65 0a 20 20 2a 2a 20   does some.  ** 
100e0 6f 74 68 65 72 20 68 6f 75 73 65 6b 65 65 70 69  other housekeepi
100f0 6e 67 20 2d 20 73 65 65 20 74 68 65 20 68 65 61  ng - see the hea
10100 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
10110 64 65 74 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  details..  */.  
10120 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  if( fillInColumn
10130 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 29 20  List(pParse, p) 
10140 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
10150 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57  ct_end;.  }.  pW
10160 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
10170 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
10180 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
10190 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
101a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
101b0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
101c0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
101d0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
101e0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
101f0 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
10200 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65  t..  */.  if( (e
10210 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
10220 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
10230 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
10240 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
10250 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
10260 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
10270 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
10280 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
10290 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
102a0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
102b0 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  sion");.    goto
102c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
102d0 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
102e0 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
102f0 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
10300 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
10310 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
10320 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20  se SRT_Union:.  
10330 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
10340 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  t:.    case SRT_
10350 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70  Discard:.      p
10360 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
10370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
10380 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
10390 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  ak;.  }..  /* At
103a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
103b0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
103c0 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
103d0 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
103e0 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
103f0 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
10400 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
10410 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  .  .  **.  ** Re
10420 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
10430 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20   names and do a 
10440 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20  semantics check 
10450 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  on all the expre
10460 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ssions..  */.  f
10470 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
10480 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10490 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
104a0 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
104b0 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69  se, base, pTabLi
104c0 73 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61  st, 0, pEList->a
104d0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
104e0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
104f0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
10500 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
10510 63 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  ck(pParse, pELis
10520 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31  t->a[i].pExpr, 1
10530 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20  , &isAgg) ){.   
10540 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10550 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
10560 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20  if( pWhere ){.  
10570 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10580 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
10590 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73  e, base, pTabLis
105a0 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72  t, pEList, pWher
105b0 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
105c0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
105d0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
105e0 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
105f0 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29  e, pWhere, 0, 0)
10600 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
10610 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
10620 0a 20 20 20 20 73 71 6c 69 74 65 4f 72 61 63 6c  .    sqliteOracl
10630 65 38 4a 6f 69 6e 46 69 78 75 70 28 62 61 73 65  e8JoinFixup(base
10640 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
10650 72 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  re);.  }.  if( p
10660 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
10670 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
10680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
10690 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
106a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
106b0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
106c0 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
106d0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
106e0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
106f0 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
10700 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
10710 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
10720 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29  pEList, pHaving)
10730 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
10740 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
10750 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
10760 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
10770 20 70 48 61 76 69 6e 67 2c 20 31 2c 20 26 69 73   pHaving, 1, &is
10780 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  Agg) ){.      go
10790 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
107a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
107b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66  OrderBy ){.    f
107c0 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
107d0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
107e0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  .      int iCol;
107f0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
10800 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10810 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
10820 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  ( sqliteExprIsIn
10830 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
10840 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43   && iCol>0 && iC
10850 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol<=pEList->nExp
10860 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
10870 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45  iteExprDelete(pE
10880 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20  );.        pE = 
10890 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
108a0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70  Expr = sqliteExp
108b0 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
108c0 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
108d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
108e0 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
108f0 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
10900 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
10910 4c 69 73 74 2c 20 70 45 29 20 29 7b 0a 20 20 20  List, pE) ){.   
10920 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
10930 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
10940 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
10950 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
10960 70 45 2c 20 69 73 41 67 67 2c 20 30 29 20 29 7b  pE, isAgg, 0) ){
10970 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
10980 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10990 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
109a0 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
109b0 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (pE) ){.        
109c0 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
109d0 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
109e0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
109f0 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
10a00 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
10a10 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
10a20 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
10a30 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
10a40 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20 20 20 20  onstants");.    
10a50 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10a60 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
10a70 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3c 3d 30  else if( iCol<=0
10a80 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
10a90 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
10aa0 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
10ab0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
10ac0 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
10ad0 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
10ae0 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
10af0 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
10b00 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74              "bet
10b10 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
10b20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
10b30 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
10b40 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
10b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10b60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
10b70 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
10b80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
10b90 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
10ba0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
10bb0 43 6f 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20  Col;.      Expr 
10bc0 2a 70 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  *pE = pGroupBy->
10bd0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
10be0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10bf0 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
10c00 43 6f 6c 29 20 26 26 20 69 43 6f 6c 3e 30 20 26  Col) && iCol>0 &
10c10 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
10c20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
10c30 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
10c40 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70  e(pE);.        p
10c50 45 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  E = pGroupBy->a[
10c60 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
10c70 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  eExprDup(pEList-
10c80 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
10c90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10ca0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
10cb0 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
10cc0 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  , base, pTabList
10cd0 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 20 29 7b  , pEList, pE) ){
10ce0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
10cf0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10d00 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
10d10 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
10d20 73 65 2c 20 70 45 2c 20 69 73 41 67 67 2c 20 30  se, pE, isAgg, 0
10d30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
10d40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10d50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10d60 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
10d70 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
10d80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
10d90 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
10da0 26 69 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  &iCol)==0 ){.   
10db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
10dc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
10dd0 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55 50            "GROUP
10de0 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e   BY terms must n
10df0 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65  ot be non-intege
10e00 72 20 63 6f 6e 73 74 61 6e 74 73 22 29 3b 0a 20  r constants");. 
10e10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
10e20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10e30 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
10e40 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
10e50 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
10e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
10e70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
10e80 20 20 20 20 20 20 20 20 20 20 20 22 47 52 4f 55             "GROU
10e90 50 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  P BY column numb
10ea0 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
10eb0 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
10ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62  .             "b
10ed0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
10ee0 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
10ef0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
10f00 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
10f10 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
10f20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
10f30 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74    /* Check for t
10f40 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
10f50 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  of a min() or ma
10f60 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20  x() function by 
10f70 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74  itself.  ** in t
10f80 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
10f90 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65   */.  if( simple
10fa0 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72  MinMaxQuery(pPar
10fb0 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
10fc0 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  arm) ){.    rc =
10fd0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   0;.    goto sel
10fe0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
10ff0 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
11000 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
11010 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
11020 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11030 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
11040 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
11050 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
11060 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
11070 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
11080 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
11090 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
110a0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
110b0 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
110c0 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
110d0 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
110e0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
110f0 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
11100 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
11110 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  ames(pParse, p->
11120 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
11130 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
11140 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
11150 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  er.  */.  if( p-
11160 3e 6e 4c 69 6d 69 74 3c 3d 30 20 29 7b 0a 20 20  >nLimit<=0 ){.  
11170 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 2d 31    p->nLimit = -1
11180 3b 0a 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74  ;.    p->nOffset
11190 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
111a0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
111b0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
111c0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
111d0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
111e0 20 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b   -p->nLimit, 0);
111f0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
11200 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
11210 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
11220 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 69     p->nLimit = i
11230 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  Mem;.    if( p->
11240 6e 4f 66 66 73 65 74 3c 3d 30 20 29 7b 0a 20 20  nOffset<=0 ){.  
11250 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
11260 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
11270 20 20 20 20 20 69 4d 65 6d 20 3d 20 70 50 61 72       iMem = pPar
11280 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
11290 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
112a0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
112b0 20 2d 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 30 29   -p->nOffset, 0)
112c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
112d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
112e0 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29  mStore, iMem, 1)
112f0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66 66 73  ;.      p->nOffs
11300 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 7d  et = iMem;.    }
11310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
11320 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
11330 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
11340 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
11350 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
11360 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
11370 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11380 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
11390 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74  Select==0 ) cont
113a0 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
113b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
113c0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53  TabList->a[i].pS
113d0 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54  elect, SRT_TempT
113e0 61 62 6c 65 2c 20 62 61 73 65 2b 69 2c 0a 20 20  able, base+i,.  
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11400 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a 20 20  , i, &isAgg);.  
11410 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
11420 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
11430 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
11440 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11450 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
11460 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
11470 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
11480 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
11490 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
114a0 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
114b0 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73  aving;.    isDis
114c0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
114d0 74 69 6e 63 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tinct;.  }..  /*
114e0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
114f0 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
11500 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ery that can be 
11510 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f  "flattened" into
11520 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a   its parent..  *
11530 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
11540 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c  is a possiblity,
11550 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72   do so and retur
11560 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  n immediately.  
11570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
11580 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67  ent && pParentAg
11590 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74  g &&.      flatt
115a0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
115b0 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  e, pParent, pare
115c0 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
115d0 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
115e0 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
115f0 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
11600 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11610 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
11620 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
11630 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
11640 67 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  g a callback.  T
11650 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
11660 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
11670 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
11680 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
11690 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
116a0 20 61 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 2a   a callback..  *
116b0 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
116c0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
116d0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
116e0 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
116f0 2d 3e 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  ->base, pTabList
11700 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
11710 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
11720 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
11730 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
11740 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
11750 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
11760 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d  ( eDest==SRT_Tem
11770 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
11780 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11790 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
117a0 61 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 0);.  }..  
117b0 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
117c0 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
117d0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
117e0 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
117f0 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
11800 73 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  se);.  if( isAgg
11810 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a   || pGroupBy ){.
11820 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
11830 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20  se->nAgg==0 );. 
11840 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
11850 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
11860 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
11870 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
11880 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
11890 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
118a0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
118b0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
118c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
118d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
118e0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
118f0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
11900 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
11910 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11920 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
11930 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
11940 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
11950 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
11960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11970 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
11980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11990 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
119a0 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
119b0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
119c0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
119d0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
119e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
119f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
11a00 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
11a10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
11a20 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
11a30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
11a40 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
11a50 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
11a60 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
11a70 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
11a80 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11a90 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
11aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11ab0 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
11ac0 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
11ad0 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
11ae0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
11af0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
11b00 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
11b10 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
11b20 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
11b30 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
11b40 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
11b50 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
11b60 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
11b70 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
11b80 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
11b90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
11ba0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11bb0 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c  , OP_AggInit, 0,
11bc0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   i);.        sql
11bd0 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
11be0 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 46  v, -1, (char*)pF
11bf0 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  unc, P3_POINTER)
11c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11c10 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
11c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
11c30 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11c40 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
11c60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
11c70 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20  gFocus, 0, 0);. 
11c80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
11c90 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
11ca0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
11cb0 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
11cc0 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
11cd0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11ce0 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
11cf0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11d00 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11d10 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
11d20 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
11d30 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
11d40 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
11d50 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
11d60 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
11d70 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
11d80 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
11d90 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
11da0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11db0 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
11dc0 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20   distinct, 1);. 
11dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
11de0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
11df0 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
11e00 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a  atabase scan.  *
11e10 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
11e20 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
11e30 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70  arse, p->base, p
11e40 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
11e50 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
11e80 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  &pOrderBy);.  if
11e90 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
11ea0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
11eb0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
11ec0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
11ed0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
11ee0 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
11ef0 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
11f00 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
11f10 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
11f20 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
11f30 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
11f40 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
11f50 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e   iParm, pWInfo->
11f80 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
11f90 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20 20  o->iBreak) ){.  
11fa0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
11fb0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
11fc0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
11fd0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67  dealing with agg
11fe0 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f  regates, then do
11ff0 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67   the special agg
12000 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63  regate.  ** proc
12010 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20  essing.  .  */. 
12020 20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70   else{.    if( p
12030 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
12040 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20   int lbl1;.     
12050 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
12060 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
12070 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12080 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
12090 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
120a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
120b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
120c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
120d0 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e  eKey, pGroupBy->
120e0 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
120f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
12100 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
12110 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79  ) sqliteAddKeyTy
12120 70 65 28 76 2c 20 70 47 72 6f 75 70 42 79 29 3b  pe(v, pGroupBy);
12130 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
12140 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
12150 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
12160 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12170 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c  P_AggFocus, 0, l
12180 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  bl1);.      for(
12190 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
121a0 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
121b0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
121c0 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
121d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
121e0 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
121f0 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e  pParse, pParse->
12200 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  aAgg[i].pExpr);.
12210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
12220 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
12230 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20  gSet, 0, i);.   
12240 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12250 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
12260 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  l(v, lbl1);.    
12270 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
12280 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
12290 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
122a0 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  *pE;.      int j
122b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
122c0 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
122d0 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
122e0 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73 65       pE = pParse
122f0 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b  ->aAgg[i].pExpr;
12300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12310 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  E->op==TK_AGG_FU
12320 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
12330 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20 29 7b  if( pE->pList ){
12340 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
12350 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e  ; j<pE->pList->n
12360 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
12370 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
12380 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 2d  Code(pParse, pE-
12390 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  >pList->a[j].pEx
123a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
123b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
123c0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
123d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
123e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
123f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
12400 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d 3e 70  ggFunc, 0, pE->p
12410 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69 73 74  List ? pE->pList
12420 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
12430 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
12440 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
12450 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
12460 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41  sert( pParse->aA
12470 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78 53 74  gg[i].pFunc->xSt
12480 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ep!=0 );.      s
12490 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
124a0 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  3(v, -1, (char*)
124b0 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
124c0 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45  pFunc, P3_POINTE
124d0 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R);.    }.  }.. 
124e0 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
124f0 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
12500 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65    */.  sqliteWhe
12510 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
12520 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
12530 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
12540 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
12550 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
12560 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
12570 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
12580 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
12590 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
125a0 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
125b0 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
125c0 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
125d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
125e0 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
125f0 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
12600 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12610 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e  P_AggNext, 0, en
12620 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73  dagg);.    pPars
12630 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
12640 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
12650 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
12660 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
12670 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
12680 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  agg, 1);.    }. 
12690 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
126a0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
126b0 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
126c0 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
126d0 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
126f0 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20  Parm, startagg, 
12700 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20 20 20  endagg) ){.     
12710 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
12720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12730 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12740 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74  P_Goto, 0, start
12750 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
12760 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12770 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20  (v, endagg);.   
12780 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12790 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20  (v, OP_Noop, 0, 
127a0 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
127b0 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a  useAgg = 0;.  }.
127c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
127d0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
127e0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
127f0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
12800 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
12810 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
12820 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
12830 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
12840 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12850 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
12860 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  l(p, v, pEList->
12870 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
12880 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  arm);.  }...  /*
12890 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20 63 61   Issue a null ca
128a0 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74 20 69  llback if that i
128b0 73 20 77 68 61 74 20 74 68 65 20 75 73 65 72 20  s what the user 
128c0 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  wants..  */.  if
128d0 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
128e0 6c 62 61 63 6b 20 26 26 0a 20 20 20 20 28 70 50  lback &&.    (pP
128f0 61 72 73 65 2d 3e 75 73 65 43 61 6c 6c 62 61 63  arse->useCallbac
12900 6b 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d  k==0 || (pParse-
12910 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
12920 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
12930 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 73  )!=0).  ){.    s
12940 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12950 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  , OP_NullCallbac
12960 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  k, pEList->nExpr
12970 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
12980 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
12990 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
129a0 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
129b0 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
129c0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
129d0 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
129e0 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
129f0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
12a00 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
12a10 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
12a20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
12a30 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
12a40 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
12a50 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
12a60 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 41 67  _end:.  sqliteAg
12a70 67 72 65 67 61 74 65 49 6e 66 6f 52 65 73 65 74  gregateInfoReset
12a80 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
12a90 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.