/ Hex Artifact Content
Login

Artifact 65373244633151884ea83daffb34ef98382ac3b3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 31 32 32  select.c,v 1.122
0200: 20 32 30 30 33 2f 30 31 2f 31 38 20 32 30 3a 31   2003/01/18 20:1
0210: 31 3a 30 37 20 64 72 68 20 45 78 70 20 24 0a 2a  1:07 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 53 65 74 53 74 72 69     sqliteSetStri
0e70: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
0e80: 4d 73 67 2c 20 0a 20 20 20 20 20 20 22 52 49 47  Msg, .      "RIG
0e90: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
0ea0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
0eb0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
0ec0: 74 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ted", 0);.    pP
0ed0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0ee0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
0ef0: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
0f00: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
0f10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f20: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
0f30: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
0f40: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
0f50: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
0f60: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
0f70: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
0f80: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
0f90: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
0fa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
0fb0: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
0fc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
0fd0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
0fe0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
0ff0: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
1000: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
1010: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
1020: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1030: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72  ./*.** Add a ter
1040: 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 65  m to the WHERE e
1050: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70  xpression in *pp
1060: 45 78 70 72 20 74 68 61 74 20 72 65 71 75 69 72  Expr that requir
1070: 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63  es the.** zCol c
1080: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61  olumn to be equa
1090: 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62  l in the two tab
10a0: 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20 70 54  les pTab1 and pT
10b0: 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ab2..*/.static v
10c0: 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d  oid addWhereTerm
10d0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
10e0: 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  zCol,        /* 
10f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1100: 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  mn */.  const Ta
1110: 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20  ble *pTab1,     
1120: 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20   /* First table 
1130: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65  */.  const Table
1140: 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a   *pTab2,      /*
1150: 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   Second table */
1160: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
1170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1180: 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  dd the equality 
1190: 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70  term to this exp
11a0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
11b0: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45  Token dummy;.  E
11c0: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
11d0: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
11e0: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
11f0: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
1200: 0a 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43  ..  dummy.z = zC
1210: 6f 6c 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20  ol;.  dummy.n = 
1220: 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20  strlen(zCol);.  
1230: 64 75 6d 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20  dummy.dyn = 0;. 
1240: 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 45 78   pE1a = sqliteEx
1250: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
1260: 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20  &dummy);.  pE2a 
1270: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
1280: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1290: 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70  );.  dummy.z = p
12a0: 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64  Tab1->zName;.  d
12b0: 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  ummy.n = strlen(
12c0: 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62  dummy.z);.  pE1b
12d0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
12e0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
12f0: 79 29 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20  y);.  dummy.z = 
1300: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
1310: 64 75 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e  dummy.n = strlen
1320: 28 64 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32  (dummy.z);.  pE2
1330: 62 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  b = sqliteExpr(T
1340: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d  K_ID, 0, 0, &dum
1350: 6d 79 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71  my);.  pE1c = sq
1360: 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c  liteExpr(TK_DOT,
1370: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1380: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1390: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32  Expr(TK_DOT, pE2
13a0: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
13b0: 45 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  E = sqliteExpr(T
13c0: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
13d0: 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50  , 0);.  ExprSetP
13e0: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
13f0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20  romJoin);.  if( 
1400: 2a 70 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a  *ppExpr ){.    *
1410: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45  ppExpr = sqliteE
1420: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45  xpr(TK_AND, *ppE
1430: 78 70 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d  xpr, pE, 0);.  }
1440: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 45 78 70  else{.    *ppExp
1450: 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r = pE;.  }.}../
1460: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
1470: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1480: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
1490: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
14a0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
14b0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
14c0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 61  operty is used a
14d0: 74 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  t on terms of an
14e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
14f0: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1500: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1510: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
1520: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
1530: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
1540: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
1550: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
1560: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
1570: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
1580: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
1590: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
15a0: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
15b0: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
15c0: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
15d0: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
15e0: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
15f0: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
1600: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
1610: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
1620: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
1630: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  NG clause..*/.st
1640: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
1650: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  nExpr(Expr *p){.
1660: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
1670: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1680: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
1690: 29 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  );.    setJoinEx
16a0: 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
16b0: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
16c0: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
16d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
16e0: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
16f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
1700: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1710: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
1720: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
1730: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
1740: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
1750: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
1760: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
1770: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
1780: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
1790: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  erms..**.** This
17a0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
17b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
17c0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
17d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
17e0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
17f0: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
1800: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1810: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
1820: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 70 53 72   int i, j;.  pSr
1830: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66  c = p->pSrc;.  f
1840: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
1850: 6e 53 72 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  nSrc-1; i++){.  
1860: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1870: 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 26  _item *pTerm = &
1880: 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
1890: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18a0: 74 65 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  tem *pOther = &p
18b0: 53 72 63 2d 3e 61 5b 69 2b 31 5d 3b 0a 0a 20 20  Src->a[i+1];..  
18c0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 54 61    if( pTerm->pTa
18d0: 62 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e  b==0 || pOther->
18e0: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
18f0: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
1900: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
1910: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
1920: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
1930: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
1940: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
1950: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
1960: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
1970: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1980: 66 28 20 70 54 65 72 6d 2d 3e 6a 6f 69 6e 74 79  f( pTerm->jointy
1990: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
19a0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
19b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
19c0: 70 54 65 72 6d 2d 3e 70 4f 6e 20 7c 7c 20 70 54  pTerm->pOn || pT
19d0: 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  erm->pUsing ){. 
19e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
19f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
1a00: 7a 45 72 72 4d 73 67 2c 20 22 61 20 4e 41 54 55  zErrMsg, "a NATU
1a10: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
1a20: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
1a30: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
1a40: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
1a50: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1a60: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
1a70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1a80: 7d 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  }.      pTab = p
1a90: 54 65 72 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Term->pTab;.    
1aa0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1ab0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1ac0: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
1ad0: 6e 49 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70  nIndex(pOther->p
1ae0: 54 61 62 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  Tab, pTab->aCol[
1af0: 6a 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  j].zName)>=0 ){.
1b00: 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65            addWhe
1b10: 72 65 54 65 72 6d 28 70 54 61 62 2d 3e 61 43 6f  reTerm(pTab->aCo
1b20: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  l[j].zName, pTab
1b30: 2c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20  , pOther->pTab, 
1b40: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
1b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
1b70: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
1b80: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
1b90: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
1ba0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bb0: 70 54 65 72 6d 2d 3e 70 4f 6e 20 26 26 20 70 54  pTerm->pOn && pT
1bc0: 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  erm->pUsing ){. 
1bd0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
1be0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
1bf0: 72 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20 68  rrMsg, "cannot h
1c00: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
1c10: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
1c20: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
1c30: 73 61 6d 65 20 6a 6f 69 6e 22 2c 20 30 29 3b 0a  same join", 0);.
1c40: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
1c50: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
1c70: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
1c80: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
1c90: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1ca0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
1cb0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 64 20 41 4e  by.    ** and AN
1cc0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  D operator..    
1cd0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
1ce0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73  ->pOn ){.      s
1cf0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 54 65 72 6d  etJoinExpr(pTerm
1d00: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 69 66  ->pOn);.      if
1d10: 28 20 70 2d 3e 70 57 68 65 72 65 3d 3d 30 20 29  ( p->pWhere==0 )
1d20: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57 68  {.        p->pWh
1d30: 65 72 65 20 3d 20 70 54 65 72 6d 2d 3e 70 4f 6e  ere = pTerm->pOn
1d40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d50: 20 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65         p->pWhere
1d60: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
1d70: 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72 65 2c  _AND, p->pWhere,
1d80: 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c 20 30 29 3b   pTerm->pOn, 0);
1d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1da0: 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  Term->pOn = 0;. 
1db0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
1dc0: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
1dd0: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
1de0: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
1df0: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
1e00: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
1e10: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
1e20: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
1e30: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
1e40: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
1e50: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
1e60: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
1e70: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
1e80: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
1e90: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
1ea0: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
1eb0: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
1ec0: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
1ed0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
1ee0: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
1ef0: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
1f00: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
1f10: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
1f20: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
1f30: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
1f40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1f50: 54 65 72 6d 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  Term->pUsing ){.
1f60: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
1f70: 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ist;.      int j
1f80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f90: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29  i<pSrc->nSrc-1 )
1fa0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
1fb0: 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67 3b 0a 20  pTerm->pUsing;. 
1fc0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1fd0: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
1fe0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
1ff0: 6c 75 6d 6e 49 6e 64 65 78 28 70 54 65 72 6d 2d  lumnIndex(pTerm-
2000: 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  >pTab, pList->a[
2010: 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 7c 7c 0a 20  j].zName)<0 ||. 
2020: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
2030: 6e 49 6e 64 65 78 28 70 4f 74 68 65 72 2d 3e 70  nIndex(pOther->p
2040: 54 61 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  Tab, pList->a[j]
2050: 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20  .zName)<0 ){.   
2060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
2070: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
2080: 7a 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e 6f 74  zErrMsg, "cannot
2090: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
20a0: 6d 6e 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mn ",.          
20b0: 20 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e    pList->a[j].zN
20c0: 61 6d 65 2c 20 22 20 2d 20 63 6f 6c 75 6d 6e 20  ame, " - column 
20d0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
20e0: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 30 29 3b  oth tables", 0);
20f0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
2100: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
2110: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2130: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 4c   addWhereTerm(pL
2140: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ist->a[j].zName,
2150: 20 70 54 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f   pTerm->pTab, pO
2160: 74 68 65 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e  ther->pTab, &p->
2170: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
2180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2190: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
21a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
21b0: 6c 65 6d 65 6e 74 73 20 61 20 6d 69 6e 69 6d 61  lements a minima
21c0: 6c 20 4f 72 61 63 6c 65 38 20 6a 6f 69 6e 20 73  l Oracle8 join s
21d0: 79 6e 74 61 78 20 69 6d 6d 75 6c 61 74 69 6f 6e  yntax immulation
21e0: 2e 0a 2a 2a 20 54 68 65 20 70 72 65 63 69 73 65  ..** The precise
21f0: 20 6f 72 61 63 6c 65 38 20 73 79 6e 74 61 78 20   oracle8 syntax 
2200: 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  is not implement
2210: 65 64 20 2d 20 69 74 20 69 73 20 65 61 73 79 20  ed - it is easy 
2220: 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 67 65 74  enough.** to get
2230: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2240: 6e 66 75 73 65 64 2e 20 20 42 75 74 20 74 68 69  nfused.  But thi
2250: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6d  s routine does m
2260: 61 6b 65 20 69 74 20 70 6f 73 73 69 62 6c 65 0a  ake it possible.
2270: 2a 2a 20 74 6f 20 77 72 69 74 65 20 61 20 73 69  ** to write a si
2280: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
2290: 6e 74 20 74 68 61 74 20 64 6f 65 73 20 61 20 6c  nt that does a l
22a0: 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  eft outer join i
22b0: 6e 20 62 6f 74 68 0a 2a 2a 20 6f 72 61 63 6c 65  n both.** oracle
22c0: 38 20 61 6e 64 20 69 6e 20 53 51 4c 69 74 65 2e  8 and in SQLite.
22d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
22e0: 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 54 4b  ine looks for TK
22f0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
2300: 6f 6e 20 6e 6f 64 65 73 20 74 68 61 74 20 61 72  on nodes that ar
2310: 65 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68  e marked.** with
2320: 20 74 68 65 20 45 50 5f 4f 72 61 63 6c 65 38 4a   the EP_Oracle8J
2330: 6f 69 6e 20 70 72 6f 70 65 72 74 79 2e 20 20 53  oin property.  S
2340: 75 63 68 20 6e 6f 64 65 73 20 61 72 65 20 67 65  uch nodes are ge
2350: 6e 65 72 61 74 65 64 20 62 79 20 61 0a 2a 2a 20  nerated by a.** 
2360: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 28 65 69 74  column name (eit
2370: 68 65 72 20 22 63 6f 6c 75 6d 6e 22 20 6f 72 20  her "column" or 
2380: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 22 29 20  "table.column") 
2390: 74 68 61 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64  that is followed
23a0: 20 62 79 0a 2a 2a 20 74 68 65 20 73 70 65 63 69   by.** the speci
23b0: 61 6c 20 22 28 2b 29 22 20 6f 70 65 72 61 74 6f  al "(+)" operato
23c0: 72 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  r.  If the table
23d0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6d   of the column m
23e0: 61 72 6b 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  arked with.** th
23f0: 65 20 28 2b 29 20 6f 70 65 72 61 74 6f 72 20 69  e (+) operator i
2400: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 65  s the second are
2410: 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
2420: 65 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 65  e in a join, the
2430: 6e 0a 2a 2a 20 74 68 61 74 20 74 61 62 6c 65 20  n.** that table 
2440: 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
2450: 20 74 61 62 6c 65 20 69 6e 20 61 20 4c 45 46 54   table in a LEFT
2460: 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 54 68   OUTER JOIN.  Th
2470: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2480: 74 68 61 74 20 75 73 65 73 20 74 68 61 74 20 74  that uses that t
2490: 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72  able becomes par
24a0: 74 20 6f 66 20 74 68 65 20 4f 4e 20 63 6c 61 75  t of the ON clau
24b0: 73 65 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 2e  se for the join.
24c0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70  .**.** It is imp
24d0: 6f 72 74 61 6e 74 20 74 6f 20 65 6e 70 68 61 73  ortant to enphas
24e0: 69 7a 65 20 74 68 61 74 20 74 68 69 73 20 69 73  ize that this is
24f0: 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 68 6f 77   not exactly how
2500: 20 6f 72 61 63 6c 65 38 0a 2a 2a 20 77 6f 72 6b   oracle8.** work
2510: 73 2e 20 20 42 75 74 20 69 74 20 69 73 20 63 6c  s.  But it is cl
2520: 6f 73 65 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  ose enough so th
2530: 61 74 20 6f 6e 65 20 63 61 6e 20 63 6f 6e 73 74  at one can const
2540: 72 75 63 74 20 71 75 65 72 69 65 73 20 74 68 61  ruct queries tha
2550: 74 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 63  t.** will work c
2560: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 62 6f 74  orrectly for bot
2570: 68 20 53 51 4c 69 74 65 20 61 6e 64 20 4f 72 61  h SQLite and Ora
2580: 63 6c 65 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cle8..*/.static 
2590: 69 6e 74 20 73 71 6c 69 74 65 4f 72 61 63 6c 65  int sqliteOracle
25a0: 38 4a 6f 69 6e 46 69 78 75 70 28 0a 20 20 69 6e  8JoinFixup(.  in
25b0: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
25c0: 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
25d0: 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20  umber for first 
25e0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
25f0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2600: 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  ,    /* List of 
2610: 74 61 62 6c 65 73 20 62 65 69 6e 67 20 6a 6f 69  tables being joi
2620: 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
2630: 57 68 65 72 65 20 20 20 20 20 20 2f 2a 20 54 68  Where      /* Th
2640: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
2650: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2660: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  tement */.){.  i
2670: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  nt rc = 0;.  if(
2680: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2690: 28 70 57 68 65 72 65 2c 20 45 50 5f 4f 72 61 63  (pWhere, EP_Orac
26a0: 6c 65 38 4a 6f 69 6e 29 20 26 26 20 70 57 68 65  le8Join) && pWhe
26b0: 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  re->op==TK_COLUM
26c0: 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  N ){.    int idx
26d0: 20 3d 20 70 57 68 65 72 65 2d 3e 69 54 61 62 6c   = pWhere->iTabl
26e0: 65 20 2d 20 62 61 73 65 3b 0a 20 20 20 20 61 73  e - base;.    as
26f0: 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
2700: 69 64 78 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  idx<pSrc->nSrc )
2710: 3b 0a 20 20 20 20 69 66 28 20 69 64 78 3e 30 20  ;.    if( idx>0 
2720: 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
2730: 5b 69 64 78 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  [idx-1].jointype
2740: 20 26 3d 20 7e 4a 54 5f 49 4e 4e 45 52 3b 0a 20   &= ~JT_INNER;. 
2750: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 64 78       pSrc->a[idx
2760: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 7c 3d 20  -1].jointype |= 
2770: 4a 54 5f 4f 55 54 45 52 7c 4a 54 5f 4c 45 46 54  JT_OUTER|JT_LEFT
2780: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
27a0: 28 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74  ( pWhere->pRight
27b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
27c0: 69 74 65 4f 72 61 63 6c 65 38 4a 6f 69 6e 46 69  iteOracle8JoinFi
27d0: 78 75 70 28 62 61 73 65 2c 20 70 53 72 63 2c 20  xup(base, pSrc, 
27e0: 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 29 3b  pWhere->pRight);
27f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72  .  }.  if( pWher
2800: 65 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  e->pLeft ){.    
2810: 72 63 20 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63  rc |= sqliteOrac
2820: 6c 65 38 4a 6f 69 6e 46 69 78 75 70 28 62 61 73  le8JoinFixup(bas
2830: 65 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65 2d  e, pSrc, pWhere-
2840: 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69  >pLeft);.  }.  i
2850: 66 28 20 70 57 68 65 72 65 2d 3e 70 4c 69 73 74  f( pWhere->pList
2860: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2870: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2880: 73 74 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 69  st = pWhere->pLi
2890: 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
28a0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   i<pList->nExpr 
28b0: 26 26 20 72 63 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  && rc==0; i++){.
28c0: 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
28d0: 74 65 4f 72 61 63 6c 65 38 4a 6f 69 6e 46 69 78  teOracle8JoinFix
28e0: 75 70 28 62 61 73 65 2c 20 70 53 72 63 2c 20 70  up(base, pSrc, p
28f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
2900: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
2910: 66 28 20 72 63 3d 3d 31 20 26 26 20 28 70 57 68  f( rc==1 && (pWh
2920: 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ere->op==TK_AND 
2930: 7c 7c 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  || pWhere->op==T
2940: 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20 73 65 74  K_EQ) ){.    set
2950: 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 29  JoinExpr(pWhere)
2960: 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20  ;.    rc = 0;.  
2970: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2980: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2990: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
29a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
29b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
29c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
29d0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
29e0: 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  te(Select *p){. 
29f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2a00: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  rn;.  sqliteExpr
2a10: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
2a20: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53  List);.  sqliteS
2a30: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  rcListDelete(p->
2a40: 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 45  pSrc);.  sqliteE
2a50: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68  xprDelete(p->pWh
2a60: 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  ere);.  sqliteEx
2a70: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2a80: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c  pGroupBy);.  sql
2a90: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
2aa0: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c  >pHaving);.  sql
2ab0: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
2ac0: 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  e(p->pOrderBy);.
2ad0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
2ae0: 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b  lete(p->pPrior);
2af0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
2b00: 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >zSelect);.  sql
2b10: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
2b20: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2b30: 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
2b40: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 70  ation from the p
2b50: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
2b60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2b70: 71 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e  qliteAggregateIn
2b80: 66 6f 52 65 73 65 74 28 50 61 72 73 65 20 2a 70  foReset(Parse *p
2b90: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
2ba0: 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67  Free(pParse->aAg
2bb0: 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41  g);.  pParse->aA
2bc0: 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  gg = 0;.  pParse
2bd0: 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->nAgg = 0;.  pP
2be0: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30  arse->useAgg = 0
2bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2c00: 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20  t code into "v" 
2c10: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74  that will push t
2c20: 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65  he record on the
2c30: 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73   top of the.** s
2c40: 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f  tack into the so
2c50: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
2c60: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
2c70: 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
2c80: 65 2c 20 56 64 62 65 20 2a 76 2c 20 45 78 70 72  e, Vdbe *v, Expr
2c90: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b  List *pOrderBy){
2ca0: 0a 20 20 63 68 61 72 20 2a 7a 53 6f 72 74 4f 72  .  char *zSortOr
2cb0: 64 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  der;.  int i;.  
2cc0: 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c  zSortOrder = sql
2cd0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f 72 64 65  iteMalloc( pOrde
2ce0: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 20 29  rBy->nExpr + 1 )
2cf0: 3b 0a 20 20 69 66 28 20 7a 53 6f 72 74 4f 72 64  ;.  if( zSortOrd
2d00: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  er==0 ) return;.
2d10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
2d20: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
2d30: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 72 64 65  +){.    int orde
2d40: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
2d50: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
2d60: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20 20    int type;.    
2d70: 69 6e 74 20 63 3b 0a 20 20 20 20 69 66 28 20 28  int c;.    if( (
2d80: 6f 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53  order & SQLITE_S
2d90: 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c  O_TYPEMASK)==SQL
2da0: 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20  ITE_SO_TEXT ){. 
2db0: 20 20 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49       type = SQLI
2dc0: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
2dd0: 7d 65 6c 73 65 20 69 66 28 20 28 6f 72 64 65 72  }else if( (order
2de0: 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50   & SQLITE_SO_TYP
2df0: 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53  EMASK)==SQLITE_S
2e00: 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 74  O_NUM ){.      t
2e10: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  ype = SQLITE_SO_
2e20: 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NUM;.    }else i
2e30: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
2e40: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
2e50: 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 73 71  .      type = sq
2e60: 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 4f 72  liteExprType(pOr
2e70: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
2e80: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2e90: 20 20 20 20 20 74 79 70 65 20 3d 20 53 51 4c 49       type = SQLI
2ea0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d  TE_SO_NUM;.    }
2eb0: 0a 20 20 20 20 69 66 28 20 28 6f 72 64 65 72 20  .    if( (order 
2ec0: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 49 52 4d  & SQLITE_SO_DIRM
2ed0: 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  ASK)==SQLITE_SO_
2ee0: 41 53 43 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  ASC ){.      c =
2ef0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f   type==SQLITE_SO
2f00: 5f 54 45 58 54 20 3f 20 27 41 27 20 3a 20 27 2b  _TEXT ? 'A' : '+
2f10: 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ';.    }else{.  
2f20: 20 20 20 20 63 20 3d 20 74 79 70 65 3d 3d 53 51      c = type==SQ
2f30: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 3f 20 27  LITE_SO_TEXT ? '
2f40: 44 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 7d 0a  D' : '-';.    }.
2f50: 20 20 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 69      zSortOrder[i
2f60: 5d 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69 74  ] = c;.    sqlit
2f70: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
2f80: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
2f90: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 7a  .pExpr);.  }.  z
2fa0: 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72 64 65 72  SortOrder[pOrder
2fb0: 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20 30 3b 0a  By->nExpr] = 0;.
2fc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2fd0: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65  p(v, OP_SortMake
2fe0: 4b 65 79 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Key, pOrderBy->n
2ff0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Expr, 0);.  sqli
3000: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
3010: 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f 72 64 65 72  , -1, zSortOrder
3020: 2c 20 73 74 72 6c 65 6e 28 7a 53 6f 72 74 4f 72  , strlen(zSortOr
3030: 64 65 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 46  der));.  sqliteF
3040: 72 65 65 28 7a 53 6f 72 74 4f 72 64 65 72 29 3b  ree(zSortOrder);
3050: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
3060: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 50 75 74  Op(v, OP_SortPut
3070: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
3080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
3090: 64 64 73 20 61 20 50 33 20 61 72 67 75 6d 65 6e  dds a P3 argumen
30a0: 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20 56 44  t to the last VD
30b0: 42 45 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77  BE opcode that w
30c0: 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20  as.** inserted. 
30d0: 54 68 65 20 50 33 20 61 72 67 75 6d 65 6e 74 20  The P3 argument 
30e0: 61 64 64 65 64 20 69 73 20 61 20 73 74 72 69 6e  added is a strin
30f0: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 74  g suitable for t
3100: 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b 65 4b 65  he .** OP_MakeKe
3110: 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  y or OP_MakeIdxK
3120: 65 79 20 6f 70 63 6f 64 65 73 2e 20 20 54 68 65  ey opcodes.  The
3130: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73   string consists
3140: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
3150: 73 20 27 74 27 20 6f 72 20 27 6e 27 20 64 65 70  s 't' or 'n' dep
3160: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
3170: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 76 61 72  r or not the var
3180: 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64 73 20 6f  ious.** fields o
3190: 66 20 74 68 65 20 6b 65 79 20 74 6f 20 62 65 20  f the key to be 
31a0: 67 65 6e 65 72 61 74 65 64 20 73 68 6f 75 6c 64  generated should
31b0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 6e   be treated as n
31c0: 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20 61 73 20  umeric.** or as 
31d0: 74 65 78 74 2e 20 20 53 65 65 20 74 68 65 20 4f  text.  See the O
31e0: 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64 20 4f 50  P_MakeKey and OP
31f0: 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f  _MakeIdxKey opco
3200: 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74  de.** documentat
3210: 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
3220: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
3230: 62 6f 75 74 20 74 68 65 20 50 33 20 73 74 72 69  bout the P3 stri
3240: 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  ng..** See also 
3250: 74 68 65 20 73 71 6c 69 74 65 41 64 64 49 64 78  the sqliteAddIdx
3260: 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74 69 6e  KeyType() routin
3270: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3280: 65 41 64 64 4b 65 79 54 79 70 65 28 56 64 62 65  eAddKeyType(Vdbe
3290: 20 2a 76 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *v, ExprList *p
32a0: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 43  EList){.  int nC
32b0: 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e  olumn = pEList->
32c0: 6e 45 78 70 72 3b 0a 20 20 63 68 61 72 20 2a 7a  nExpr;.  char *z
32d0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Type = sqliteMal
32e0: 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b 31 20 29  loc( nColumn+1 )
32f0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3300: 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75   zType==0 ) retu
3310: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
3320: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
3330: 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 73      zType[i] = s
3340: 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 45  qliteExprType(pE
3350: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
3360: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  )==SQLITE_SO_NUM
3370: 20 3f 20 27 6e 27 20 3a 20 27 74 27 3b 0a 20 20   ? 'n' : 't';.  
3380: 7d 0a 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 30  }.  zType[i] = 0
3390: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
33a0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54  angeP3(v, -1, zT
33b0: 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ype, nColumn);. 
33c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79 70   sqliteFree(zTyp
33d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
33e0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
33f0: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
3400: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
3410: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
3420: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
3430: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
3440: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
3450: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
3460: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
3470: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
3480: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
3490: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
34a0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
34b0: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
34c0: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
34d0: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
34e0: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
34f0: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
3500: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
3510: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
3520: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
3530: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
3540: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3550: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3560: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
3570: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
3580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3590: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
35a0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
35b0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
35c0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
35d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
35e0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
35f0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
3600: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
3610: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
3620: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
3630: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
3640: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
3650: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
3660: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
3670: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
3680: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
3690: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
36a0: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
36b0: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
36c0: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
36d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
36e0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
36f0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
3700: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
3710: 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
3720: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
3730: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
3740: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
3750: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
3760: 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74    /* An argument
3770: 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61 6c   to the disposal
3780: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
3790: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
37a0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
37b0: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
37c0: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
37d0: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
37e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
37f0: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
3800: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
3810: 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  loop */.){.  Vdb
3820: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3830: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Vdbe;.  int i;..
3840: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
3850: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
3860: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
3870: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
3880: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
3890: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
38a0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f  atement, then do
38b0: 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20   the check.  ** 
38c0: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72  to see if this r
38d0: 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74  ow should be out
38e0: 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
38f0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
3900: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66 66 73 65     if( p->nOffse
3910: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
3920: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
3930: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
3950: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
3960: 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65  mIncr, p->nOffse
3970: 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  t, addr+2);.    
3980: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3990: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
39a0: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
39b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c   }.    if( p->nL
39c0: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  imit>=0 ){.     
39d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
39e0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
39f0: 70 2d 3e 6e 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->nLimit, iBrea
3a00: 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  k);.    }.  }.. 
3a10: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
3a20: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
3a30: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75    */.  if( nColu
3a40: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  mn>0 ){.    for(
3a50: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
3a60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
3a70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3a80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
3a90: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , i);.    }.  }e
3aa0: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  lse{.    nColumn
3ab0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
3ac0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3ad0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
3ae0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
3af0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
3b00: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
3b10: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3b20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
3b30: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
3b40: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
3b50: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3b60: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
3b70: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
3b80: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
3b90: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
3ba0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
3bb0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
3bc0: 20 2a 2f 0a 20 20 69 66 28 20 64 69 73 74 69 6e   */.  if( distin
3bd0: 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20  ct>=0 && pEList 
3be0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
3bf0: 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  >0 ){.#if NULL_A
3c00: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
3c10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3c20: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
3c30: 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c   -pEList->nExpr,
3c40: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
3c50: 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a 23 65  ntAddr(v)+7);.#e
3c60: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 56  ndif.    sqliteV
3c70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3c80: 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73 74 2d 3e  akeKey, pEList->
3c90: 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
3ca0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
3cb0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20  ile_format>=4 ) 
3cc0: 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65  sqliteAddKeyType
3cd0: 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  (v, pEList);.   
3ce0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3cf0: 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c  (v, OP_Distinct,
3d00: 20 64 69 73 74 69 6e 63 74 2c 20 73 71 6c 69 74   distinct, sqlit
3d10: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
3d20: 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
3d30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3d40: 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74 2d 3e 6e  P_Pop, pEList->n
3d50: 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20  Expr+1, 0);.    
3d60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3d70: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3d80: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
3d90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3da0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
3db0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
3dc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3dd0: 74 53 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63  tStrKey, distinc
3de0: 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77  t, 0);.  }..  sw
3df0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
3e00: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
3e10: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
3e20: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
3e30: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
3e40: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
3e50: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
3e60: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3e70: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73  Union: {.      s
3e80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3e90: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3ea0: 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41   nColumn, NULL_A
3eb0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b  LWAYS_DISTINCT);
3ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3ed0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
3ee0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
3ef0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3f00: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
3f10: 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  y, iParm, 0);.  
3f20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3f30: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
3f40: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
3f50: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
3f60: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
3f70: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
3f80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 65  .    case SRT_Te
3f90: 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20  mpTable: {.     
3fa0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3fb0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3fc0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
3fd0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3fe0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
3ff0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4000: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
4010: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4030: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
4040: 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30  wRecno, iParm, 0
4050: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4060: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4070: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
4080: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4090: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
40a0: 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  ntKey, iParm, 0)
40b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
40c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
40d0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
40e0: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
40f0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
4100: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
4110: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
4120: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
4130: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
4140: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
4150: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
4160: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
4170: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
4180: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
4190: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
41a0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
41b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
41c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
41d0: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
41e0: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
41f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4200: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
4210: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
4220: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
4230: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4240: 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  P_Delete, iParm,
4250: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4260: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4270: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
4280: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
4290: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
42a0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
42b0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
42c0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
42d0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
42e0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
42f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
4300: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
4310: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
4320: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
4330: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
4340: 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d  .      int lbl =
4350: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
4360: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
4370: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4380: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4390: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
43a0: 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20 6c 62 6c  _IsNull, -1, lbl
43b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
43c0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
43d0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
43e0: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
43f0: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
4400: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4410: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4420: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4440: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4450: 74 53 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tStrKey, iParm, 
4460: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4470: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
4480: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
4490: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
44b0: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
44c0: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
44d0: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
44e0: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
44f0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
4500: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
4510: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
4520: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
4530: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
4540: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
4550: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
4560: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4570: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4580: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4590: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
45a0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
45b0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
45c0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
45d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
45e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
45f0: 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
4600: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
4610: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4620: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65  OP_Goto, 0, iBre
4630: 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ak);.      }.   
4640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4650: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
4660: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
4670: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
4680: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4690: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
46a0: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
46b0: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
46c0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
46d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
46e0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b  Op(v, OP_SortMak
46f0: 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  eRec, nColumn, 0
4700: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
4710: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4720: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
4730: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4740: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4750: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
4760: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4770: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4780: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4790: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
47a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
47b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f    }..    /* Invo
47c0: 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  ke a subroutine 
47d0: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65  to handle the re
47e0: 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62 72  sults.  The subr
47f0: 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20 20  outine itself.  
4800: 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69    ** is responsi
4810: 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67 20  ble for popping 
4820: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66 20  the results off 
4830: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
4840: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4850: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4860: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4870: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4880: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4890: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
48a0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
48b0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
48c0: 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70  ter(pParse, v, p
48d0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
48e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
48f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4900: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
4910: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
4920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4930: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  }..    /* Discar
4940: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
4950: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4960: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4970: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
4980: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
4990: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
49a0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
49b0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
49c0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
49d0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
49e0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
49f0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
4a00: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
4a10: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
4a20: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
4a30: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
4a40: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4a50: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
4a60: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
4a70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4a80: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4a90: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4aa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4ab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4ac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
4ad0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4ae0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4af0: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
4b00: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
4b10: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
4b20: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
4b30: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
4b40: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
4b50: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
4b60: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
4b70: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
4b80: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
4b90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
4ba0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4bb0: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4bc0: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4be0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4bf0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
4c00: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
4c10: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
4c20: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
4c30: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
4c40: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
4c50: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4c60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4c70: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
4c80: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
4c90: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
4ca0: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
4cb0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
4cc0: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
4cd0: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
4ce0: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
4cf0: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
4d00: 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20 73 71 6c  .  int end = sql
4d10: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
4d20: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
4d30: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
4d40: 54 5f 53 6f 72 74 65 72 20 29 20 72 65 74 75 72  T_Sorter ) retur
4d50: 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  n;.  sqliteVdbeA
4d60: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
4d70: 20 30 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d   0, 0);.  addr =
4d80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4d90: 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c  (v, OP_SortNext,
4da0: 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69 66 28 20   0, end);.  if( 
4db0: 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20 29 7b 0a  p->nOffset>0 ){.
4dc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4dd0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
4de0: 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74 2c 20 61  r, p->nOffset, a
4df0: 64 64 72 2b 34 29 3b 0a 20 20 20 20 73 71 6c 69  ddr+4);.    sqli
4e00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4e10: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
4e20: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4e30: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4e40: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66   addr);.  }.  if
4e50: 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29  ( p->nLimit>=0 )
4e60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
4e70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
4e80: 6e 63 72 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20  ncr, p->nLimit, 
4e90: 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  end);.  }.  swit
4ea0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
4eb0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
4ec0: 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck: {.      sqli
4ed0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4ee0: 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63 6b 2c 20  P_SortCallback, 
4ef0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
4f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4f10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
4f20: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
4f30: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
4f40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4f50: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
4f60: 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  no, iParm, 0);. 
4f70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4f80: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
4f90: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
4fa0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4fb0: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69   OP_PutIntKey, i
4fc0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4fd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4fe0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
4ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
5000: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
5010: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5020: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
5030: 20 2d 31 2c 20 73 71 6c 69 74 65 56 64 62 65 43   -1, sqliteVdbeC
5040: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
5050: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5060: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
5070: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
5080: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5090: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
50a0: 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  ey, iParm, 0);. 
50b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
50c0: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
50d0: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
50e0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
50f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5100: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
5110: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
5120: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5130: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
5140: 6f 74 6f 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20  oto, 0, end);.  
5150: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5160: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
5170: 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  broutine: {.    
5180: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
5190: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
51a0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
51b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
51c0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d  (v, OP_Column, -
51d0: 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  1-i, i);.      }
51e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
51f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
5200: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
5210: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5220: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
5230: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
5240: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
5250: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
5260: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
5270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56   }.  }.  sqliteV
5290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
52a0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20  oto, 0, addr);. 
52b0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
52c0: 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b  veLabel(v, end);
52d0: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
52e0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73  Op(v, OP_SortRes
52f0: 65 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  et, 0, 0);.}../*
5300: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
5310: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
5320: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 61   the VDBE the da
5330: 74 61 74 79 70 65 73 20 6f 66 0a 2a 2a 20 63 6f  tatypes of.** co
5340: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
5350: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
5360: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
5370: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
5380: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5390: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
53a0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61  text */.  int ba
53b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se,           /*
53c0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 63 6f 72   VDBE cursor cor
53d0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 66 69  responding to fi
53e0: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 54 61  rst entry in pTa
53f0: 62 4c 69 73 74 20 2a 2f 0a 20 20 53 72 63 4c 69  bList */.  SrcLi
5400: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
5410: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
5420: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5430: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
5440: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
5450: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
5460: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5470: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
5490: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
54a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 70  ags & SQLITE_Rep
54b0: 6f 72 74 54 79 70 65 73 29 3d 3d 30 20 29 20 72  ortTypes)==0 ) r
54c0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
54d0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
54e0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
54f0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
5500: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
5510: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
5520: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
5530: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
5540: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
5550: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
5560: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
5570: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
5580: 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73  [p->iTable - bas
5590: 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e].pTab;.      i
55a0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
55b0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lumn;.      if( 
55c0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
55d0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
55e0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
55f0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5600: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5610: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5620: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
5630: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
5640: 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  GER";.      }els
5650: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
5660: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
5670: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
5680: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5690: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
56a0: 70 72 54 79 70 65 28 70 29 3d 3d 53 51 4c 49 54  prType(p)==SQLIT
56b0: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
56c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
56d0: 58 54 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  XT";.      }else
56e0: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
56f0: 3d 20 22 4e 55 4d 45 52 49 43 22 3b 0a 20 20 20  = "NUMERIC";.   
5700: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5710: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5720: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
5730: 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i + pEList->nEx
5740: 70 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  pr, 0);.    sqli
5750: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5760: 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 50 33 5f  , -1, zType, P3_
5770: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  STATIC);.  }.}..
5780: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
5790: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
57a0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
57b0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
57c0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
57d0: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
57e0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
57f0: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
5800: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6f 6c 75  ** azCol[] vaolu
5810: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
5820: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5830: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
5840: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
5850: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
5860: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
5870: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45           /* VDBE
5890: 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
58a0: 6e 64 69 6e 67 20 74 6f 20 66 69 72 73 74 20 65  nding to first e
58b0: 6e 74 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74  ntry in pTabList
58c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
58d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
58e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
58f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5900: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
5910: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
5920: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
5930: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5940: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
5950: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
5960: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5970: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  || v==0 || sqlit
5980: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
5990: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
59a0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
59b0: 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 1;.  for(i=0; 
59c0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
59d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
59e0: 2a 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *p;.    char *zT
59f0: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ype = 0;.    int
5a00: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 3b 0a   showFullNames;.
5a10: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
5a20: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
5a30: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
5a40: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
5a50: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
5a60: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
5a70: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
5a80: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
5a90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5aa0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
5ab0: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
5ac0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
5ad0: 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c  P3(v, -1, zName,
5ae0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
5af0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
5b00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 46  .    }.    showF
5b10: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 70 50 61 72  ullNames = (pPar
5b20: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5b30: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
5b40: 6d 65 73 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  mes)!=0;.    if(
5b50: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
5b60: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
5b70: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
5b80: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
5b90: 5b 70 2d 3e 69 54 61 62 6c 65 20 2d 20 62 61 73  [p->iTable - bas
5ba0: 65 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e].pTab;.      c
5bb0: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
5bc0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
5bd0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66  Column;.      if
5be0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
5bf0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
5c00: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
5c10: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
5c20: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
5c30: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
5c40: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
5c50: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f       zCol = "_RO
5c60: 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7a  WID_";.        z
5c70: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
5c80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5c90: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
5ca0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5cb0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 54  Name;.        zT
5cc0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
5cd0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
5ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5cf0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
5d00: 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73 68  span.z[0] && !sh
5d10: 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  owFullNames ){. 
5d20: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
5d30: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
5d40: 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  p(v,OP_ColumnNam
5d50: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
5d60: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
5d70: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 73  geP3(v, -1, p->s
5d80: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5da0: 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61  eVdbeCompressSpa
5db0: 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  ce(v, addr);.   
5dc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
5dd0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 7c 7c  bList->nSrc>1 ||
5de0: 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29   showFullNames )
5df0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
5e00: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
5e10: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
5e20: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
5e30: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 2d 3e 69  pTabList->a[p->i
5e40: 54 61 62 6c 65 20 2d 20 62 61 73 65 5d 2e 7a 41  Table - base].zA
5e50: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
5e60: 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20  ( showFullNames 
5e70: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
5e80: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
5e90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
5ea0: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
5eb0: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
5ec0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
5ed0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5ee0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
5ef0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
5f00: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5f10: 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  3(v, -1, zName, 
5f20: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
5f30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
5f40: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
5f50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5f60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5f70: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
5f80: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
5f90: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5fa0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 2c  eP3(v, -1, zCol,
5fb0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
5fc0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
5fd0: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
5fe0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  z[0] ){.      in
5ff0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
6000: 64 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f 43 6f  dbeAddOp(v,OP_Co
6010: 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b  lumnName, i, 0);
6020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6030: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6040: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
6050: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71  pan.n);.      sq
6060: 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73  liteVdbeCompress
6070: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a  Space(v, addr);.
6080: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6090: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b   char zName[30];
60a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
60b0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
60c0: 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29  || pTabList==0 )
60d0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
60e0: 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64  zName, "column%d
60f0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73  ", i+1);.      s
6100: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6110: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
6120: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
6130: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6140: 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 73  (v, -1, zName, s
6150: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
6160: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6170: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
6180: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
6190: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
61a0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
61b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
61c0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
61d0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
61e0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
61f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
6200: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
6210: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
6220: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6230: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
6240: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
6250: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
6260: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
6270: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
6280: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
6290: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
62a0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
62b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
62c0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
62d0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
62e0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
62f0: 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  t fillInColumnLi
6300: 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  st(Parse*, Selec
6310: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t*);../*.** Give
6320: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
6330: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
6340: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
6350: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
6360: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
6370: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
6380: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
6390: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
63a0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
63b0: 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  e, char *zTabNam
63c0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
63d0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
63e0: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ab;.  int i;.  E
63f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
6400: 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f  ..  if( fillInCo
6410: 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c  lumnList(pParse,
6420: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
6430: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6440: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61   pTab = sqliteMa
6450: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
6460: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
6470: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
6480: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
6490: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
64a0: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
64b0: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
64c0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
64d0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
64e0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
64f0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
6500: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
6510: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
6520: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
6530: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
6540: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
6550: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ol );.  for(i=0;
6560: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
6570: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
6580: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
6590: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
65a0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
65b0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
65c0: 74 65 53 74 72 44 75 70 28 70 45 4c 69 73 74 2d  teStrDup(pEList-
65d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
65e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 3d 70    }else if( (p=p
65f0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6600: 72 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d  r)->span.z && p-
6610: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
6620: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
6630: 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c  ring(&pTab->aCol
6640: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e 73 70  [i].zName, p->sp
6650: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 2c  an.z, p->span.n,
6660: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   0);.    }else i
6670: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
6680: 20 26 26 20 70 2d 3e 70 52 69 67 68 74 20 26 26   && p->pRight &&
6690: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
66a0: 6e 2e 7a 20 26 26 0a 20 20 20 20 20 20 20 20 20  n.z &&.         
66b0: 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b    p->pRight->tok
66c0: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
66d0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
66e0: 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  g(&pTab->aCol[i]
66f0: 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
6700: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74      p->pRight->t
6710: 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69 67 68  oken.z, p->pRigh
6720: 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  t->token.n, 0);.
6730: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6740: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
6750: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
6760: 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  uf, "column%d", 
6770: 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54 61 62  i+1);.      pTab
6780: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20  ->aCol[i].zName 
6790: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
67a0: 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
67b0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
67c0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61  -1;.  return pTa
67d0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  b;.}../*.** For 
67e0: 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
67f0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f 20 74   statement, do t
6800: 68 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a 2a 0a  hree things..**.
6810: 2a 2a 20 20 20 20 28 31 29 20 20 46 69 6c 6c 20  **    (1)  Fill 
6820: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
6830: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
6840: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
6850: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
6860: 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 65 74   defines the set
6870: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
6880: 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e 6e 65  should be scanne
6890: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  d. .**.**    (2)
68a0: 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
68b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
68c0: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
68d0: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
68e0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
68f0: 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
6900: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
6910: 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
6920: 2a 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74  *    (3)  Scan t
6930: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
6940: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
6950: 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
6960: 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
6970: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
6980: 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
6990: 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
69a0: 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
69b0: 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
69c0: 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
69d0: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
69e0: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
69f0: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
6a00: 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
6a10: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
6a20: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  TABLE..**.** Ret
6a30: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
6a40: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
6a50: 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20  problems, leave 
6a60: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6a70: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
6a80: 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  d return non-zer
6a90: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
6aa0: 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73   fillInColumnLis
6ab0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6ac0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
6ad0: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
6ae0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
6af0: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
6b00: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
6b10: 20 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70   *pTab;..  if( p
6b20: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
6b30: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
6b40: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
6b50: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
6b60: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
6b70: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
6b80: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
6b90: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f   list..  */.  fo
6ba0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
6bb0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
6bc0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
6bd0: 3e 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20  >a[i].pTab ){.  
6be0: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
6bf0: 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
6c00: 72 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  re!  No need to 
6c10: 63 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20  continue */.    
6c20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6c30: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  }.    if( pTabLi
6c40: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
6c50: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
6c60: 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
6c70: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
6c80: 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
6c90: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
6ca0: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
6cb0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
6cc0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
6cd0: 7a 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  zAlias==0 ){.   
6ce0: 20 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e       char zFakeN
6cf0: 61 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20  ame[60];.       
6d00: 20 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61   sprintf(zFakeNa
6d10: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71  me, "sqlite_subq
6d20: 75 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20  uery_%p_",.     
6d30: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61        (void*)pTa
6d40: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
6d50: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ect);.        sq
6d60: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
6d70: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
6d80: 6c 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c  lias, zFakeName,
6d90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
6da0: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6db0: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ].pTab = pTab = 
6dc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52  .        sqliteR
6dd0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
6de0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
6df0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a  t->a[i].zAlias,.
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
6e30: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
6e40: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
6e50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
6e60: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
6e70: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72        pTab->isTr
6e80: 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20 20 20  ansient = 1;.   
6e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
6ea0: 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
6eb0: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
6ec0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
6ed0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  se */.      pTab
6ee0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
6ef0: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
6f00: 20 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c    sqliteFindTabl
6f10: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  e(pParse->db, pT
6f20: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
6f30: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
6f40: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
6f50: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
6f60: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
6f70: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
6f80: 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  le: ", .        
6f90: 20 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69     pTabList->a[i
6fa0: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
6fb0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
6fc0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
6fd0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6fe0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
6ff0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
7000: 20 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77    if( sqliteView
7010: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
7020: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
7030: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7040: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7050: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65        sqliteSele
7060: 63 74 44 65 6c 65 74 65 28 70 54 61 62 4c 69 73  ctDelete(pTabLis
7070: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29  t->a[i].pSelect)
7080: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 4c 69  ;.        pTabLi
7090: 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
70a0: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44   = sqliteSelectD
70b0: 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  up(pTab->pSelect
70c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
70d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
70e0: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
70f0: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
7100: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
7110: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
7120: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
7130: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
7140: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
7150: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
7160: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
7170: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
7180: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
7190: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
71a0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
71b0: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
71c0: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
71d0: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
71e0: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
71f0: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
7200: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
7210: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
7220: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
7230: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
7240: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
7250: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
7260: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
7270: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7280: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
7290: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
72a0: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
72b0: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
72c0: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
72d0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
72e0: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
72f0: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
7300: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
7310: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
7320: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
7330: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
7340: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
7350: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
7360: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
7370: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
7380: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
7390: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
73a0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
73b0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
73c0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
73d0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
73e0: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
73f0: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
7400: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
7410: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
7420: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
7430: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
7440: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
7450: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
7460: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
7470: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
7480: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
7490: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
74a0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
74b0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
74c0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
74d0: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
74e0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
74f0: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
7500: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7510: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
7520: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
7530: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
7540: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
7550: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
7560: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
7570: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
7580: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
7590: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
75a0: 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
75b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
75c0: 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
75d0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
75e0: 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
75f0: 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
7600: 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
7610: 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
7620: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
7630: 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
7640: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
7650: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
7660: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
7670: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
7680: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
7690: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
76a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
76b0: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
76c0: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
76d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
76e0: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
76f0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
7700: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
7710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
7720: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7730: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
7740: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
7750: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
7760: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
7770: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
7780: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
7790: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
77a0: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
77b0: 2a 2f 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  */.        Token
77c0: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *pName;        
77d0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
77e0: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
77f0: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
7800: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
7810: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
7820: 20 20 20 20 70 4e 61 6d 65 20 3d 20 26 70 45 2d      pName = &pE-
7830: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
7840: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7850: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 20 3d 20          pName = 
7860: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
7870: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7880: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
7890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
78a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
78b0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
78c0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
78d0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
78e0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
78f0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
7900: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
7910: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
7920: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
7930: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
7940: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
7960: 66 28 20 70 4e 61 6d 65 20 26 26 20 28 7a 54 61  f( pName && (zTa
7970: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
7980: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20  Name[0]==0 || . 
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
79b0: 4e 61 6d 65 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d  Name->z, zTabNam
79c0: 65 2c 20 70 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20  e, pName->n)!=0 
79d0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
79e0: 20 20 20 20 7a 54 61 62 4e 61 6d 65 5b 70 4e 61      zTabName[pNa
79f0: 6d 65 2d 3e 6e 5d 21 3d 30 29 20 29 7b 0a 20 20  me->n]!=0) ){.  
7a00: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7a10: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
7a20: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
7a30: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
7a40: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
7a50: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
7a70: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
7a80: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
7a90: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
7aa0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
7ab0: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
7ac0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
7ad0: 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   (pTabList->a[i-
7ae0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
7af0: 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a  _NATURAL)!=0 &&.
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  columnIndex(pTab
7b20: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61  List->a[i-1].pTa
7b30: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b50: 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
7b60: 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
7b70: 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
7b80: 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
7b90: 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
7ba0: 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
7bb0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
7bc0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
7bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7be0: 20 69 3e 30 20 26 26 20 73 71 6c 69 74 65 49 64   i>0 && sqliteId
7bf0: 4c 69 73 74 49 6e 64 65 78 28 70 54 61 62 4c 69  ListIndex(pTabLi
7c00: 73 74 2d 3e 61 5b 69 2d 31 5d 2e 70 55 73 69 6e  st->a[i-1].pUsin
7c10: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c30: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
7c40: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
7c50: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
7c60: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
7c70: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
7c80: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
7c90: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
7ca0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
7cb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7cd0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
7ce0: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
7cf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
7d00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
7d10: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
7d20: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
7d30: 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b  token.z = zName;
7d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
7d50: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73  ght->token.n = s
7d60: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
7d70: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
7d80: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7da0: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 70 54 61   zTabName && pTa
7db0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
7dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7dd0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
7de0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
7df0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7e00: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45   pExpr = sqliteE
7e10: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
7e20: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
7e40: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
7e50: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
7e60: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20   pLeft->token.z 
7e70: 3d 20 7a 54 61 62 4e 61 6d 65 3b 0a 20 20 20 20  = zTabName;.    
7e80: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d            pLeft-
7e90: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
7ea0: 6e 28 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  n(zTabName);.   
7eb0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
7ec0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
7ee0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 28  qliteSetString((
7ef0: 63 68 61 72 2a 2a 29 26 70 45 78 70 72 2d 3e 73  char**)&pExpr->s
7f00: 70 61 6e 2e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c  pan.z, zTabName,
7f10: 20 22 2e 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b   ".", zName, 0);
7f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7f30: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73  Expr->span.n = s
7f40: 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 73 70 61  trlen(pExpr->spa
7f50: 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n.z);.          
7f60: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
7f70: 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  dyn = 1;.       
7f80: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
7f90: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20  ken.z = 0;.     
7fa0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7fb0: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20  token.n = 0;.   
7fc0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7fd0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
7ff0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8000: 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
8010: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8020: 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45  pExpr->span = pE
8030: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  xpr->token;.    
8040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8050: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
8060: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
8070: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 30  d(pNew, pExpr, 0
8080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
80a0: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
80b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
80c0: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   pName ){.      
80d0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
80e0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
80f0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
8100: 68 20 74 61 62 6c 65 3a 20 22 2c 20 2d 31 2c 20  h table: ", -1, 
8110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8120: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8130: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 0);.         
8140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8150: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
8160: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8170: 72 4d 73 67 2c 20 22 6e 6f 20 74 61 62 6c 65 73  rMsg, "no tables
8180: 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
8190: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
81a0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
81b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
81c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
81d0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
81e0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
81f0: 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
8200: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8210: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8220: 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c  utine recursivel
8230: 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65  y unlinks the Se
8240: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54  lect.pSrc.a[].pT
8250: 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69  ab pointers.** i
8260: 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63  n a select struc
8270: 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73  ture.  It just s
8280: 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ets the pointers
8290: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a   to NULL.  This.
82a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ** routine is re
82b0: 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73  cursive in the s
82c0: 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65  ense that if the
82d0: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d   Select.pSrc.a[]
82e0: 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e  .pSelect.** poin
82f0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
8300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8310: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
8320: 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e  ely on that poin
8330: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
8340: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8350: 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20  d on the Select 
8360: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8370: 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57  efines a.** VIEW
8380: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64   in order to und
8390: 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74  o any bindings t
83a0: 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20  o tables.  This 
83b0: 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  is necessary.** 
83c0: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61  because those ta
83d0: 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52  bles might be DR
83e0: 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71  OPed by a subseq
83f0: 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  uent SQL command
8400: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8410: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
8420: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
8430: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
8440: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54  c = p->pSrc;.  T
8450: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
8460: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
8470: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
8480: 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
8490: 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
84a0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  pSrc->a[i].pTab)
84b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
84c0: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
84d0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
84e0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
84f0: 30 2c 20 70 54 61 62 29 3b 0a 23 69 66 20 30 0a  0, pTab);.#if 0.
8500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
8510: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 72 63 2d  lectDelete(pSrc-
8520: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
8530: 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
8540: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  i].pSelect = 0;.
8550: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
8560: 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e       pSrc->a[i].
8570: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
8580: 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  if( pSrc->a[i].p
8590: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
85a0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e    sqliteSelectUn
85b0: 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b 69 5d 2e  bind(pSrc->a[i].
85c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
85d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
85e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
85f0: 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74  e associates ent
8600: 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52  ries in an ORDER
8610: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   BY expression l
8620: 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75  ist with.** colu
8630: 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e  mns in a result.
8640: 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52    For each ORDER
8650: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   BY expression, 
8660: 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a  the opcode of.**
8670: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e   the top-level n
8680: 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ode is changed t
8690: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  o TK_COLUMN and 
86a0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  the iColumn valu
86b0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d  e of.** the top-
86c0: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69  level node is fi
86d0: 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c  lled in with col
86e0: 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  umn number and t
86f0: 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c  he iTable.** val
8700: 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  ue of the top-le
8710: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
8720: 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70  ed with iTable p
8730: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
8740: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69  If there are pri
8750: 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65  or SELECT clause
8760: 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63  s, they are proc
8770: 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20  essed first.  A 
8780: 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65  match.** in an e
8790: 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61  arlier SELECT ta
87a0: 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f  kes precedence o
87b0: 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45  ver a later SELE
87c0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e  CT..**.** Any en
87d0: 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  try that does no
87e0: 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67  t match is flagg
87f0: 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20  ed as an error. 
8800: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
8810: 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75  f errors is retu
8820: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
8830: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
8840: 54 20 63 6f 72 72 65 63 74 6c 79 20 69 6e 69 74  T correctly init
8850: 69 61 6c 69 7a 65 20 74 68 65 20 45 78 70 72 2e  ialize the Expr.
8860: 64 61 74 61 54 79 70 65 20 20 66 69 65 6c 64 0a  dataType  field.
8870: 2a 2a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ** of the ORDER 
8880: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  BY expressions. 
8890: 20 54 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   The multiSelect
88a0: 53 6f 72 74 4f 72 64 65 72 28 29 20 72 6f 75 74  SortOrder() rout
88b0: 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 63  ine.** must be c
88c0: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 61 74  alled to do that
88d0: 20 61 66 74 65 72 20 74 68 65 20 69 6e 64 69 76   after the indiv
88e0: 69 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74 61  idual select sta
88f0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65 20  tements.** have 
8900: 61 6c 6c 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65  all been analyze
8910: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
8920: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   is unable to co
8930: 6d 70 75 74 65 20 45 78 70 72 2e 64 61 74 61 54  mpute Expr.dataT
8940: 79 70 65 0a 2a 2a 20 62 65 63 61 75 73 65 20 69  ype.** because i
8950: 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
8960: 20 62 65 66 6f 72 65 20 74 68 65 20 69 6e 64 69   before the indi
8970: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 20 73 74  vidual select st
8980: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68 61 76 65  atements.** have
8990: 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 2e 0a   been analyzed..
89a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
89b0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
89c0: 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
89d0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
89e0: 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76   A place to leav
89f0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
8a00: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
8a10: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  elect,        /*
8a20: 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74   Match to result
8a30: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73   columns of this
8a40: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70   SELECT */.  Exp
8a50: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
8a60: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
8a70: 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d  R BY values to m
8a80: 61 74 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c  atch against col
8a90: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  umns */.  int iT
8aa0: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
8ab0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73    /* Insert this
8ac0: 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65   value in iTable
8ad0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f   */.  int mustCo
8ae0: 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a  mplete        /*
8af0: 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44   If TRUE all ORD
8b00: 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63  ER BYs must matc
8b10: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  h */.){.  int nE
8b20: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  rr = 0;.  int i,
8b30: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
8b40: 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  pEList;..  if( p
8b50: 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72  Select==0 || pOr
8b60: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
8b70: 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43  n 1;.  if( mustC
8b80: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66  omplete ){.    f
8b90: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
8ba0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
8bb0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
8bc0: 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a  done = 0; }.  }.
8bd0: 20 20 69 66 28 20 66 69 6c 6c 49 6e 43 6f 6c 75    if( fillInColu
8be0: 6d 6e 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  mnList(pParse, p
8bf0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
8c00: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
8c10: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
8c20: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
8c30: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
8c40: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
8c50: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
8c60: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
8c70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8c80: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
8c90: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
8ca0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
8cb0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
8cc0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8cd0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
8ce0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
8cf0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  r;.    int iCol 
8d00: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f  = -1;.    if( pO
8d10: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8d20: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8d30: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
8d40: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
8d50: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
8d60: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
8d70: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
8d80: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8d90: 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20  zBuf[200];.     
8da0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
8db0: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
8dc0: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
8dd0: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
8de0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 69 43  ",.           iC
8df0: 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
8e00: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
8e10: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8e20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 42  rse->zErrMsg, zB
8e30: 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
8e40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
8e50: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
8e60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8e80: 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29   !mustComplete )
8e90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8ea0: 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20   iCol--;.    }. 
8eb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c     for(j=0; iCol
8ec0: 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e  <0 && j<pEList->
8ed0: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
8ee0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
8ef0: 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45  [j].zName && (pE
8f00: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70  ->op==TK_ID || p
8f10: 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  E->op==TK_STRING
8f20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8f30: 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65  r *zName, *zLabe
8f40: 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  l;.        zName
8f50: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
8f60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
8f70: 73 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b 65 6e  ssert( pE->token
8f80: 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4c  .z );.        zL
8f90: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  abel = sqliteStr
8fa0: 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  NDup(pE->token.z
8fb0: 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  , pE->token.n);.
8fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
8fd0: 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b 0a 20  quote(zLabel);. 
8fe0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8ff0: 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  eStrICmp(zName, 
9000: 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20  zLabel)==0 ){ . 
9010: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
9020: 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  j;.        }.   
9030: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
9040: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
9050: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9060: 30 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 43  0 && sqliteExprC
9070: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
9080: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
9090: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
90a0: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
90b0: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
90c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
90d0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
90e0: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
90f0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
9100: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
9110: 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  le;.      pOrder
9120: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
9130: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
9140: 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43   iCol<0 && mustC
9150: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
9160: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
9170: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
9180: 75 66 2c 22 25 64 22 2c 69 2b 31 29 3b 0a 20 20  uf,"%d",i+1);.  
9190: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
91a0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
91b0: 72 4d 73 67 2c 20 22 4f 52 44 45 52 20 42 59 20  rMsg, "ORDER BY 
91c0: 74 65 72 6d 20 6e 75 6d 62 65 72 20 22 2c 20 7a  term number ", z
91d0: 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20  Buf, .        " 
91e0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
91f0: 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
9200: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  ", 0);.      pPa
9210: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
9220: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
9230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9240: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
9250: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20    .}../*.** Get 
9260: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
9270: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
9280: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
9290: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
92a0: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
92b0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
92c0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
92d0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
92e0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
92f0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 50 61  sqliteGetVdbe(Pa
9300: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
9310: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
9320: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
9330: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
9340: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
9350: 71 6c 69 74 65 56 64 62 65 43 72 65 61 74 65 28  qliteVdbeCreate(
9360: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d  pParse->db);.  }
9370: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
9380: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9390: 6e 65 20 73 65 74 73 20 74 68 65 20 45 78 70 72  ne sets the Expr
93a0: 2e 64 61 74 61 54 79 70 65 20 66 69 65 6c 64 20  .dataType field 
93b0: 6f 6e 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  on all elements 
93c0: 6f 66 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  of.** the pOrder
93d0: 42 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  By expression li
93e0: 73 74 2e 20 20 54 68 65 20 70 4f 72 64 65 72 42  st.  The pOrderB
93f0: 79 20 6c 69 73 74 20 77 69 6c 6c 20 68 61 76 65  y list will have
9400: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 20 75 70 20   been.** set up 
9410: 62 79 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  by matchOrderbyT
9420: 6f 43 6f 6c 75 6d 6e 28 29 2e 20 20 48 65 6e 63  oColumn().  Henc
9430: 65 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  e each expressio
9440: 6e 20 68 61 73 0a 2a 2a 20 61 20 54 4b 5f 43 4f  n has.** a TK_CO
9450: 4c 55 4d 4e 20 61 73 20 69 74 73 20 72 6f 6f 74  LUMN as its root
9460: 20 6e 6f 64 65 2e 20 20 54 68 65 20 45 78 70 72   node.  The Expr
9470: 2e 69 43 6f 6c 75 6d 6e 20 72 65 66 65 72 73 20  .iColumn refers 
9480: 74 6f 20 61 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  to a .** column 
9490: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
94a0: 74 2e 20 20 20 54 68 65 20 64 61 74 61 74 79 70  t.   The datatyp
94b0: 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
94c0: 54 45 5f 53 4f 5f 54 45 58 54 0a 2a 2a 20 69 66  TE_SO_TEXT.** if
94d0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
94e0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 20 61  ng column in p a
94f0: 6e 64 20 65 76 65 72 79 20 53 45 4c 45 43 54 20  nd every SELECT 
9500: 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 0a 2a  to the left of.*
9510: 2a 20 70 20 68 61 73 20 61 20 64 61 74 61 74 79  * p has a dataty
9520: 70 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 4f 5f  pe of SQLITE_SO_
9530: 54 45 58 54 2e 20 20 49 66 20 74 68 65 20 63 6f  TEXT.  If the co
9540: 6f 72 65 73 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  oressponding col
9550: 75 6d 6e 0a 2a 2a 20 69 6e 20 70 20 6f 72 20 61  umn.** in p or a
9560: 6e 79 20 6f 66 20 74 68 65 20 6c 65 66 74 20 53  ny of the left S
9570: 45 4c 45 43 54 73 20 69 73 20 53 51 4c 49 54 45  ELECTs is SQLITE
9580: 5f 53 4f 5f 4e 55 4d 2c 20 74 68 65 6e 20 74 68  _SO_NUM, then th
9590: 65 20 64 61 74 61 74 79 70 65 0a 2a 2a 20 6f 66  e datatype.** of
95a0: 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 65 78   the order-by ex
95b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 20  pression is set 
95c0: 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  to SQLITE_SO_NUM
95d0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
95e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
95f0: 54 20 61 2c 62 0a 2a 2f 20 0a 73 74 61 74 69 63  T a,b.*/ .static
9600: 20 76 6f 69 64 20 6d 75 6c 74 69 53 65 6c 65 63   void multiSelec
9610: 74 53 6f 72 74 4f 72 64 65 72 28 53 65 6c 65 63  tSortOrder(Selec
9620: 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a  t *p, ExprList *
9630: 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 6e 74  pOrderBy){.  int
9640: 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   i;.  ExprList *
9650: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4f  pEList;.  if( pO
9660: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
9670: 72 6e 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  rn;.  if( p==0 )
9680: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
9690: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
96a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; i++){.      pO
96b0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
96c0: 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53  pr->dataType = S
96d0: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
96e0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b     }.    return;
96f0: 0a 20 20 7d 0a 20 20 6d 75 6c 74 69 53 65 6c 65  .  }.  multiSele
9700: 63 74 53 6f 72 74 4f 72 64 65 72 28 70 2d 3e 70  ctSortOrder(p->p
9710: 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 29  Prior, pOrderBy)
9720: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
9730: 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
9740: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
9750: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9760: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
9770: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
9780: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 64 61 74  .    if( pE->dat
9790: 61 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 53 4f  aType==SQLITE_SO
97a0: 5f 4e 55 4d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _NUM ) continue;
97b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
97c0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 3b 0a 20  >iColumn>=0 );. 
97d0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e     if( pEList->n
97e0: 45 78 70 72 3e 70 45 2d 3e 69 43 6f 6c 75 6d 6e  Expr>pE->iColumn
97f0: 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 64 61   ){.      pE->da
9800: 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65 45  taType = sqliteE
9810: 78 70 72 54 79 70 65 28 70 45 4c 69 73 74 2d 3e  xprType(pEList->
9820: 61 5b 70 45 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  a[pE->iColumn].p
9830: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
9840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9850: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9860: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75   to process a qu
9870: 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c  ery that is real
9880: 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20  ly the union.** 
9890: 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  or intersection 
98a0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  of two or more s
98b0: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e  eparate queries.
98c0: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
98d0: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
98e0: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
98f0: 75 65 72 69 65 73 2e 20 20 54 68 65 20 72 65 73  ueries.  The res
9900: 75 6c 74 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  ults should.** b
9910: 65 20 73 74 6f 72 65 64 20 69 6e 20 65 44 65 73  e stored in eDes
9920: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
9930: 20 69 50 61 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69   iParm..*/.stati
9940: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
9950: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
9960: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
9970: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
9980: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9990: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63           /* Succ
99a0: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
99b0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
99c0: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
99d0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
99e0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
99f0: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
9a00: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
9a10: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
9a20: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
9a30: 56 44 42 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  VDBE */..  /* Ma
9a40: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
9a50: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
9a60: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
9a70: 45 43 54 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ECTs.  Only the 
9a80: 0a 20 20 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43  .  ** last SELEC
9a90: 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
9aa0: 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
9ab0: 52 20 42 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  R BY..  */.  if(
9ac0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69   p==0 || p->pPri
9ad0: 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  or==0 ) return 1
9ae0: 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
9af0: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 50  pPrior;.  if( pP
9b00: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
9b10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
9b20: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
9b30: 45 72 72 4d 73 67 2c 22 4f 52 44 45 52 20 42 59  ErrMsg,"ORDER BY
9b40: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
9b50: 6f 6d 65 20 61 66 74 65 72 20 22 2c 0a 20 20 20  ome after ",.   
9b60: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
9b70: 70 2d 3e 6f 70 29 2c 20 22 20 6e 6f 74 20 62 65  p->op), " not be
9b80: 66 6f 72 65 22 2c 20 30 29 3b 0a 20 20 20 20 70  fore", 0);.    p
9b90: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9ba0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9bb0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
9bc0: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
9bd0: 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20   query engine.  
9be0: 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61  If not, create a
9bf0: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
9c00: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
9c10: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
9c20: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
9c30: 31 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  1;..  /* Create 
9c40: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
9c50: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9c60: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
9c70: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
9c80: 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  RT_TempTable ){.
9c90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9ca0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
9cb0: 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  mp, iParm, 0);. 
9cc0: 20 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54     eDest = SRT_T
9cd0: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
9ce0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
9cf0: 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
9d00: 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
9d10: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
9d20: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
9d30: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
9d40: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
9d50: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
9d60: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9d70: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
9d80: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
9d90: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b  iParm, 0, 0, 0);
9da0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
9db0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
9dc0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
9dd0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
9de0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
9df0: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
9e00: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 29 3b  iParm, 0, 0, 0);
9e10: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
9e20: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
9e30: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
9e40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
9e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9e60: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49        /* For UNI
9e70: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
9e80: 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   BY fall through
9e90: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
9ea0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
9eb0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
9ec0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
9ed0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
9ee0: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
9ef0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
9f00: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
9f10: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
9f20: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  t */.      int o
9f30: 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  p;          /* O
9f40: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
9f50: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
9f60: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
9f70: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
9f80: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
9f90: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
9fa0: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
9fb0: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
9fc0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
9fd0: 3b 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20  ;  /* The ORDER 
9fe0: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
9ff0: 65 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a  e right SELECT *
a000: 2f 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  /..      priorOp
a010: 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
a020: 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
a030: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
a040: 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72  if( eDest==prior
a050: 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  Op && p->pOrderB
a060: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
a070: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
a080: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
a090: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
a0a0: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
a0b0: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
a0c0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a0d0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
a0e0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
a0f0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
a100: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
a110: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
a120: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
a130: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
a140: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
a150: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
a160: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
a170: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
a180: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
a190: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
a1a0: 0a 20 20 20 20 20 20 20 20 26 26 20 6d 61 74 63  .        && matc
a1b0: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
a1c0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
a1d0: 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61  OrderBy, unionTa
a1e0: 62 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b, 1) ){.       
a1f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a210: 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  f( p->op!=TK_ALL
a220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
a230: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a240: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e   OP_OpenTemp, un
a250: 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20 20 20  ionTab, 1);.    
a260: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a270: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
a280: 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c  sData, unionTab,
a290: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
a2a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
a2b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a2c0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e   OP_OpenTemp, un
a2d0: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
a2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
a2f0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
a300: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a310: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
a320: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
a330: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28   = sqliteSelect(
a340: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
a350: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
a360: 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
a370: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a380: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
a390: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
a3a0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
a3b0: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
a3c0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
a3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
a3e0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
a3f0: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
a400: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a410: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
a420: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
a430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a440: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
a450: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
a460: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
a470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
a480: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
a490: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
a4a0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
a4b0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
a4c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
a4d0: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
a4e0: 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62   p, op, unionTab
a4f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
a500: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
a510: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
a520: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
a530: 42 79 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  By;.      if( rc
a540: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a550: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
a560: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
a570: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
a580: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
a590: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
a5a0: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
a5b0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
a5c0: 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
a5d0: 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  f( eDest!=priorO
a5e0: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69  p || unionTab!=i
a5f0: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
a600: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
a610: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
a620: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
a630: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
a640: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
a650: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
a660: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
a670: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
a680: 20 70 2d 3e 62 61 73 65 2c 20 30 2c 20 70 2d 3e   p->base, 0, p->
a690: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
a6a0: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
a6b0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
a6c0: 2d 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c  ->base, p->pSrc,
a6d0: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
a6e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a6f0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 56 64  Break = sqliteVd
a700: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
a710: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
a720: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
a730: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
a740: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a750: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
a760: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
a770: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
a780: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  = sqliteVdbeCurr
a790: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
a7a0: 20 20 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53      multiSelectS
a7b0: 6f 72 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70  ortOrder(p, p->p
a7c0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
a7d0: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
a7e0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
a7f0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
a800: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
a810: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
a840: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
a850: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
a880: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
a890: 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  c ) return 1;.  
a8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a8b0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
a8c0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
a8d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a8e0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
a8f0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
a900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
a910: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a920: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
a930: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a940: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
a950: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
a960: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
a970: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
a980: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
a990: 69 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69  il(p, v, p->pELi
a9a0: 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
a9b0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
a9c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a9d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a9e0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
a9f0: 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  SECT: {.      in
aa00: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
aa10: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
aa20: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 0a  Break, iStart;..
aa30: 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
aa40: 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
aa50: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
aa60: 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
aa70: 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
aa80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
aa90: 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
aaa0: 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
aab0: 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
aac0: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
aad0: 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
aae0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
aaf0: 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
ab00: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
ab10: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
ab20: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
ab30: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
ab40: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
ab50: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d  lumn(pParse,p,p-
ab60: 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31  >pOrderBy,tab1,1
ab70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
ab80: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
ab90: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
aba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
abb0: 65 6d 70 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20  emp, tab1, 1);. 
abc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
abd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73  ddOp(v, OP_KeyAs
abe0: 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a  Data, tab1, 1);.
abf0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
ac00: 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
ac10: 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
ac20: 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
ac30: 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
ac40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53 65     rc = sqliteSe
ac50: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
ac60: 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  ior, SRT_Union, 
ac70: 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tab1, 0, 0, 0);.
ac80: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
ac90: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
aca0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
acb0: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
acc0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
acd0: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
ace0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
acf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
ad00: 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 31 29 3b  nTemp, tab2, 1);
ad10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ad20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79  eAddOp(v, OP_Key
ad30: 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29  AsData, tab2, 1)
ad40: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
ad50: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
ad60: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70  = sqliteSelect(p
ad70: 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e  Parse, p, SRT_Un
ad80: 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c  ion, tab2, 0, 0,
ad90: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
ada0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
adb0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
adc0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
add0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
ade0: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
adf0: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
ae00: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
ae10: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
ae20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
ae30: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
ae40: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
ae50: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
ae60: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  k ){.        gen
ae70: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
ae80: 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73 65  (pParse, p->base
ae90: 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  , 0, p->pEList);
aea0: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
aeb0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
aec0: 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 2d  rse, p->base, p-
aed0: 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74  >pSrc, p->pEList
aee0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
aef0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
af00: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
af10: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
af20: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
af30: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
af40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
af50: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
af60: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
af70: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
af80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af90: 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30  FullKey, tab1, 0
afa0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
afb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
afc0: 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
afd0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 6d 75 6c  Cont);.      mul
afe0: 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65  tiSelectSortOrde
aff0: 72 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  r(p, p->pOrderBy
b000: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
b010: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
b020: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
b030: 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c  st, tab1, p->pEL
b040: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64           p->pOrd
b070: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
b080: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
b0b0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eak);.      if( 
b0c0: 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rc ) return 1;. 
b0d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
b0e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
b0f0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
b100: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b110: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
b120: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
b130: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
b140: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
b150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
b160: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b170: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
b180: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b190: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b1a0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
b1b0: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
b1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
b1d0: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 2c 20  rateSortTail(p, 
b1e0: 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  v, p->pEList->nE
b1f0: 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72  xpr, eDest, iPar
b200: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
b210: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b220: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
b230: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
b240: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
b250: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
b260: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
b270: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
b280: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
b290: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
b2a0: 67 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  g, "SELECTs to t
b2b0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
b2c0: 74 20 6f 66 20 22 2c 0a 20 20 20 20 20 20 73 65  t of ",.      se
b2d0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
b2e0: 29 2c 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65  ), " do not have
b2f0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
b300: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
b310: 6e 73 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ns", 0);.    pPa
b320: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
b330: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
b340: 20 20 2f 2a 20 49 73 73 75 65 20 61 20 6e 75 6c    /* Issue a nul
b350: 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  l callback if th
b360: 61 74 20 69 73 20 77 68 61 74 20 74 68 65 20 75  at is what the u
b370: 73 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a  ser wants..  */.
b380: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64    if( (pParse->d
b390: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
b3a0: 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 29 21  E_NullCallback)!
b3b0: 3d 30 20 26 26 20 65 44 65 73 74 3d 3d 53 52 54  =0 && eDest==SRT
b3c0: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
b3d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b3e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62  (v, OP_NullCallb
b3f0: 61 63 6b 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ack, p->pEList->
b400: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  nExpr, 0);.  }. 
b410: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
b420: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
b430: 73 63 61 6e 20 74 68 72 6f 75 67 68 20 61 6e 20  scan through an 
b440: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
b450: 20 20 46 6f 72 20 65 76 65 72 79 20 72 65 66 65    For every refe
b460: 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 61 20 63 6f  rence.** to a co
b470: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
b480: 6d 62 65 72 20 69 46 72 6f 6d 2c 20 63 68 61 6e  mber iFrom, chan
b490: 67 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ge that referenc
b4a0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e to the.** same
b4b0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
b4c0: 20 6e 75 6d 62 65 72 20 69 54 6f 2e 0a 2a 2f 0a   number iTo..*/.
b4d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
b4e0: 67 65 54 61 62 6c 65 73 49 6e 4c 69 73 74 28 45  geTablesInList(E
b4f0: 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 69  xprList*, int, i
b500: 6e 74 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  nt);  /* Forward
b510: 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   Declaration */.
b520: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 61 6e  static void chan
b530: 67 65 54 61 62 6c 65 73 28 45 78 70 72 20 2a 70  geTables(Expr *p
b540: 45 78 70 72 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  Expr, int iFrom,
b550: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 66 28   int iTo){.  if(
b560: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
b570: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
b580: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
b590: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
b5a0: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 70 45  =iFrom ){.    pE
b5b0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  xpr->iTable = iT
b5c0: 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  o;.  }else{.    
b5d0: 63 68 61 6e 67 65 54 61 62 6c 65 73 28 70 45 78  changeTables(pEx
b5e0: 70 72 2d 3e 70 4c 65 66 74 2c 20 69 46 72 6f 6d  pr->pLeft, iFrom
b5f0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e  , iTo);.    chan
b600: 67 65 54 61 62 6c 65 73 28 70 45 78 70 72 2d 3e  geTables(pExpr->
b610: 70 52 69 67 68 74 2c 20 69 46 72 6f 6d 2c 20 69  pRight, iFrom, i
b620: 54 6f 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 54  To);.    changeT
b630: 61 62 6c 65 73 49 6e 4c 69 73 74 28 70 45 78 70  ablesInList(pExp
b640: 72 2d 3e 70 4c 69 73 74 2c 20 69 46 72 6f 6d 2c  r->pList, iFrom,
b650: 20 69 54 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61   iTo);.  }.}.sta
b660: 74 69 63 20 76 6f 69 64 20 63 68 61 6e 67 65 54  tic void changeT
b670: 61 62 6c 65 73 49 6e 4c 69 73 74 28 45 78 70 72  ablesInList(Expr
b680: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
b690: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
b6a0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  {.  if( pList ){
b6b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
b6c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
b6d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
b6e0: 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65       changeTable
b6f0: 73 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  s(pList->a[i].pE
b700: 78 70 72 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29  xpr, iFrom, iTo)
b710: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b720: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
b730: 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
b740: 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
b750: 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
b760: 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
b770: 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
b780: 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
b790: 70 79 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  py of the corres
b7a0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 6e 74 72 79  ponding.** entry
b7b0: 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
b7c0: 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
b7d0: 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
b7e0: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
b7f0: 6e 67 65 64 2e 29 20 20 57 68 65 6e 20 6d 61 6b  nged.)  When mak
b800: 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ing a copy of an
b810: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70   expression in p
b820: 45 4c 69 73 74 2c 20 63 68 61 6e 67 65 0a 2a 2a  EList, change.**
b830: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
b840: 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
b850: 69 53 75 62 20 69 6e 74 6f 20 72 65 66 65 72 65  iSub into refere
b860: 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 69 54  nces to table iT
b870: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  able..**.** This
b880: 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
b890: 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
b8a0: 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
b8b0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
b8c0: 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
b8d0: 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
b8e0: 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
b8f0: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
b900: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
b910: 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
b920: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
b930: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
b940: 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
b950: 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
b960: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
b970: 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
b980: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
b990: 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
b9a0: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
b9b0: 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
b9c0: 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
b9d0: 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
b9e0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
b9f0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
ba00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
ba10: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
ba20: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
ba30: 69 73 74 2a 2c 69 6e 74 29 3b 20 20 2f 2a 20 46  ist*,int);  /* F
ba40: 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
ba50: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
ba60: 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72  Expr(Expr *pExpr
ba70: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
ba80: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
ba90: 69 6e 74 20 69 53 75 62 29 7b 0a 20 20 69 66 28  int iSub){.  if(
baa0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
bab0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
bac0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
bad0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
bae0: 3d 69 54 61 62 6c 65 20 26 26 20 70 45 78 70 72  =iTable && pExpr
baf0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
bb00: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
bb10: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
bb20: 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
bb30: 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
bb40: 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73  nExpr );.    ass
bb50: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
bb60: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
bb70: 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
bb80: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
bb90: 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
bba0: 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
bbb0: 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  mn].pExpr;.    a
bbc0: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29  ssert( pNew!=0 )
bbd0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
bbe0: 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20  = pNew->op;.    
bbf0: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
bc00: 3d 20 70 4e 65 77 2d 3e 64 61 74 61 54 79 70 65  = pNew->dataType
bc10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
bc20: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
bc30: 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  .    pExpr->pLef
bc40: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  t = sqliteExprDu
bc50: 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a  p(pNew->pLeft);.
bc60: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
bc70: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
bc80: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
bc90: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  t = sqliteExprDu
bca0: 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  p(pNew->pRight);
bcb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
bcc0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
bcd0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
bce0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
bcf0: 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74  tDup(pNew->pList
bd00: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  );.    pExpr->iT
bd10: 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
bd20: 62 6c 65 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ble;.    pExpr->
bd30: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
bd40: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 45 78  iColumn;.    pEx
bd50: 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
bd60: 3e 69 41 67 67 3b 0a 20 20 20 20 73 71 6c 69 74  >iAgg;.    sqlit
bd70: 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  eTokenCopy(&pExp
bd80: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
bd90: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 73 71 6c  >token);.    sql
bda0: 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45  iteTokenCopy(&pE
bdb0: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
bdc0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 69 66 28  ->span);.    if(
bdd0: 20 69 53 75 62 21 3d 69 54 61 62 6c 65 20 29 7b   iSub!=iTable ){
bde0: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62  .      changeTab
bdf0: 6c 65 73 28 70 45 78 70 72 2c 20 69 53 75 62 2c  les(pExpr, iSub,
be00: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a   iTable);.    }.
be10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
be20: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c  stExpr(pExpr->pL
be30: 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
be40: 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 20 20  ist, iSub);.    
be50: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
be60: 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
be70: 20 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a   pEList, iSub);.
be80: 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
be90: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
bea0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20  iTable, pEList, 
beb0: 69 53 75 62 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  iSub);.  }.}.sta
bec0: 74 69 63 20 76 6f 69 64 20 0a 73 75 62 73 74 45  tic void .substE
bed0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
bee0: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61   *pList, int iTa
bef0: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
bf00: 45 4c 69 73 74 2c 20 69 6e 74 20 69 53 75 62 29  EList, int iSub)
bf10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
bf20: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
bf30: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
bf40: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
bf50: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
bf60: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
bf70: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
bf80: 4c 69 73 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d  List, iSub);.  }
bf90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bfa0: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
bfb0: 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
bfc0: 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
bfd0: 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
bfe0: 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
bff0: 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
c000: 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
c010: 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
c020: 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
c030: 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
c040: 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
c050: 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
c060: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
c070: 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
c080: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
c090: 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
c0a0: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
c0b0: 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
c0c0: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
c0d0: 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
c0e0: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
c0f0: 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
c100: 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
c110: 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
c120: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
c130: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
c140: 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
c150: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
c160: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
c170: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
c180: 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
c190: 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
c1a0: 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
c1b0: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
c1c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
c1d0: 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
c1e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c1f0: 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
c200: 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
c210: 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
c220: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c230: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
c240: 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
c250: 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
c260: 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
c270: 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
c280: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
c290: 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
c2a0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
c2b0: 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
c2c0: 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
c2d0: 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
c2e0: 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
c2f0: 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
c300: 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
c310: 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
c320: 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
c330: 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
c340: 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
c350: 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
c360: 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
c370: 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
c380: 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
c390: 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
c3a0: 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
c3b0: 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
c3c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
c3d0: 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
c3e0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
c3f0: 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
c400: 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
c410: 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
c420: 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
c430: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
c440: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
c450: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
c460: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
c470: 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
c480: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
c490: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
c4a0: 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
c4b0: 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
c4c0: 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
c4d0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
c4e0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  oin..**.**   (5)
c4f0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
c500: 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
c510: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
c520: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
c530: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
c540: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  tes..**.**   (6)
c550: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
c560: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
c570: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
c580: 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
c590: 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
c5a0: 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
c5b0: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
c5c0: 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
c5d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
c5e0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
c5f0: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
c600: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
c610: 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
c620: 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
c630: 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
c640: 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
c650: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
c660: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
c670: 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
c680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20  es..**.**  (10) 
c690: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
c6a0: 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
c6b0: 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
c6c0: 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
c6d0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20  t.**        use 
c6e0: 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
c6f0: 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
c700: 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
c710: 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
c720: 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
c730: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  lauses..**.** In
c740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
c750: 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
c760: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c770: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
c780: 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
c790: 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
c7a0: 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
c7b0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
c7c0: 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
c7d0: 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
c7e0: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
c7f0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
c800: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
c810: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
c820: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
c830: 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
c840: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
c850: 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
c860: 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
c870: 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
c880: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
c890: 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
c8a0: 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
c8b0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
c8c0: 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
c8d0: 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
c8e0: 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
c8f0: 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
c900: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
c910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
c920: 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
c930: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
c950: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c960: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
c970: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
c980: 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
c990: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
c9a0: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
c9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
c9c0: 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
c9d0: 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
c9e0: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
c9f0: 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
ca00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
ca10: 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
ca20: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
ca30: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
ca40: 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
ca50: 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
ca60: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
ca70: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
ca80: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  .){.  Select *pS
ca90: 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
caa0: 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
cab0: 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
cac0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
cad0: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
cae0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
caf0: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
cb00: 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
cb10: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
cb20: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
cb30: 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
cb40: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
cb50: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
cb60: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
cb70: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ery */.  int i;.
cb80: 20 20 69 6e 74 20 69 50 61 72 65 6e 74 2c 20 69    int iParent, i
cb90: 53 75 62 3b 0a 20 20 45 78 70 72 20 2a 70 57 68  Sub;.  Expr *pWh
cba0: 65 72 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ere;..  /* Check
cbb0: 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
cbc0: 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
cbd0: 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
cbe0: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
cbf0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
cc00: 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
cc10: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
cc20: 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
cc30: 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
cc40: 72 63 20 29 3b 0a 20 20 70 53 75 62 20 3d 20 70  rc );.  pSub = p
cc50: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53  Src->a[iFrom].pS
cc60: 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
cc70: 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
cc80: 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
cc90: 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
cca0: 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75  n 0;.  if( subqu
ccb0: 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
ccc0: 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
ccd0: 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d  n 0;.  pSubSrc =
cce0: 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
ccf0: 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
cd00: 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
cd10: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
cd20: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75 62  n 0;.  if( (pSub
cd30: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
cd40: 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29  pSub->nLimit>=0)
cd50: 20 26 26 20 20 28 70 53 72 63 2d 3e 6e 53 72 63   &&  (pSrc->nSrc
cd60: 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
cd70: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
cd80: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 69 73 44   }.  if( (p->isD
cd90: 69 73 74 69 6e 63 74 20 7c 7c 20 70 2d 3e 6e 4c  istinct || p->nL
cda0: 69 6d 69 74 3e 3d 30 29 20 26 26 20 73 75 62 71  imit>=0) && subq
cdb0: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
cdc0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
cdd0: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
cde0: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
cdf0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  rn 0;..  /* If w
ce00: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
ce10: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61  nt, it means fla
ce20: 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
ce30: 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  tted for the.  *
ce40: 2a 20 69 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  * i-th entry of 
ce50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
ce60: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
ce70: 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  ry..  */.  iPare
ce80: 6e 74 20 3d 20 70 2d 3e 62 61 73 65 20 2b 20 69  nt = p->base + i
ce90: 46 72 6f 6d 3b 0a 20 20 69 53 75 62 20 3d 20 70  From;.  iSub = p
cea0: 53 75 62 2d 3e 62 61 73 65 3b 0a 20 20 73 75 62  Sub->base;.  sub
ceb0: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  stExprList(p->pE
cec0: 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
ced0: 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75  Sub->pEList, iSu
cee0: 62 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  b);.  pList = p-
cef0: 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
cf00: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
cf10: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
cf20: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
cf30: 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
cf40: 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
cf50: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
cf60: 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
cf70: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
cf80: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
cf90: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
cfa0: 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
cfb0: 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
cfc0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
cfd0: 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
cfe0: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
cff0: 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
d000: 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29  b->pEList, iSub)
d010: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
d020: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
d030: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
d040: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 20 20  t, iSub);.  }.  
d050: 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
d060: 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
d070: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
d080: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
d090: 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
d0a0: 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
d0b0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
d0c0: 20 20 63 68 61 6e 67 65 54 61 62 6c 65 73 49 6e    changeTablesIn
d0d0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
d0e0: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
d0f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
d100: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
d110: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
d120: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
d130: 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
d140: 74 2c 20 69 53 75 62 29 3b 0a 20 20 7d 0a 20 20  t, iSub);.  }.  
d150: 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
d160: 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
d170: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
d180: 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
d190: 20 20 69 66 28 20 69 50 61 72 65 6e 74 21 3d 69    if( iParent!=i
d1a0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61  Sub ){.      cha
d1b0: 6e 67 65 54 61 62 6c 65 73 28 70 57 68 65 72 65  ngeTables(pWhere
d1c0: 2c 20 69 53 75 62 2c 20 69 50 61 72 65 6e 74 29  , iSub, iParent)
d1d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
d1e0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
d1f0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
d200: 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
d210: 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
d220: 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
d230: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
d240: 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
d250: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
d260: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
d270: 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
d280: 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 69 53  pSub->pEList, iS
d290: 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ub);.    if( pSu
d2a0: 62 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  b->pHaving ){.  
d2b0: 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e      Expr *pHavin
d2c0: 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  g = sqliteExprDu
d2d0: 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  p(pSub->pHaving)
d2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 61 72  ;.      if( iPar
d2f0: 65 6e 74 21 3d 69 53 75 62 20 29 7b 0a 20 20 20  ent!=iSub ){.   
d300: 20 20 20 20 20 63 68 61 6e 67 65 54 61 62 6c 65       changeTable
d310: 73 28 70 48 61 76 69 6e 67 2c 20 69 53 75 62 2c  s(pHaving, iSub,
d320: 20 69 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   iParent);.     
d330: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
d340: 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
d350: 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
d360: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e  sqliteExpr(TK_AN
d370: 44 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  D, p->pHaving, p
d380: 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20  Having, 0);.    
d390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d3a0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48   p->pHaving = pH
d3b0: 61 76 69 6e 67 3b 0a 20 20 20 20 20 20 7d 0a 20  aving;.      }. 
d3c0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
d3d0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
d3e0: 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
d3f0: 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  By = sqliteExprL
d400: 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
d410: 6f 75 70 42 79 29 3b 0a 20 20 20 20 69 66 28 20  oupBy);.    if( 
d420: 69 50 61 72 65 6e 74 21 3d 69 53 75 62 20 29 7b  iParent!=iSub ){
d430: 0a 20 20 20 20 20 20 63 68 61 6e 67 65 54 61 62  .      changeTab
d440: 6c 65 73 49 6e 4c 69 73 74 28 70 2d 3e 70 47 72  lesInList(p->pGr
d450: 6f 75 70 42 79 2c 20 69 53 75 62 2c 20 69 50 61  oupBy, iSub, iPa
d460: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
d470: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
d480: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
d490: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
d4a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
d4b0: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
d4c0: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
d4d0: 2d 3e 70 45 4c 69 73 74 2c 20 69 53 75 62 29 3b  ->pEList, iSub);
d4e0: 0a 20 20 20 20 69 66 28 20 70 57 68 65 72 65 20  .    if( pWhere 
d4f0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  ){.      p->pWhe
d500: 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  re = sqliteExpr(
d510: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68 65 72  TK_AND, p->pWher
d520: 65 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  e, pWhere, 0);. 
d530: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 69 73     }.  }.  p->is
d540: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
d550: 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
d560: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
d570: 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69 6d 69   if( pSub->nLimi
d580: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t>=0 ){.    if( 
d590: 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  p->nLimit<0 ){. 
d5a0: 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d       p->nLimit =
d5b0: 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b 0a 20   pSub->nLimit;. 
d5c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
d5d0: 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66 73 65  nLimit+p->nOffse
d5e0: 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t > pSub->nLimit
d5f0: 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74 20 29  +pSub->nOffset )
d600: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69  {.      p->nLimi
d610: 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74  t = pSub->nLimit
d620: 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74   + pSub->nOffset
d630: 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   - p->nOffset;. 
d640: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f     }.  }.  p->nO
d650: 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d 3e 6e  ffset += pSub->n
d660: 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 49 66  Offset;..  /* If
d670: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f   the subquery co
d680: 6e 74 61 69 6e 73 20 73 75 62 71 75 65 72 69 65  ntains subquerie
d690: 73 20 6f 66 20 69 74 73 20 6f 77 6e 2c 20 74 68  s of its own, th
d6a0: 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 2a 2a  at were not.  **
d6b0: 20 66 6c 61 74 74 65 6e 65 64 2c 20 74 68 65 6e   flattened, then
d6c0: 20 63 6f 64 65 20 77 69 6c 6c 20 68 61 76 65 20   code will have 
d6d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
d6e0: 65 72 61 74 65 64 20 74 6f 20 70 75 74 0a 20 20  erated to put.  
d6f0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ** the results o
d700: 66 20 74 68 6f 73 65 20 73 75 62 2d 73 75 62 71  f those sub-subq
d710: 75 65 72 69 65 73 20 69 6e 74 6f 20 56 44 42 45  ueries into VDBE
d720: 20 63 75 72 73 6f 72 73 20 72 65 6c 61 74 69 76   cursors relativ
d730: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 75  e.  ** to the su
d740: 62 71 75 65 72 79 2e 20 20 57 65 20 6d 75 73 74  bquery.  We must
d750: 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63   translate the c
d760: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74  ursor number int
d770: 6f 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 73 75  o values.  ** su
d780: 69 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62  itable for use b
d790: 79 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  y the outer quer
d7a0: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
d7b0: 30 3b 20 69 3c 70 53 75 62 53 72 63 2d 3e 6e 53  0; i<pSubSrc->nS
d7c0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64  rc; i++){.    Vd
d7d0: 62 65 20 2a 76 3b 0a 20 20 20 20 69 66 28 20 70  be *v;.    if( p
d7e0: 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  SubSrc->a[i].pSe
d7f0: 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
d800: 75 65 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  ue;.    v = sqli
d810: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
d820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d830: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6e  eAddOp(v, OP_Ren
d840: 61 6d 65 43 75 72 73 6f 72 2c 20 70 53 75 62 2d  ameCursor, pSub-
d850: 3e 62 61 73 65 2b 69 2c 20 70 2d 3e 62 61 73 65  >base+i, p->base
d860: 2b 69 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  +i);.  }..  if( 
d870: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
d880: 54 61 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69  Tab && pSrc->a[i
d890: 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72  From].pTab->isTr
d8a0: 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 73  ansient ){.    s
d8b0: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
d8c0: 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  (0, pSrc->a[iFro
d8d0: 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  m].pTab);.  }.  
d8e0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
d8f0: 54 61 62 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  Tab = pSubSrc->a
d900: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 53 75 62  [0].pTab;.  pSub
d910: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d  Src->a[0].pTab =
d920: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   0;.  assert( pS
d930: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 53 65  rc->a[iFrom].pSe
d940: 6c 65 63 74 3d 3d 70 53 75 62 20 29 3b 0a 20 20  lect==pSub );.  
d950: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70  pSrc->a[iFrom].p
d960: 53 65 6c 65 63 74 20 3d 20 70 53 75 62 53 72 63  Select = pSubSrc
d970: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
d980: 20 20 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e    pSubSrc->a[0].
d990: 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
d9a0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
d9b0: 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
d9c0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
d9d0: 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
d9e0: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
d9f0: 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d  d in as an argum
da00: 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
da10: 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20  .** is a simple 
da20: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
da30: 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20  uery.  If it is 
da40: 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63  and this query c
da50: 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69  an be.** satisfi
da60: 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ed using a singl
da70: 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65  e seek to the be
da80: 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f  ginning or end o
da90: 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  f an index,.** t
daa0: 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65  hen generate the
dab0: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53   code for this S
dac0: 45 4c 45 43 54 20 72 65 74 75 72 6e 20 31 2e 20  ELECT return 1. 
dad0: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
dae0: 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
daf0: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
db00: 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
db10: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
db20: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
db30: 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
db40: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
db50: 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
db60: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
db70: 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
db80: 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
db90: 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
dba0: 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
dbb0: 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
dbc0: 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
dbd0: 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
dbe0: 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
dbf0: 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
dc00: 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
dc10: 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
dc20: 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
dc30: 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
dc40: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
dc50: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
dc60: 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
dc70: 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
dc80: 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
dc90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
dca0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
dcb0: 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
dcc0: 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
dcd0: 69 74 65 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  iteSelect()..** 
dce0: 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
dcf0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
dd00: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
dd10: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
dd20: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
dd30: 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
dd40: 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
dd50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
dd60: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
dd70: 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
dd80: 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
dd90: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
dda0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
ddb0: 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
ddc0: 2a 76 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 4f 70  *v;.  int openOp
ddd0: 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
dde0: 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
ddf0: 70 72 4c 69 73 74 20 65 4c 69 73 74 3b 0a 20 20  prList eList;.  
de00: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
de10: 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a  item eListItem;.
de20: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
de30: 65 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79  ee if this query
de40: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e   is a simple min
de50: 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
de60: 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20  y.  Return.  ** 
de70: 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e  zero if it is  n
de80: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
de90: 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d  ->pGroupBy || p-
dea0: 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70  >pHaving || p->p
deb0: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
dec0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d  ;.  if( p->pSrc-
ded0: 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
dee0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  n 0;.  if( p->pE
def0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
df00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78   return 0;.  pEx
df10: 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
df20: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
df30: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
df40: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
df50: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
df60: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c  Expr->pList==0 |
df70: 7c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  | pExpr->pList->
df80: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
df90: 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
dfa0: 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
dfb0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
dfc0: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45  qliteStrNICmp(pE
dfd0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
dfe0: 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
dff0: 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69  seekOp = OP_Rewi
e000: 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nd;.  }else if( 
e010: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
e020: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
e030: 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
e040: 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73   seekOp = OP_Las
e050: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
e060: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
e070: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
e080: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
e090: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
e0a0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
e0b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20  eturn 0;.  iCol 
e0c0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
e0d0: 3b 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  ;.  pTab = p->pS
e0e0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
e0f0: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
e100: 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73  o here, it means
e110: 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
e120: 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72   the correct for
e130: 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  m..  ** Check to
e140: 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   make sure we ha
e150: 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  ve an index and 
e160: 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20  make pIdx point 
e170: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72  to the.  ** appr
e180: 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20  opriate index.  
e190: 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  If the min() or 
e1a0: 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49  max() is on an I
e1b0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20  NTEGER PRIMARY. 
e1c0: 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20   ** key column, 
e1d0: 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65  no index is nece
e1e0: 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64  ssary so set pId
e1f0: 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e  x to NULL.  If n
e200: 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e  o.  ** usable in
e210: 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65  dex is found, re
e220: 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
e230: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
e240: 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c   pIdx = 0;.  }el
e250: 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  se{.    for(pIdx
e260: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
e270: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
e280: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
e290: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e2a0: 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn>=1 );.      
e2b0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
e2c0: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 29 20 62 72  mn[0]==iCol ) br
e2d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
e2e0: 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
e2f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
e300: 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
e310: 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
e320: 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63  l be using the c
e330: 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
e340: 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
e350: 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
e360: 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20  t is going to a 
e370: 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72  table or a memor
e380: 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 76  y cell..  */.  v
e390: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
e3a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
e3b0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
e3c0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
e3d0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
e3e0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
e3f0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Names(pParse, p-
e400: 3e 62 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20  >base, p->pSrc, 
e410: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
e420: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
e430: 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62  pes(pParse, p->b
e440: 61 73 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d  ase, p->pSrc, p-
e450: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
e460: 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63   /* Generating c
e470: 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ode to find the 
e480: 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20  min or the max. 
e490: 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77   Basically all w
e4a0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
e4b0: 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69  o is find the fi
e4c0: 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20  rst or the last 
e4d0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f  entry in the cho
e4e0: 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20  sen index.  If. 
e4f0: 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   ** the min() or
e500: 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65   max() is on the
e510: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
e520: 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20   KEY, then find 
e530: 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f  the first.  ** o
e540: 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  r last entry in 
e550: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
e560: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
e570: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
e580: 65 64 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64  ed && (pParse->d
e590: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
e5a0: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
e5b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
e5c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
e5d0: 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73 65 2d  yCookie, pParse-
e5e0: 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  >db->schema_cook
e5f0: 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  ie, 0);.    pPar
e600: 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69  se->schemaVerifi
e610: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6f 70  ed = 1;.  }.  op
e620: 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73 54  enOp = pTab->isT
e630: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75 78  emp ? OP_OpenAux
e640: 20 3a 20 4f 50 5f 4f 70 65 6e 3b 0a 20 20 62 61   : OP_Open;.  ba
e650: 73 65 20 3d 20 70 2d 3e 62 61 73 65 3b 0a 20 20  se = p->base;.  
e660: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e670: 76 2c 20 6f 70 65 6e 4f 70 2c 20 62 61 73 65 2c  v, openOp, base,
e680: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
e690: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
e6a0: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
e6b0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
e6c0: 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
e6d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
e6e0: 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
e6f0: 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  p, base, 0);.  }
e700: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
e710: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65  VdbeAddOp(v, ope
e720: 6e 4f 70 2c 20 62 61 73 65 2b 31 2c 20 70 49 64  nOp, base+1, pId
e730: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71  x->tnum);.    sq
e740: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
e750: 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
e760: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
e770: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
e780: 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
e790: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
e7a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e7b0: 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f 2c 20  v, OP_IdxRecno, 
e7c0: 62 61 73 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20  base+1, 0);.    
e7d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e7e0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
e7f0: 65 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e+1, 0);.    sql
e800: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e810: 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65 2c  OP_MoveTo, base,
e820: 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
e830: 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
e840: 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
e850: 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
e860: 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
e870: 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
e880: 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
e890: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 63 6f  pr = pExpr;.  co
e8a0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
e8b0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73  akeLabel(v);.  s
e8c0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
e8d0: 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74  Parse, p, &eList
e8e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65  , 0, 0, 0, -1, e
e8f0: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e  Dest, iParm, con
e900: 74 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  t, cont);.  sqli
e910: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
e920: 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73  el(v, cont);.  s
e930: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e940: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
e950: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  , 0);.  return 1
e960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
e970: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
e980: 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
e990: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
e9a0: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
e9b0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
e9c0: 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
e9d0: 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76  ding on the.** v
e9e0: 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e  alue of eDest an
e9f0: 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  d iParm..**.**  
ea00: 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20     eDest Value  
ea10: 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20       Result.**  
ea20: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
ea30: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
ea40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
ea60: 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61  *     SRT_Callba
ea70: 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65  ck    Invoke the
ea80: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61   callback for ea
ea90: 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
eaa0: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult..**.**     
eab0: 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
eac0: 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75  Store first resu
ead0: 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  lt in memory cel
eae0: 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  l iParm.**.**   
eaf0: 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
eb00: 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
eb10: 61 73 20 6b 65 79 73 20 6f 66 20 61 20 74 61 62  as keys of a tab
eb20: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
eb30: 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
eb40: 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
eb50: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
eb60: 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
eb70: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
eb80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
eb90: 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
eba0: 65 20 72 65 73 75 6c 74 73 20 66 6f 72 6d 20 74  e results form t
ebb0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
ebc0: 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  le iParm..**.** 
ebd0: 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20      SRT_Table   
ebe0: 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
ebf0: 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
ec00: 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
ec10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
ec20: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
ec30: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
ec40: 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
ec50: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
ec60: 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
ec70: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
ec80: 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
ec90: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
eca0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ecb0: 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
ecc0: 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
ecd0: 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
ece0: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
ecf0: 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
ed00: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
ed10: 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
ed20: 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
ed30: 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
ed40: 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
ed50: 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
ed60: 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
ed70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
ed80: 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
ed90: 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
eda0: 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
edb0: 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
edc0: 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
edd0: 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
ede0: 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
edf0: 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
ee00: 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
ee10: 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
ee20: 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
ee30: 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
ee40: 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
ee50: 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
ee60: 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
ee70: 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
ee80: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ee90: 65 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  eSelect(.  Parse
eea0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
eeb0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
eec0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
eed0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
eee0: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
eef0: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
ef00: 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
ef10: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
ef20: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a 20       /* One of: 
ef30: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 4d 65 6d  SRT_Callback Mem
ef40: 20 53 65 74 20 55 6e 69 6f 6e 20 45 78 63 65 70   Set Union Excep
ef50: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
ef60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ef70: 20 53 61 76 65 20 72 65 73 75 6c 74 20 69 6e 20   Save result in 
ef80: 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  this memory loca
ef90: 74 69 6f 6e 2c 20 69 66 20 3e 3d 30 20 2a 2f 0a  tion, if >=0 */.
efa0: 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
efb0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
efc0: 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
efd0: 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
efe0: 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
eff0: 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
f000: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
f010: 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
f020: 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
f030: 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
f040: 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g        /* True
f050: 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
f060: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
f070: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ions */.){.  int
f080: 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   i;.  WhereInfo 
f090: 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20  *pWInfo;.  Vdbe 
f0a0: 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 20  *v;.  int isAgg 
f0b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
f0c0: 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
f0d0: 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
f0e0: 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
f0f0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
f100: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
f110: 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
f120: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
f130: 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
f140: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
f150: 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
f160: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
f170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f180: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
f190: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
f1a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
f1b0: 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
f1c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
f1d0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
f1e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
f1f0: 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
f200: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
f210: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
f220: 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
f230: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
f240: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
f250: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
f260: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
f270: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
f280: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
f290: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
f2a0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
f2b0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
f2c0: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
f2d0: 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
f2e0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61   set */.  int ba
f2f0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
f300: 20 2f 2a 20 46 69 72 73 74 20 63 75 72 73 6f 72   /* First cursor
f310: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
f320: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  se */.  int rc =
f330: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
f340: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
f350: 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
f360: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 73  tion */..  if( s
f370: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
f380: 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
f390: 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65  Err || p==0 ) re
f3a0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
f3b0: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
f3c0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
f3d0: 45 43 54 2c 20 30 2c 20 30 29 20 29 20 72 65 74  ECT, 0, 0) ) ret
f3e0: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 1;..  /* If 
f3f0: 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
f400: 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
f410: 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
f420: 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
f430: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
f440: 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
f450: 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
f460: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
f470: 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iParm);.  }..  /
f480: 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
f490: 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
f4a0: 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
f4b0: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
f4c0: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
f4d0: 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
f4e0: 57 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42  Where;.  pOrderB
f4f0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
f500: 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
f510: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
f520: 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
f530: 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
f540: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
f550: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
f560: 61 20 62 6c 6f 63 6b 20 6f 66 20 56 44 42 45 20  a block of VDBE 
f570: 63 75 72 73 6f 72 73 2c 20 6f 6e 65 20 66 6f 72  cursors, one for
f580: 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
f590: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
f5a0: 20 20 2a 2a 20 54 68 65 20 57 48 45 52 45 20 70    ** The WHERE p
f5b0: 72 6f 63 65 73 73 69 6e 67 20 72 65 71 75 69 72  rocessing requir
f5c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 75 72 73  es that the curs
f5d0: 6f 72 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ors for the tabl
f5e0: 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 46  es in the.  ** F
f5f0: 52 4f 4d 20 63 6c 61 75 73 65 20 62 65 20 63 6f  ROM clause be co
f600: 6e 73 65 63 75 74 69 76 65 2e 0a 20 20 2a 2f 0a  nsecutive..  */.
f610: 20 20 62 61 73 65 20 3d 20 70 2d 3e 62 61 73 65    base = p->base
f620: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
f630: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
f640: 2b 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  += pTabList->nSr
f650: 63 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  c;..  /* .  ** D
f660: 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
f670: 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
f680: 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
f690: 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
f6a0: 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
f6b0: 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
f6c0: 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
f6d0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
f6e0: 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
f6f0: 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  end;..  /* Look 
f700: 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 69  up every table i
f710: 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74  n the table list
f720: 20 61 6e 64 20 63 72 65 61 74 65 20 61 6e 20 61   and create an a
f730: 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20  ppropriate.  ** 
f740: 63 6f 6c 75 6d 6e 6c 69 73 74 20 69 6e 20 70 45  columnlist in pE
f750: 4c 69 73 74 20 69 66 20 74 68 65 72 65 20 69 73  List if there is
f760: 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61 64 79 2e  n't one already.
f770: 20 20 28 54 68 65 20 70 61 72 73 65 72 20 6c 65    (The parser le
f780: 61 76 65 73 0a 20 20 2a 2a 20 61 20 4e 55 4c 4c  aves.  ** a NULL
f790: 20 69 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73   in the p->pELis
f7a0: 74 20 69 66 20 74 68 65 20 53 51 4c 20 73 61 69  t if the SQL sai
f7b0: 64 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  d "SELECT * FROM
f7c0: 20 2e 2e 2e 22 29 0a 20 20 2a 2f 0a 20 20 69 66   ...").  */.  if
f7d0: 28 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69  ( fillInColumnLi
f7e0: 73 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  st(pParse, p) ){
f7f0: 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
f800: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 57 68 65  _end;.  }.  pWhe
f810: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
f820: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
f830: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
f840: 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  st==0 ) goto sel
f850: 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
f860: 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
f870: 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
f880: 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
f890: 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
f8a0: 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
f8b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 44 65  .  */.  if( (eDe
f8c0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
f8d0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26  Dest==SRT_Set) &
f8e0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
f8f0: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  1 ){.    sqliteS
f900: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
f910: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 6e 6c 79  ->zErrMsg, "only
f920: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
f930: 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
f940: 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
f950: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
f960: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 20  an expression", 
f970: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
f980: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
f990: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
f9a0: 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
f9b0: 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
f9c0: 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
f9d0: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
f9e0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
f9f0: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20  se SRT_Union:.  
fa00: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
fa10: 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  t:.    case SRT_
fa20: 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70  Discard:.      p
fa30: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
fa40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
fa50: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
fa60: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  ak;.  }..  /* At
fa70: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
fa80: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 6c 6f  should have allo
fa90: 63 61 74 65 64 20 61 6c 6c 20 74 68 65 20 63 75  cated all the cu
faa0: 72 73 6f 72 73 20 74 68 61 74 20 77 65 0a 20 20  rsors that we.  
fab0: 2a 2a 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c  ** need to handl
fac0: 65 20 73 75 62 71 75 65 72 79 73 20 61 6e 64 20  e subquerys and 
fad0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
fae0: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  .  .  **.  ** Re
faf0: 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
fb00: 20 6e 61 6d 65 73 20 61 6e 64 20 64 6f 20 61 20   names and do a 
fb10: 73 65 6d 61 6e 74 69 63 73 20 63 68 65 63 6b 20  semantics check 
fb20: 6f 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  on all the expre
fb30: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ssions..  */.  f
fb40: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
fb50: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
fb60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
fb70: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
fb80: 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69  se, base, pTabLi
fb90: 73 74 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 61  st, 0, pEList->a
fba0: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
fbb0: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
fbc0: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
fbd0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
fbe0: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  ck(pParse, pELis
fbf0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 31  t->a[i].pExpr, 1
fc00: 2c 20 26 69 73 41 67 67 29 20 29 7b 0a 20 20 20  , &isAgg) ){.   
fc10: 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
fc20: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  nd;.    }.  }.  
fc30: 69 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20  if( pWhere ){.  
fc40: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
fc50: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
fc60: 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73  e, base, pTabLis
fc70: 74 2c 20 70 45 4c 69 73 74 2c 20 70 57 68 65 72  t, pEList, pWher
fc80: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
fc90: 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
fca0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
fcb0: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
fcc0: 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29  e, pWhere, 0, 0)
fcd0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
fce0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
fcf0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 72 61 63 6c  .    sqliteOracl
fd00: 65 38 4a 6f 69 6e 46 69 78 75 70 28 62 61 73 65  e8JoinFixup(base
fd10: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
fd20: 72 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  re);.  }.  if( p
fd30: 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 69 66  Having ){.    if
fd40: 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
fd50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
fd60: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
fd70: 7a 45 72 72 4d 73 67 2c 20 22 61 20 47 52 4f 55  zErrMsg, "a GROU
fd80: 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
fd90: 65 71 75 69 72 65 64 20 22 0a 20 20 20 20 20 20  equired ".      
fda0: 20 20 20 22 62 65 66 6f 72 65 20 48 41 56 49 4e     "before HAVIN
fdb0: 47 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  G", 0);.      pP
fdc0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
fdd0: 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
fde0: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
fdf0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
fe00: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
fe10: 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  base, pTabList, 
fe20: 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67 29  pEList, pHaving)
fe30: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
fe40: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
fe50: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
fe60: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
fe70: 20 70 48 61 76 69 6e 67 2c 20 31 2c 20 26 69 73   pHaving, 1, &is
fe80: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  Agg) ){.      go
fe90: 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
fea0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
feb0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 66  OrderBy ){.    f
fec0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
fed0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
fee0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
fef0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
ff00: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
ff10: 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f  ( sqliteExprIsCo
ff20: 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
ff30: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
ff40: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
ff50: 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
ff60: 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29 7b  pE, &iCol)==0 ){
ff70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ff80: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
ff90: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20  se->zErrMsg, .  
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52               "OR
ffb0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 6d 75 73  DER BY terms mus
ffc0: 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74  t not be non-int
ffd0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 2c  eger constants",
ffe0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
fff0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
10000 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
10010 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
10020 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c    }else if( iCol
10030 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
10040 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
10050 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
10060 5b 32 30 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  [2000];.        
10070 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22    sprintf(zBuf,"
10080 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
10090 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66  number %d out of
100a0 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
100b0 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
100c0 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
100d0 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c 69   %d", iCol, pELi
100e0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
100f0 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
10100 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
10110 45 72 72 4d 73 67 2c 20 7a 42 75 66 2c 20 30 29  ErrMsg, zBuf, 0)
10120 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
10130 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
10140 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10150 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
10160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
10170 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20  xprDelete(pE);. 
10180 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64         pE = pOrd
10190 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
101a0 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
101b0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
101c0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
101d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
101e0 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
101f0 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
10200 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
10210 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20  , pE) ){.       
10220 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
10230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10240 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
10250 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20  eck(pParse, pE, 
10260 69 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20  isAgg, 0) ){.   
10270 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
10280 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
10290 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47    }.  }.  if( pG
102a0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f  roupBy ){.    fo
102b0 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
102c0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
102d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
102e0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
102f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
10300 20 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e   sqliteExprIsCon
10310 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20  stant(pE) ){.   
10320 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
10330 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
10340 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrMsg, .        
10350 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 65       "GROUP BY e
10360 78 70 72 65 73 73 69 6f 6e 73 20 73 68 6f 75 6c  xpressions shoul
10370 64 20 6e 6f 74 20 62 65 20 63 6f 6e 73 74 61 6e  d not be constan
10380 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  t", 0);.        
10390 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
103a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
103b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
103c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
103d0 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
103e0 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54  pParse, base, pT
103f0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
10400 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pE) ){.        g
10410 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
10420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10430 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
10440 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73  k(pParse, pE, is
10450 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Agg, 0) ){.     
10460 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
10470 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
10480 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
10490 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
104a0 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
104b0 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
104c0 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
104d0 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
104e0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
104f0 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
10500 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ry(pParse, p, eD
10510 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20  est, iParm) ){. 
10520 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67     rc = 0;.    g
10530 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
10540 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
10550 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
10560 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
10570 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
10580 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
10590 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
105a0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
105b0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
105c0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
105d0 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
105e0 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
105f0 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
10600 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
10610 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
10620 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
10630 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
10640 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
10650 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
10660 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
10670 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70 54 61 62  e, p->base, pTab
10680 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
10690 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
106a0 20 6c 69 6d 69 74 65 72 0a 20 20 2a 2f 0a 20 20   limiter.  */.  
106b0 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30  if( p->nLimit<=0
106c0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d 69   ){.    p->nLimi
106d0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6e  t = -1;.    p->n
106e0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 7d 65  Offset = 0;.  }e
106f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65  lse{.    int iMe
10700 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
10710 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  ++;.    sqliteVd
10720 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10730 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4c 69 6d 69  teger, -p->nLimi
10740 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
10750 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10760 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
10770 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d   1);.    p->nLim
10780 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 69  it = iMem;.    i
10790 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3c 3d 30  f( p->nOffset<=0
107a0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 66   ){.      p->nOf
107b0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  fset = 0;.    }e
107c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 4d 65 6d 20  lse{.      iMem 
107d0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
107e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
107f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10800 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66 73  teger, -p->nOffs
10810 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  et, 0);.      sq
10820 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10830 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
10840 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  em, 1);.      p-
10850 3e 6e 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b  >nOffset = iMem;
10860 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10870 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
10880 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
10890 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
108a0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  lause.  */.  for
108b0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
108c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
108d0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
108e0 61 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[i].pSelect==0 
108f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
10900 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
10910 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  rse, pTabList->a
10920 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54  [i].pSelect, SRT
10930 5f 54 65 6d 70 54 61 62 6c 65 2c 20 62 61 73 65  _TempTable, base
10940 2b 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +i,.            
10950 20 20 20 20 20 70 2c 20 69 2c 20 26 69 73 41 67       p, i, &isAg
10960 67 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  g);.    pTabList
10970 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
10980 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
10990 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
109a0 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
109b0 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
109c0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
109d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
109e0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
109f0 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
10a00 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
10a10 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
10a20 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
10a30 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
10a40 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
10a50 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63   subquery that c
10a60 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64  an be "flattened
10a70 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  " into its paren
10a80 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74  t..  ** If flatt
10a90 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69  ening is a possi
10aa0 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64  blity, do so and
10ab0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
10ac0 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  ely.  .  */.  if
10ad0 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
10ae0 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
10af0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
10b00 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
10b10 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50  , parentTab, *pP
10b20 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29  arentAgg, isAgg)
10b30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
10b40 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20  g ) *pParentAgg 
10b50 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
10b60 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64  rc;.  }..  /* Id
10b70 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79  entify column ty
10b80 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  pes if we will b
10b90 65 20 75 73 69 6e 67 20 69 6e 20 74 68 65 20 63  e using in the c
10ba0 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
10bb0 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
10bc0 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
10bd0 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20  t is going to a 
10be0 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72  table or a memor
10bf0 79 20 63 65 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  y cell..  */.  i
10c00 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
10c10 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
10c20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10c30 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 62 61 73  s(pParse, p->bas
10c40 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
10c50 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
10c60 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
10c70 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
10c80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
10c90 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
10ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
10cb0 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
10cc0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  e ){.    sqliteV
10cd0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
10ce0 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
10cf0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  0);.  }..  /* Do
10d00 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
10d10 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73  aggregate expres
10d20 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  sions..  */.  sq
10d30 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
10d40 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
10d50 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
10d60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
10d70 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20  e->nAgg==0 );.  
10d80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
10d90 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
10da0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
10db0 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
10dc0 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
10dd0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
10de0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
10df0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
10e00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10e10 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
10e20 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
10e30 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
10e40 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
10e50 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10e60 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
10e70 73 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  s(pParse, pGroup
10e80 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
10e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
10ea0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
10eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10ec0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
10ed0 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45  aving && sqliteE
10ee0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
10ef0 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61  ates(pParse, pHa
10f00 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
10f10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
10f20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
10f30 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
10f40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
10f50 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
10f60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
10f70 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
10f80 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
10f90 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  , pOrderBy->a[i]
10fa0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
10fb0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
10fc0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
10fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10fe0 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  }..  /* Reset th
10ff0 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a  e aggregator.  *
11000 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
11010 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
11020 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65  ddOp(v, OP_AggRe
11030 73 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  set, 0, pParse->
11040 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  nAgg);.    for(i
11050 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
11060 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
11070 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a  FuncDef *pFunc;.
11080 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
11090 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b   = pParse->aAgg[
110a0 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20  i].pFunc)!=0 && 
110b0 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
110c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
110d0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
110e0 2c 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c  , OP_AggInit, 0,
110f0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   i);.        sql
11100 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
11110 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 46  v, -1, (char*)pF
11120 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  unc, P3_POINTER)
11130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11140 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
11150 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
11160 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11170 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11180 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
11190 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
111a0 67 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20  gFocus, 0, 0);. 
111b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
111c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
111d0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
111e0 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  L.  */.  if( eDe
111f0 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
11200 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11210 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
11220 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
11230 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11240 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
11250 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
11260 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
11270 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
11280 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
11290 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
112a0 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
112b0 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
112c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
112d0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
112e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
112f0 20 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20   distinct, 1);. 
11300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
11310 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
11320 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
11330 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a  atabase scan.  *
11340 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
11350 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
11360 61 72 73 65 2c 20 70 2d 3e 62 61 73 65 2c 20 70  arse, p->base, p
11370 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
11380 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
113b0 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  &pOrderBy);.  if
113c0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
113d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
113e0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
113f0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
11400 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
11410 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
11420 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
11430 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
11440 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
11450 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
11460 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
11470 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
11480 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e   iParm, pWInfo->
114b0 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
114c0 6f 2d 3e 69 42 72 65 61 6b 29 20 29 7b 0a 20 20  o->iBreak) ){.  
114d0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
114e0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _end;.    }.  }.
114f0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
11500 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67  dealing with agg
11510 72 65 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f  regates, then do
11520 20 74 68 65 20 73 70 65 63 69 61 6c 20 61 67 67   the special agg
11530 72 65 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63  regate.  ** proc
11540 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20  essing.  .  */. 
11550 20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70   else{.    if( p
11560 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
11570 20 69 6e 74 20 6c 62 6c 31 3b 0a 20 20 20 20 20   int lbl1;.     
11580 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
11590 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
115a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
115b0 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
115c0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
115d0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
115e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
115f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
11600 65 4b 65 79 2c 20 70 47 72 6f 75 70 42 79 2d 3e  eKey, pGroupBy->
11610 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
11620 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
11630 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
11640 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54 79  ) sqliteAddKeyTy
11650 70 65 28 76 2c 20 70 47 72 6f 75 70 42 79 29 3b  pe(v, pGroupBy);
11660 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
11670 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
11680 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
11690 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
116a0 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c  P_AggFocus, 0, l
116b0 62 6c 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  bl1);.      for(
116c0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
116d0 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
116e0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
116f0 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
11700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11710 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
11720 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e  pParse, pParse->
11730 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  aAgg[i].pExpr);.
11740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11750 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
11760 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20  gSet, 0, i);.   
11770 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11780 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
11790 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  l(v, lbl1);.    
117a0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
117b0 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
117c0 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
117d0 2a 70 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  *pE;.      int j
117e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
117f0 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
11800 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
11810 20 20 20 20 20 70 45 20 3d 20 70 50 61 72 73 65       pE = pParse
11820 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b  ->aAgg[i].pExpr;
11830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11840 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  E->op==TK_AGG_FU
11850 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
11860 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 20 29 7b  if( pE->pList ){
11870 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
11880 3b 20 6a 3c 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e  ; j<pE->pList->n
11890 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
118a0 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
118b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 2d  Code(pParse, pE-
118c0 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  >pList->a[j].pEx
118d0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
118e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
118f0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11900 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
11910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
11920 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
11930 67 67 46 75 6e 63 2c 20 30 2c 20 70 45 2d 3e 70  ggFunc, 0, pE->p
11940 4c 69 73 74 20 3f 20 70 45 2d 3e 70 4c 69 73 74  List ? pE->pList
11950 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
11960 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
11970 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
11980 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
11990 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 41  sert( pParse->aA
119a0 67 67 5b 69 5d 2e 70 46 75 6e 63 2d 3e 78 53 74  gg[i].pFunc->xSt
119b0 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ep!=0 );.      s
119c0 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
119d0 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  3(v, -1, (char*)
119e0 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
119f0 70 46 75 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45  pFunc, P3_POINTE
11a00 52 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R);.    }.  }.. 
11a10 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
11a20 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
11a30 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65    */.  sqliteWhe
11a40 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
11a50 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
11a60 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
11a70 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
11a80 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
11a90 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
11aa0 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
11ab0 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
11ac0 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
11ad0 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
11ae0 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
11af0 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
11b00 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
11b10 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
11b20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
11b30 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11b40 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65 6e  P_AggNext, 0, en
11b50 64 61 67 67 29 3b 0a 20 20 20 20 70 50 61 72 73  dagg);.    pPars
11b60 65 2d 3e 75 73 65 41 67 67 20 3d 20 31 3b 0a 20  e->useAgg = 1;. 
11b70 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
11b80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
11b90 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
11ba0 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
11bb0 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  agg, 1);.    }. 
11bc0 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
11bd0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11be0 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
11bf0 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
11c00 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
11c20 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20  Parm, startagg, 
11c30 65 6e 64 61 67 67 29 20 29 7b 0a 20 20 20 20 20  endagg) ){.     
11c40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11c60 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11c70 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74  P_Goto, 0, start
11c80 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
11c90 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11ca0 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20  (v, endagg);.   
11cb0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11cc0 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20  (v, OP_Noop, 0, 
11cd0 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
11ce0 75 73 65 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a  useAgg = 0;.  }.
11cf0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
11d00 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
11d10 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
11d20 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
11d30 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
11d40 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
11d50 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
11d60 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
11d70 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
11d80 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
11d90 6c 28 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  l(p, v, pEList->
11da0 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
11db0 61 72 6d 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  arm);.  }...  /*
11dc0 20 49 73 73 75 65 20 61 20 6e 75 6c 6c 20 63 61   Issue a null ca
11dd0 6c 6c 62 61 63 6b 20 69 66 20 74 68 61 74 20 69  llback if that i
11de0 73 20 77 68 61 74 20 74 68 65 20 75 73 65 72 20  s what the user 
11df0 77 61 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  wants..  */.  if
11e00 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
11e10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75  lags & SQLITE_Nu
11e20 6c 6c 43 61 6c 6c 62 61 63 6b 29 21 3d 30 20 26  llCallback)!=0 &
11e30 26 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  & eDest==SRT_Cal
11e40 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  lback ){.    sql
11e50 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11e60 4f 50 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 2c  OP_NullCallback,
11e70 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
11e80 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
11e90 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
11ea0 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
11eb0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
11ec0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
11ed0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
11ee0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
11ef0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
11f00 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
11f10 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
11f20 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
11f30 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
11f40 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
11f50 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
11f60 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
11f70 6e 64 3a 0a 20 20 2f 2a 20 70 50 61 72 73 65 2d  nd:.  /* pParse-
11f80 3e 6e 54 61 62 20 3d 20 62 61 73 65 3b 20 2a 2f  >nTab = base; */
11f90 0a 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61  .  sqliteAggrega
11fa0 74 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72  teInfoReset(pPar
11fb0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  se);.  return rc
11fc0 3b 0a 7d 0a                                      ;.}.