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

Artifact f1f3b2c2f4f30db30d03af2d0ec629ef32cb5a08:


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 34 34  select.c,v 1.144
0200: 20 32 30 30 33 2f 30 37 2f 31 39 20 30 30 3a 34   2003/07/19 00:4
0210: 34 3a 31 34 20 64 72 68 20 45 78 70 20 24 0a 2a  4:14 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 30 20 6d 65 61 6e 73 20 6e 6f 20 6f  e.  0 means no o
04b0: 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65  ffset */.){.  Se
04c0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  lect *pNew;.  pN
04d0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
04e0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
04f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0510: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0520: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0530: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
0540: 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Src);.    sqlite
0550: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
0560: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  e);.    sqliteEx
0570: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 47 72  prListDelete(pGr
0580: 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  oupBy);.    sqli
0590: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 48 61  teExprDelete(pHa
05a0: 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
05b0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
05c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 65 6c  pOrderBy);.  }el
05d0: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45  se{.    pNew->pE
05e0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
05f0: 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20     pNew->pSrc = 
0600: 70 53 72 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pSrc;.    pNew->
0610: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
0620: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
0630: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
0640: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
0650: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20  g = pHaving;.   
0660: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
0670: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
0680: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
0690: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20   = isDistinct;. 
06a0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b     pNew->op = TK
06b0: 5f 53 45 4c 45 43 54 3b 0a 20 20 20 20 70 4e 65  _SELECT;.    pNe
06c0: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 6e 4c 69 6d  w->nLimit = nLim
06d0: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  it;.    pNew->nO
06e0: 66 66 73 65 74 20 3d 20 6e 4f 66 66 73 65 74 3b  ffset = nOffset;
06f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
0700: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ew;.}../*.** Giv
0710: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0720: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0730: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0740: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0750: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0760: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0770: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0780: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0790: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
07a0: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
07b0: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
07c0: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
07d0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  ER.**     JT_OUT
07e0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
07f0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0800: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0810: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0820: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0830: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0840: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0850: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0860: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0870: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0880: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0890: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
08a0: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
08b0: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
08c0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
08d0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
08e0: 20 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28   sqliteJoinType(
08f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0900: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0910: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0920: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0930: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0940: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0950: 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72  *p;.  static str
0960: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
0970: 63 68 61 72 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a  char *zKeyword;.
0980: 20 20 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20      int nChar;. 
0990: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 7d     int code;.  }
09a0: 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a   keywords[] = {.
09b0: 20 20 20 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c      { "natural",
09c0: 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d   7, JT_NATURAL }
09d0: 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74 22 2c 20  ,.    { "left", 
09e0: 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54     4, JT_LEFT|JT
09f0: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0a00: 22 72 69 67 68 74 22 2c 20 20 20 35 2c 20 4a 54  "right",   5, JT
0a10: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
0a20: 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c  },.    { "full",
0a30: 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a      4, JT_LEFT|J
0a40: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
0a50: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75 74 65 72   },.    { "outer
0a60: 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52  ",   5, JT_OUTER
0a70: 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72   },.    { "inner
0a80: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0a90: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72 6f 73 73   },.    { "cross
0aa0: 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52  ",   5, JT_INNER
0ab0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0ac0: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0ad0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0ae0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
0af0: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
0b00: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
0b10: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
0b20: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
0b30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
0b40: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
0b50: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
0b60: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
0b70: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
0b80: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
0b90: 20 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72      && sqliteStr
0ba0: 4e 49 43 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77  NICmp(p->z, keyw
0bb0: 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64  ords[j].zKeyword
0bc0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
0bd0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
0be0: 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f  = keywords[j].co
0bf0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
0c00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
0c10: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65  .    if( j>=size
0c20: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
0c30: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
0c40: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
0c50: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
0c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0c70: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
0c80: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
0c90: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
0ca0: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
0cb0: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
0cc0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
0cd0: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
0ce0: 20 20 73 74 61 74 69 63 20 54 6f 6b 65 6e 20 64    static Token d
0cf0: 75 6d 6d 79 20 3d 20 7b 20 30 2c 20 30 20 7d 3b  ummy = { 0, 0 };
0d00: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 70 31 20  .    char *zSp1 
0d10: 3d 20 22 20 22 2c 20 2a 7a 53 70 32 20 3d 20 22  = " ", *zSp2 = "
0d20: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
0d30: 30 20 29 7b 20 70 42 20 3d 20 26 64 75 6d 6d 79  0 ){ pB = &dummy
0d40: 3b 20 7a 53 70 31 20 3d 20 30 3b 20 7d 0a 20 20  ; zSp1 = 0; }.  
0d50: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 70    if( pC==0 ){ p
0d60: 43 20 3d 20 26 64 75 6d 6d 79 3b 20 7a 53 70 32  C = &dummy; zSp2
0d70: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 73 71 6c 69   = 0; }.    sqli
0d80: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
0d90: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
0da0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
0db0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0dc0: 3a 20 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 70  : ", 0,.       p
0dd0: 41 2d 3e 7a 2c 20 70 41 2d 3e 6e 2c 20 7a 53 70  A->z, pA->n, zSp
0de0: 31 2c 20 31 2c 20 70 42 2d 3e 7a 2c 20 70 42 2d  1, 1, pB->z, pB-
0df0: 3e 6e 2c 20 7a 53 70 32 2c 20 31 2c 20 70 43 2d  >n, zSp2, 1, pC-
0e00: 3e 7a 2c 20 70 43 2d 3e 6e 2c 20 30 29 3b 0a 20  >z, pC->n, 0);. 
0e10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
0e20: 2b 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  +;.    jointype 
0e30: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
0e40: 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65  lse if( jointype
0e50: 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20   & JT_RIGHT ){. 
0e60: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
0e70: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
0e80: 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c   "RIGHT and FULL
0e90: 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65   OUTER JOINs are
0ea0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73   not currently s
0eb0: 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20  upported");.    
0ec0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
0ed0: 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  NER;.  }.  retur
0ee0: 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f  n jointype;.}../
0ef0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0f00: 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d  index of a colum
0f10: 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52  n in a table.  R
0f20: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
0f30: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74  column.** is not
0f40: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
0f50: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
0f60: 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64  ic int columnInd
0f70: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ex(Table *pTab, 
0f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0f90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
0fa0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
0fb0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
0fc0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
0fd0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
0fe0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
0ff0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1000: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1010: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
1020: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
1030: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
1040: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
1050: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
1060: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
1070: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
1080: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
1090: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
10a0: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
10b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
10c0: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
10d0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
10e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
10f0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1100: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1110: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1120: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1130: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1140: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20   Expr **ppExpr  
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1160: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
1170: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
1180: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f  ssion */.){.  To
1190: 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45 78 70  ken dummy;.  Exp
11a0: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
11b0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
11c0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
11d0: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
11e0: 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 7a 43 6f 6c    dummy.z = zCol
11f0: 3b 0a 20 20 64 75 6d 6d 79 2e 6e 20 3d 20 73 74  ;.  dummy.n = st
1200: 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20 64 75  rlen(zCol);.  du
1210: 6d 6d 79 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70  mmy.dyn = 0;.  p
1220: 45 31 61 20 3d 20 73 71 6c 69 74 65 45 78 70 72  E1a = sqliteExpr
1230: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1240: 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20  ummy);.  pE2a = 
1250: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44  sqliteExpr(TK_ID
1260: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
1270: 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54 61  .  dummy.z = pTa
1280: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75 6d  b1->zName;.  dum
1290: 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64 75  my.n = strlen(du
12a0: 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 31 62 20 3d  mmy.z);.  pE1b =
12b0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
12c0: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
12d0: 3b 0a 20 20 64 75 6d 6d 79 2e 7a 20 3d 20 70 54  ;.  dummy.z = pT
12e0: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 64 75  ab2->zName;.  du
12f0: 6d 6d 79 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 64  mmy.n = strlen(d
1300: 75 6d 6d 79 2e 7a 29 3b 0a 20 20 70 45 32 62 20  ummy.z);.  pE2b 
1310: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
1320: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1330: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1340: 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  teExpr(TK_DOT, p
1350: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1360: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 45 78   pE2c = sqliteEx
1370: 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  pr(TK_DOT, pE2b,
1380: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1390: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
13a0: 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20  EQ, pE1c, pE2c, 
13b0: 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  0);.  ExprSetPro
13c0: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
13d0: 6d 4a 6f 69 6e 29 3b 0a 20 20 69 66 28 20 2a 70  mJoin);.  if( *p
13e0: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70  pExpr ){.    *pp
13f0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70  Expr = sqliteExp
1400: 72 28 54 4b 5f 41 4e 44 2c 20 2a 70 70 45 78 70  r(TK_AND, *ppExp
1410: 72 2c 20 70 45 2c 20 30 29 3b 0a 20 20 7d 65 6c  r, pE, 0);.  }el
1420: 73 65 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20  se{.    *ppExpr 
1430: 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = pE;.  }.}../*.
1440: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1450: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1460: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1470: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1480: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
1490: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
14a0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
14b0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
14c0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
14d0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
14e0: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
14f0: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1500: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1510: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1520: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
1530: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
1540: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
1550: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
1560: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
1570: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
1580: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
1590: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
15a0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
15b0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
15c0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
15d0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
15e0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
15f0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1600: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1610: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
1620: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
1630: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69  (Expr *p){.  whi
1640: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
1650: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
1660: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1670: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
1680: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d  >pLeft);.    p =
1690: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16b0: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
16c0: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
16d0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
16e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
16f0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1700: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1710: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1720: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1730: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
1740: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
1750: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
1760: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
1770: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1780: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1790: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
17a0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
17c0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
17d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
17e0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
17f0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  st *pSrc;.  int 
1800: 69 2c 20 6a 3b 0a 20 20 70 53 72 63 20 3d 20 70  i, j;.  pSrc = p
1810: 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
1820: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
1830: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  1; i++){.    str
1840: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1850: 20 2a 70 54 65 72 6d 20 3d 20 26 70 53 72 63 2d   *pTerm = &pSrc-
1860: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
1870: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1880: 70 4f 74 68 65 72 20 3d 20 26 70 53 72 63 2d 3e  pOther = &pSrc->
1890: 61 5b 69 2b 31 5d 3b 0a 0a 20 20 20 20 69 66 28  a[i+1];..    if(
18a0: 20 70 54 65 72 6d 2d 3e 70 54 61 62 3d 3d 30 20   pTerm->pTab==0 
18b0: 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 54 61 62 3d  || pOther->pTab=
18c0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
18d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
18e0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
18f0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
1900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1910: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
1920: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
1930: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
1940: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
1950: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1960: 65 72 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  erm->jointype & 
1970: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
1980: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
1990: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
19a0: 2d 3e 70 4f 6e 20 7c 7c 20 70 54 65 72 6d 2d 3e  ->pOn || pTerm->
19b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
19c0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
19d0: 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55  (pParse, "a NATU
19e0: 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74  RAL join may not
19f0: 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
1a00: 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49     "an ON or USI
1a10: 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a  NG clause", 0);.
1a20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a40: 70 54 61 62 20 3d 20 70 54 65 72 6d 2d 3e 70 54  pTab = pTerm->pT
1a50: 61 62 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ab;.      for(j=
1a60: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1a70: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
1a80: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
1a90: 4f 74 68 65 72 2d 3e 70 54 61 62 2c 20 70 54 61  Other->pTab, pTa
1aa0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1ab0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1ac0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
1ad0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1ae0: 6d 65 2c 20 70 54 61 62 2c 20 70 4f 74 68 65 72  me, pTab, pOther
1af0: 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68 65  ->pTab, &p->pWhe
1b00: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
1b10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b20: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
1b30: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
1b40: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
1b50: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
1b60: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
1b70: 4f 6e 20 26 26 20 70 54 65 72 6d 2d 3e 70 55 73  On && pTerm->pUs
1b80: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
1b90: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
1ba0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
1bb0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1bc0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
1bd0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
1be0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
1bf0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1c00: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
1c10: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
1c20: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
1c30: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
1c40: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
1c50: 64 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  d AND operator..
1c60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c70: 54 65 72 6d 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  Term->pOn ){.   
1c80: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
1c90: 54 65 72 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Term->pOn);.    
1ca0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 3d    if( p->pWhere=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
1cc0: 3e 70 57 68 65 72 65 20 3d 20 70 54 65 72 6d 2d  >pWhere = pTerm-
1cd0: 3e 70 4f 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  >pOn;.      }els
1ce0: 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 57  e{.        p->pW
1cf0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
1d00: 72 28 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 57 68  r(TK_AND, p->pWh
1d10: 65 72 65 2c 20 70 54 65 72 6d 2d 3e 70 4f 6e 2c  ere, pTerm->pOn,
1d20: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1d30: 20 20 20 70 54 65 72 6d 2d 3e 70 4f 6e 20 3d 20     pTerm->pOn = 
1d40: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1d50: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
1d60: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
1d70: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
1d80: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
1d90: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
1da0: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
1db0: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
1dc0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1dd0: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
1de0: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
1df0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
1e00: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
1e10: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
1e20: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
1e30: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
1e40: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
1e50: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
1e60: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
1e70: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
1e80: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1e90: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
1ea0: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
1eb0: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
1ec0: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
1ed0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1ee0: 66 28 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e 67  f( pTerm->pUsing
1ef0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
1f00: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69   *pList;.      i
1f10: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1f20: 72 74 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  rt( i<pSrc->nSrc
1f30: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  -1 );.      pLis
1f40: 74 20 3d 20 70 54 65 72 6d 2d 3e 70 55 73 69 6e  t = pTerm->pUsin
1f50: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
1f60: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
1f70: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1f80: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ( columnIndex(pT
1f90: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74  erm->pTab, pList
1fa0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20  ->a[j].zName)<0 
1fb0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ||.            c
1fc0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4f 74 68 65  olumnIndex(pOthe
1fd0: 72 2d 3e 70 54 61 62 2c 20 70 4c 69 73 74 2d 3e  r->pTab, pList->
1fe0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 29 3c 30 20 29 7b  a[j].zName)<0 ){
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2000: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
2010: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
2020: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
2030: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
2040: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
2050: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
2060: 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  s", pList->a[j].
2070: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2080: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
20a0: 64 57 68 65 72 65 54 65 72 6d 28 70 4c 69 73 74  dWhereTerm(pList
20b0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[j].zName, pT
20c0: 65 72 6d 2d 3e 70 54 61 62 2c 20 70 4f 74 68 65  erm->pTab, pOthe
20d0: 72 2d 3e 70 54 61 62 2c 20 26 70 2d 3e 70 57 68  r->pTab, &p->pWh
20e0: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2110: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
2120: 65 6e 74 73 20 61 20 6d 69 6e 69 6d 61 6c 20 4f  ents a minimal O
2130: 72 61 63 6c 65 38 20 6a 6f 69 6e 20 73 79 6e 74  racle8 join synt
2140: 61 78 20 69 6d 6d 75 6c 61 74 69 6f 6e 2e 0a 2a  ax immulation..*
2150: 2a 20 54 68 65 20 70 72 65 63 69 73 65 20 6f 72  * The precise or
2160: 61 63 6c 65 38 20 73 79 6e 74 61 78 20 69 73 20  acle8 syntax is 
2170: 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  not implemented 
2180: 2d 20 69 74 20 69 73 20 65 61 73 79 20 65 6e 6f  - it is easy eno
2190: 75 67 68 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  ugh.** to get th
21a0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 66 75  is routine confu
21b0: 73 65 64 2e 20 20 42 75 74 20 74 68 69 73 20 72  sed.  But this r
21c0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6d 61 6b 65  outine does make
21d0: 20 69 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   it possible.** 
21e0: 74 6f 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  to write a singl
21f0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2200: 74 68 61 74 20 64 6f 65 73 20 61 20 6c 65 66 74  that does a left
2210: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 6e 20 62   outer join in b
2220: 6f 74 68 0a 2a 2a 20 6f 72 61 63 6c 65 38 20 61  oth.** oracle8 a
2230: 6e 64 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a  nd in SQLite..**
2240: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2250: 20 6c 6f 6f 6b 73 20 66 6f 72 20 54 4b 5f 43 4f   looks for TK_CO
2260: 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  LUMN expression 
2270: 6e 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 6d  nodes that are m
2280: 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  arked.** with th
2290: 65 20 45 50 5f 4f 72 61 63 6c 65 38 4a 6f 69 6e  e EP_Oracle8Join
22a0: 20 70 72 6f 70 65 72 74 79 2e 20 20 53 75 63 68   property.  Such
22b0: 20 6e 6f 64 65 73 20 61 72 65 20 67 65 6e 65 72   nodes are gener
22c0: 61 74 65 64 20 62 79 20 61 0a 2a 2a 20 63 6f 6c  ated by a.** col
22d0: 75 6d 6e 20 6e 61 6d 65 20 28 65 69 74 68 65 72  umn name (either
22e0: 20 22 63 6f 6c 75 6d 6e 22 20 6f 72 20 22 74 61   "column" or "ta
22f0: 62 6c 65 2e 63 6f 6c 75 6d 6e 22 29 20 74 68 61  ble.column") tha
2300: 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t is followed by
2310: 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 61 6c 20  .** the special 
2320: 22 28 2b 29 22 20 6f 70 65 72 61 74 6f 72 2e 20  "(+)" operator. 
2330: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 66   If the table of
2340: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6d 61 72 6b   the column mark
2350: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 28  ed with.** the (
2360: 2b 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74  +) operator is t
2370: 68 65 20 73 65 63 6f 6e 64 20 61 72 65 20 73 75  he second are su
2380: 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65 20 69  bsequent table i
2390: 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 0a 2a  n a join, then.*
23a0: 2a 20 74 68 61 74 20 74 61 62 6c 65 20 62 65 63  * that table bec
23b0: 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 20 74 61  omes the left ta
23c0: 62 6c 65 20 69 6e 20 61 20 4c 45 46 54 20 4f 55  ble in a LEFT OU
23d0: 54 45 52 20 4a 4f 49 4e 2e 20 20 54 68 65 20 65  TER JOIN.  The e
23e0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61  xpression.** tha
23f0: 74 20 75 73 65 73 20 74 68 61 74 20 74 61 62 6c  t uses that tabl
2400: 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f  e becomes part o
2410: 66 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  f the ON clause 
2420: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 2e 0a 2a 2a  for the join..**
2430: 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
2440: 61 6e 74 20 74 6f 20 65 6e 70 68 61 73 69 7a 65  ant to enphasize
2450: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f   that this is no
2460: 74 20 65 78 61 63 74 6c 79 20 68 6f 77 20 6f 72  t exactly how or
2470: 61 63 6c 65 38 0a 2a 2a 20 77 6f 72 6b 73 2e 20  acle8.** works. 
2480: 20 42 75 74 20 69 74 20 69 73 20 63 6c 6f 73 65   But it is close
2490: 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
24a0: 6f 6e 65 20 63 61 6e 20 63 6f 6e 73 74 72 75 63  one can construc
24b0: 74 20 71 75 65 72 69 65 73 20 74 68 61 74 0a 2a  t queries that.*
24c0: 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 63 6f 72 72  * will work corr
24d0: 65 63 74 6c 79 20 66 6f 72 20 62 6f 74 68 20 53  ectly for both S
24e0: 51 4c 69 74 65 20 61 6e 64 20 4f 72 61 63 6c 65  QLite and Oracle
24f0: 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  8..*/.static int
2500: 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a 6f   sqliteOracle8Jo
2510: 69 6e 46 69 78 75 70 28 0a 20 20 53 72 63 4c 69  inFixup(.  SrcLi
2520: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 2f 2a 20  st *pSrc,    /* 
2530: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 62  List of tables b
2540: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20  eing joined */. 
2550: 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 20 20   Expr *pWhere   
2560: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2570: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
2580: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
2590: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
25a0: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
25b0: 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
25c0: 20 45 50 5f 4f 72 61 63 6c 65 38 4a 6f 69 6e 29   EP_Oracle8Join)
25d0: 20 26 26 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d   && pWhere->op==
25e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
25f0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 66 6f   int idx;.    fo
2600: 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 53 72  r(idx=0; idx<pSr
2610: 63 2d 3e 6e 53 72 63 3b 20 69 64 78 2b 2b 29 7b  c->nSrc; idx++){
2620: 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d  .      if( pSrc-
2630: 3e 61 5b 69 64 78 5d 2e 69 43 75 72 73 6f 72 3d  >a[idx].iCursor=
2640: 3d 70 57 68 65 72 65 2d 3e 69 54 61 62 6c 65 20  =pWhere->iTable 
2650: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2660: 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d     assert( idx>=
2670: 30 20 26 26 20 69 64 78 3c 70 53 72 63 2d 3e 6e  0 && idx<pSrc->n
2680: 53 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69  Src );.    if( i
2690: 64 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 53  dx>0 ){.      pS
26a0: 72 63 2d 3e 61 5b 69 64 78 2d 31 5d 2e 6a 6f 69  rc->a[idx-1].joi
26b0: 6e 74 79 70 65 20 26 3d 20 7e 4a 54 5f 49 4e 4e  ntype &= ~JT_INN
26c0: 45 52 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  ER;.      pSrc->
26d0: 61 5b 69 64 78 2d 31 5d 2e 6a 6f 69 6e 74 79 70  a[idx-1].jointyp
26e0: 65 20 7c 3d 20 4a 54 5f 4f 55 54 45 52 7c 4a 54  e |= JT_OUTER|JT
26f0: 5f 4c 45 46 54 3b 0a 20 20 20 20 20 20 72 65 74  _LEFT;.      ret
2700: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
2710: 0a 20 20 69 66 28 20 70 57 68 65 72 65 2d 3e 70  .  if( pWhere->p
2720: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 72 63 20  Right ){.    rc 
2730: 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a  = sqliteOracle8J
2740: 6f 69 6e 46 69 78 75 70 28 70 53 72 63 2c 20 70  oinFixup(pSrc, p
2750: 57 68 65 72 65 2d 3e 70 52 69 67 68 74 29 3b 0a  Where->pRight);.
2760: 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65    }.  if( pWhere
2770: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 72  ->pLeft ){.    r
2780: 63 20 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c  c |= sqliteOracl
2790: 65 38 4a 6f 69 6e 46 69 78 75 70 28 70 53 72 63  e8JoinFixup(pSrc
27a0: 2c 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29  , pWhere->pLeft)
27b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 68 65  ;.  }.  if( pWhe
27c0: 72 65 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  re->pList ){.   
27d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
27e0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57  List *pList = pW
27f0: 68 65 72 65 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  here->pList;.   
2800: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
2810: 74 2d 3e 6e 45 78 70 72 20 26 26 20 72 63 3d 3d  t->nExpr && rc==
2820: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  0; i++){.      r
2830: 63 20 7c 3d 20 73 71 6c 69 74 65 4f 72 61 63 6c  c |= sqliteOracl
2840: 65 38 4a 6f 69 6e 46 69 78 75 70 28 70 53 72 63  e8JoinFixup(pSrc
2850: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
2860: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2870: 20 20 69 66 28 20 72 63 3d 3d 31 20 26 26 20 28    if( rc==1 && (
2880: 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
2890: 4e 44 20 7c 7c 20 70 57 68 65 72 65 2d 3e 6f 70  ND || pWhere->op
28a0: 3d 3d 54 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20  ==TK_EQ) ){.    
28b0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65  setJoinExpr(pWhe
28c0: 72 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b  re);.    rc = 0;
28d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
28f0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
2900: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
2910: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
2920: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
2930: 69 64 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44  id sqliteSelectD
2940: 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70 29  elete(Select *p)
2950: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
2960: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45  eturn;.  sqliteE
2970: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
2980: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
2990: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
29a0: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69  p->pSrc);.  sqli
29b0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  teExprDelete(p->
29c0: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
29d0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
29e0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
29f0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
2a00: 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
2a10: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
2a20: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
2a30: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
2a40: 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f  tDelete(p->pPrio
2a50: 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  r);.  sqliteFree
2a60: 28 70 2d 3e 7a 53 65 6c 65 63 74 29 3b 0a 20 20  (p->zSelect);.  
2a70: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
2a80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2a90: 68 65 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  he aggregate inf
2aa0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2ab0: 65 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  e parse structur
2ac0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2ad0: 64 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74  d sqliteAggregat
2ae0: 65 49 6e 66 6f 52 65 73 65 74 28 50 61 72 73 65  eInfoReset(Parse
2af0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
2b00: 69 74 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e  iteFree(pParse->
2b10: 61 41 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d  aAgg);.  pParse-
2b20: 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61  >aAgg = 0;.  pPa
2b30: 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a 20  rse->nAgg = 0;. 
2b40: 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
2b50: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
2b60: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
2b70: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
2b80: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
2b90: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
2ba0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
2bb0: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
2bc0: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
2bd0: 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50  Sorter(Parse *pP
2be0: 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45  arse, Vdbe *v, E
2bf0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2c00: 79 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 6f 72  y){.  char *zSor
2c10: 74 4f 72 64 65 72 3b 0a 20 20 69 6e 74 20 69 3b  tOrder;.  int i;
2c20: 0a 20 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20  .  zSortOrder = 
2c30: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f  sqliteMalloc( pO
2c40: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
2c50: 31 20 29 3b 0a 20 20 69 66 28 20 7a 53 6f 72 74  1 );.  if( zSort
2c60: 4f 72 64 65 72 3d 3d 30 20 29 20 72 65 74 75 72  Order==0 ) retur
2c70: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
2c80: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
2c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
2ca0: 72 64 65 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  rder = pOrderBy-
2cb0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2cc0: 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  .    int type;. 
2cd0: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 66     int c;.    if
2ce0: 28 20 28 6f 72 64 65 72 20 26 20 53 51 4c 49 54  ( (order & SQLIT
2cf0: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d  E_SO_TYPEMASK)==
2d00: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29  SQLITE_SO_TEXT )
2d10: 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53  {.      type = S
2d20: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
2d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 72     }else if( (or
2d40: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
2d50: 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54  TYPEMASK)==SQLIT
2d60: 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20  E_SO_NUM ){.    
2d70: 20 20 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f    type = SQLITE_
2d80: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 7d 65 6c 73  SO_NUM;.    }els
2d90: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62  e if( pParse->db
2da0: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
2db0: 20 29 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d   ){.      type =
2dc0: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
2dd0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
2de0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Expr);.    }else
2df0: 7b 0a 20 20 20 20 20 20 74 79 70 65 20 3d 20 53  {.      type = S
2e00: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
2e10: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 72 64    }.    if( (ord
2e20: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44  er & SQLITE_SO_D
2e30: 49 52 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  IRMASK)==SQLITE_
2e40: 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20  SO_ASC ){.      
2e50: 63 20 3d 20 74 79 70 65 3d 3d 53 51 4c 49 54 45  c = type==SQLITE
2e60: 5f 53 4f 5f 54 45 58 54 20 3f 20 27 41 27 20 3a  _SO_TEXT ? 'A' :
2e70: 20 27 2b 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   '+';.    }else{
2e80: 0a 20 20 20 20 20 20 63 20 3d 20 74 79 70 65 3d  .      c = type=
2e90: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
2ea0: 3f 20 27 44 27 20 3a 20 27 2d 27 3b 0a 20 20 20  ? 'D' : '-';.   
2eb0: 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f 72 64 65   }.    zSortOrde
2ec0: 72 5b 69 5d 20 3d 20 63 3b 0a 20 20 20 20 73 71  r[i] = c;.    sq
2ed0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
2ee0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
2ef0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
2f00: 20 20 7a 53 6f 72 74 4f 72 64 65 72 5b 70 4f 72    zSortOrder[pOr
2f10: 64 65 72 42 79 2d 3e 6e 45 78 70 72 5d 20 3d 20  derBy->nExpr] = 
2f20: 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  0;.  sqliteVdbeA
2f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4d  ddOp(v, OP_SortM
2f40: 61 6b 65 4b 65 79 2c 20 70 4f 72 64 65 72 42 79  akeKey, pOrderBy
2f50: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73  ->nExpr, 0);.  s
2f60: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2f70: 33 28 76 2c 20 2d 31 2c 20 7a 53 6f 72 74 4f 72  3(v, -1, zSortOr
2f80: 64 65 72 2c 20 73 74 72 6c 65 6e 28 7a 53 6f 72  der, strlen(zSor
2f90: 74 4f 72 64 65 72 29 29 3b 0a 20 20 73 71 6c 69  tOrder));.  sqli
2fa0: 74 65 46 72 65 65 28 7a 53 6f 72 74 4f 72 64 65  teFree(zSortOrde
2fb0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  r);.  sqliteVdbe
2fc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
2fd0: 50 75 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  Put, 0, 0);.}../
2fe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ff0: 65 20 61 64 64 73 20 61 20 50 33 20 61 72 67 75  e adds a P3 argu
3000: 6d 65 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74  ment to the last
3010: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 74 68 61   VDBE opcode tha
3020: 74 20 77 61 73 0a 2a 2a 20 69 6e 73 65 72 74 65  t was.** inserte
3030: 64 2e 20 54 68 65 20 50 33 20 61 72 67 75 6d 65  d. The P3 argume
3040: 6e 74 20 61 64 64 65 64 20 69 73 20 61 20 73 74  nt added is a st
3050: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
3060: 72 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 4d 61 6b  r the .** OP_Mak
3070: 65 4b 65 79 20 6f 72 20 4f 50 5f 4d 61 6b 65 49  eKey or OP_MakeI
3080: 64 78 4b 65 79 20 6f 70 63 6f 64 65 73 2e 20 20  dxKey opcodes.  
3090: 54 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  The string consi
30a0: 73 74 73 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  sts of.** charac
30b0: 74 65 72 73 20 27 74 27 20 6f 72 20 27 6e 27 20  ters 't' or 'n' 
30c0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
30d0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
30e0: 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 65 6c 64  various.** field
30f0: 73 20 6f 66 20 74 68 65 20 6b 65 79 20 74 6f 20  s of the key to 
3100: 62 65 20 67 65 6e 65 72 61 74 65 64 20 73 68 6f  be generated sho
3110: 75 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61  uld be treated a
3120: 73 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 6f 72 20  s numeric.** or 
3130: 61 73 20 74 65 78 74 2e 20 20 53 65 65 20 74 68  as text.  See th
3140: 65 20 4f 50 5f 4d 61 6b 65 4b 65 79 20 61 6e 64  e OP_MakeKey and
3150: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f   OP_MakeIdxKey o
3160: 70 63 6f 64 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e  pcode.** documen
3170: 74 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  tation for addit
3180: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
3190: 6e 20 61 62 6f 75 74 20 74 68 65 20 50 33 20 73  n about the P3 s
31a0: 74 72 69 6e 67 2e 0a 2a 2a 20 53 65 65 20 61 6c  tring..** See al
31b0: 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64  so the sqliteAdd
31c0: 49 64 78 4b 65 79 54 79 70 65 28 29 20 72 6f 75  IdxKeyType() rou
31d0: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
31e0: 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 56  liteAddKeyType(V
31f0: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
3200: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
3210: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
3220: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 63 68 61 72  t->nExpr;.  char
3230: 20 2a 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65   *zType = sqlite
3240: 4d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 75 6d 6e 2b  Malloc( nColumn+
3250: 31 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  1 );.  int i;.  
3260: 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 72  if( zType==0 ) r
3270: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
3280: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
3290: 29 7b 0a 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  ){.    zType[i] 
32a0: 3d 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  = sqliteExprType
32b0: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
32c0: 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  xpr)==SQLITE_SO_
32d0: 4e 55 4d 20 3f 20 27 6e 27 20 3a 20 27 74 27 3b  NUM ? 'n' : 't';
32e0: 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b 69 5d 20  .  }.  zType[i] 
32f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  = 0;.  sqliteVdb
3300: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
3310: 20 7a 54 79 70 65 2c 20 6e 43 6f 6c 75 6d 6e 29   zType, nColumn)
3320: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
3330: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
3340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
3350: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
3360: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
3370: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
3380: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
3390: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
33a0: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
33b0: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
33c0: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
33d0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
33e0: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
33f0: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
3400: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
3410: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
3420: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
3430: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
3440: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
3450: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
3460: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
3470: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3490: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
34a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
34b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
34c0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
34d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34f0: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
3500: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
3510: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3520: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
3530: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
3540: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
3550: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
3560: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
3570: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
3580: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
3590: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
35a0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
35b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
35c0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
35d0: 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  rce table */.  E
35e0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
35f0: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
3600: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
3610: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
3620: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  ey */.  int dist
3630: 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  inct,           
3640: 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20  /* If >=0, make 
3650: 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  sure results are
3660: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3670: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
3680: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
3690: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
36a0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
36b0: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
36c0: 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d       /* An argum
36d0: 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f  ent to the dispo
36e0: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
36f0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
3700: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
3710: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
3720: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
3730: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
3740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
3750: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
3760: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
3770: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
3780: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3790: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
37a0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
37b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
37c0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
37d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
37e0: 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  was a LIMIT clau
37f0: 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  se on the SELECT
3800: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
3810: 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20   do the check.  
3820: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ** to see if thi
3830: 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20  s row should be 
3840: 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
3850: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
3860: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 66  {.    if( p->nOf
3870: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  fset>0 ){.      
3880: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
3890: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
38a0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
38b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
38c0: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66  _MemIncr, p->nOf
38d0: 66 73 65 74 2c 20 61 64 64 72 2b 32 29 3b 0a 20  fset, addr+2);. 
38e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
38f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3900: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
3910: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
3920: 3e 6e 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20  >nLimit>=0 ){.  
3930: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3940: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
3950: 72 2c 20 70 2d 3e 6e 4c 69 6d 69 74 2c 20 69 42  r, p->nLimit, iB
3960: 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  reak);.    }.  }
3970: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
3980: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
3990: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
39a0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
39b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
39c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
39d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
39e0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
39f0: 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  Tab, i);.    }. 
3a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
3a10: 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  umn = pEList->nE
3a20: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
3a30: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
3a40: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
3a50: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
3a60: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
3a70: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  i].pExpr);.    }
3a80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
3a90: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3aa0: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
3ab0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
3ac0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
3ad0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
3ae0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
3af0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
3b00: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
3b10: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
3b20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 69 73  ..  */.  if( dis
3b30: 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69  tinct>=0 && pELi
3b40: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
3b50: 78 70 72 3e 30 20 29 7b 0a 23 69 66 20 4e 55 4c  xpr>0 ){.#if NUL
3b60: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
3b70: 54 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  T.    sqliteVdbe
3b80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
3b90: 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78  ll, -pEList->nEx
3ba0: 70 72 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75  pr, sqliteVdbeCu
3bb0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b  rrentAddr(v)+7);
3bc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
3bd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3be0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 45 4c 69 73  P_MakeKey, pELis
3bf0: 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  t->nExpr, 1);.  
3c00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
3c10: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
3c20: 20 29 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54   ) sqliteAddKeyT
3c30: 79 70 65 28 76 2c 20 70 45 4c 69 73 74 29 3b 0a  ype(v, pEList);.
3c40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3c50: 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e  dOp(v, OP_Distin
3c60: 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 73 71  ct, distinct, sq
3c70: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
3c80: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73  ddr(v)+3);.    s
3c90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3ca0: 2c 20 4f 50 5f 50 6f 70 2c 20 70 45 4c 69 73 74  , OP_Pop, pEList
3cb0: 2d 3e 6e 45 78 70 72 2b 31 2c 20 30 29 3b 0a 20  ->nExpr+1, 0);. 
3cc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3cd0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
3ce0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
3cf0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3d00: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
3d10: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
3d20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3d30: 5f 50 75 74 53 74 72 4b 65 79 2c 20 64 69 73 74  _PutStrKey, dist
3d40: 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  inct, 0);.  }.. 
3d50: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
3d60: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
3d70: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
3d80: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
3d90: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
3da0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
3db0: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
3dc0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3dd0: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
3de0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3df0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
3e00: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c  rd, nColumn, NUL
3e10: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
3e20: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
3e30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3e40: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
3e50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3e60: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
3e70: 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29 3b  rKey, iParm, 0);
3e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3e90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72    }..    /* Stor
3ea0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
3eb0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
3ec0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
3ed0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
3ee0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
3ef0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
3f00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3f10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3f20: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3f30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3f40: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3f50: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
3f60: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
3f70: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
3f80: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3f90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3fa0: 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d  _NewRecno, iParm
3fb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3fc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3fd0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
3fe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3ff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4000: 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c  utIntKey, iParm,
4010: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4030: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
4040: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
4050: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
4060: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
4070: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
4080: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
4090: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
40a0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
40b0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
40c0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
40d0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
40e0: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
40f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
4100: 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
4110: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4120: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4130: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c  d, nColumn, NULL
4140: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
4150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4160: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4170: 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20  otFound, iParm, 
4180: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
4190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
41a0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61  , OP_Delete, iPa
41b0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
41c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
41d0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
41e0: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
41f0: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
4200: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
4210: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
4220: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
4230: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
4240: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
4250: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
4260: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
4270: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
4280: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
4290: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
42a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62  : {.      int lb
42b0: 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  l = sqliteVdbeMa
42c0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
42d0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
42e0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
42f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4300: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20   OP_IsNull, -1, 
4310: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lbl);.      if( 
4320: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4330: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4340: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4350: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4360: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4370: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4380: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
4390: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
43a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
43b0: 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61 72  _PutStrKey, iPar
43c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
43d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
43e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
43f0: 62 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  bl);.      break
4400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4410: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
4420: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
4430: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
4440: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
4450: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
4460: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
4470: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
4480: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
4490: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
44a0: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
44b0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
44c0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
44d0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
44e0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
44f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4500: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4510: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
4520: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
4530: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4540: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4550: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
4560: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
4570: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4580: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4590: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  Break);.      }.
45a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20   }..    /* Send 
45c0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
45d0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
45e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
45f0: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4600: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 6f  .    case SRT_So
4610: 72 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 69 66  rter: {.      if
4620: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4630: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4640: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4650: 4d 61 6b 65 52 65 63 2c 20 6e 43 6f 6c 75 6d 6e  MakeRec, nColumn
4660: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
4670: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4680: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
4690: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
46a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
46b0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
46c0: 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ack );.        s
46d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
46e0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
46f0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
4700: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4710: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
4720: 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69  nvoke a subrouti
4730: 6e 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ne to handle the
4740: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73   results.  The s
4750: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
4760: 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f  .    ** is respo
4770: 6e 73 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69  nsible for poppi
4780: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
4790: 66 66 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  ff of the stack.
47a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
47b0: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
47c0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
47d0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
47e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
47f0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4800: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
4810: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4820: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4830: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
4840: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4850: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4860: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
4870: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
4880: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4890: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
48a0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
48b0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
48c0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
48d0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
48e0: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
48f0: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
4900: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
4910: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
4920: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
4930: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
4940: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
4950: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
4960: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
4970: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
4980: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
4990: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
49a0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
49b0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
49c0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
49d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
49e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
49f0: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
4a00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4a10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4a20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
4a30: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
4a40: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
4a50: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
4a60: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
4a70: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
4a80: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
4a90: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
4aa0: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
4ab0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
4ac0: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
4ad0: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
4ae0: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
4af0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
4b00: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
4b10: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
4b20: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
4b30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
4b40: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
4b50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4b60: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
4b70: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
4b80: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
4b90: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
4ba0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
4bb0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
4bc0: 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  mn,     /* Numbe
4bd0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
4be0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44  data */.  int eD
4bf0: 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  est,       /* Wr
4c00: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
4c10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
4c20: 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20   int iParm      
4c30: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61    /* Optional pa
4c40: 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74  rameter associat
4c50: 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f  ed with eDest */
4c60: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 20 3d 20  .){.  int end = 
4c70: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
4c80: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
4c90: 64 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  dr;.  if( eDest=
4ca0: 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20 72 65  =SRT_Sorter ) re
4cb0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 56 64  turn;.  sqliteVd
4cc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
4cd0: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 61 64 64  rt, 0, 0);.  add
4ce0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
4cf0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65  dOp(v, OP_SortNe
4d00: 78 74 2c 20 30 2c 20 65 6e 64 29 3b 0a 20 20 69  xt, 0, end);.  i
4d10: 66 28 20 70 2d 3e 6e 4f 66 66 73 65 74 3e 30 20  f( p->nOffset>0 
4d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
4d30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4d40: 49 6e 63 72 2c 20 70 2d 3e 6e 4f 66 66 73 65 74  Incr, p->nOffset
4d50: 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 73  , addr+4);.    s
4d60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4d70: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
4d80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4d90: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4da0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20   0, addr);.  }. 
4db0: 20 69 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3e 3d   if( p->nLimit>=
4dc0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
4dd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4de0: 65 6d 49 6e 63 72 2c 20 70 2d 3e 6e 4c 69 6d 69  emIncr, p->nLimi
4df0: 74 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  t, end);.  }.  s
4e00: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
4e10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4e20: 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 73  lback: {.      s
4e30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4e40: 2c 20 4f 50 5f 53 6f 72 74 43 61 6c 6c 62 61 63  , OP_SortCallbac
4e50: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
4e60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e70: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
4e80: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
4e90: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b  SRT_TempTable: {
4ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4eb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
4ec0: 52 65 63 6e 6f 2c 20 69 50 61 72 6d 2c 20 30 29  Recno, iParm, 0)
4ed0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4ee0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4ef0: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
4f00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4f10: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
4f20: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
4f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4f40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
4f50: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
4f60: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
4f70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4f80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
4f90: 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 56 64  ll, -1, sqliteVd
4fa0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
4fb0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4fc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4fd0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4ff0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
5000: 74 72 4b 65 79 2c 20 69 50 61 72 6d 2c 20 30 29  trKey, iParm, 0)
5010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5020: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
5030: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
5040: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5050: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5060: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5070: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
5080: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
5090: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
50a0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 29 3b  P_Goto, 0, end);
50b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
50c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
50d0: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
50e0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
50f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
5100: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
5110: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5120: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
5130: 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20  , -1-i, i);.    
5140: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5150: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5160: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
5170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5180: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
5190: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
51a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
51b0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
51c0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
51d0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
51e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
51f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5200: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
5210: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65  ;.  sqliteVdbeRe
5220: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
5230: 64 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65  d);.  sqliteVdbe
5240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
5250: 52 65 73 65 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  Reset, 0, 0);.}.
5260: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5270: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
5280: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
5290: 20 64 61 74 61 74 79 70 65 73 20 6f 66 0a 2a 2a   datatypes of.**
52a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
52b0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
52c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * This routine o
52d0: 6e 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  nly generates co
52e0: 64 65 20 69 66 20 74 68 65 20 22 50 52 41 47 4d  de if the "PRAGM
52f0: 41 20 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73  A show_datatypes
5300: 3d 6f 6e 22 0a 2a 2a 20 68 61 73 20 62 65 65 6e  =on".** has been
5310: 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
5320: 64 61 74 61 74 79 70 65 73 20 61 72 65 20 72 65  datatypes are re
5330: 70 6f 72 74 65 64 20 6f 75 74 20 69 6e 20 74 68  ported out in th
5340: 65 20 61 7a 43 6f 6c 0a 2a 2a 20 70 61 72 61 6d  e azCol.** param
5350: 65 74 65 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  eter to the call
5360: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 20 20  back function.  
5370: 54 68 65 20 66 69 72 73 74 20 4e 20 61 7a 43 6f  The first N azCo
5380: 6c 5b 5d 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  l[] entries.** a
5390: 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  re the names of 
53a0: 74 68 65 20 63 6f 6c 75 6d 6e 73 2c 20 61 6e 64  the columns, and
53b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 4e 20 65 6e   the second N en
53c0: 74 72 69 65 73 20 61 72 65 20 74 68 65 0a 2a 2a  tries are the.**
53d0: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 74   datatypes for t
53e0: 68 65 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  he columns..**.*
53f0: 2a 20 54 68 65 20 22 64 61 74 61 74 79 70 65 22  * The "datatype"
5400: 20 66 6f 72 20 61 20 72 65 73 75 6c 74 20 74 68   for a result th
5410: 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f  at is a column o
5420: 66 20 61 20 74 79 70 65 20 69 73 20 74 68 65 0a  f a type is the.
5430: 2a 2a 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ** datatype defi
5440: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
5450: 20 66 72 6f 6d 20 74 68 65 20 43 52 45 41 54 45   from the CREATE
5460: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5470: 2e 0a 2a 2a 20 54 68 65 20 64 61 74 61 74 79 70  ..** The datatyp
5480: 65 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73  e for an express
5490: 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 54 45  ion is either TE
54a0: 58 54 20 6f 72 20 4e 55 4d 45 52 49 43 2e 20 20  XT or NUMERIC.  
54b0: 54 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 20  The.** datatype 
54c0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
54d0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f  d is INTEGER..*/
54e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
54f0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
5500: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5510: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
5520: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
5530: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5540: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
5550: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
5560: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
5570: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
5580: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
5590: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
55a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
55b0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
55c0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
55d0: 75 73 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  useCallback && (
55e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
55f0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 70 6f 72  s & SQLITE_Repor
5600: 74 54 79 70 65 73 29 3d 3d 30 20 29 7b 0a 20 20  tTypes)==0 ){.  
5610: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5620: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
5630: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5640: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
5650: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5660: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
5670: 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
5680: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5690: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
56a0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
56b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
56c0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
56d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
56e0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
56f0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
5700: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
5710: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
5720: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
5730: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
5740: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
5750: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
5760: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5770: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
5780: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
5790: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
57a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
57b0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
57c0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
57d0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
57e0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
57f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
5800: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d  NTEGER";.      }
5810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
5820: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
5830: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
5840: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5850: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5860: 65 45 78 70 72 54 79 70 65 28 70 29 3d 3d 53 51  eExprType(p)==SQ
5870: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
5880: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
5890: 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 7d 65  "TEXT";.      }e
58a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  lse{.        zTy
58b0: 70 65 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 0a  pe = "NUMERIC";.
58c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
58d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
58e0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
58f0: 6d 65 2c 20 69 20 2b 20 70 45 4c 69 73 74 2d 3e  me, i + pEList->
5900: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 73  nExpr, 0);.    s
5910: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5920: 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20  3(v, -1, zType, 
5930: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  P3_STATIC);.  }.
5940: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5950: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5960: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
5970: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
5980: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
5990: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
59a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
59b0: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
59c0: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
59d0: 6f 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  olues in the cal
59e0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
59f0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
5a00: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
5a10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5a20: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5a30: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
5a40: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
5a50: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
5a60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
5a70: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
5a80: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
5a90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
5aa0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
5ab0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5ac0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28   int i, j;.  if(
5ad0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
5ae0: 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  sSet || v==0 || 
5af0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
5b00: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
5b10: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
5b20: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28  sSet = 1;.  for(
5b30: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
5b40: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5b50: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 63 68 61  Expr *p;.    cha
5b60: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
5b70: 20 20 69 6e 74 20 73 68 6f 77 46 75 6c 6c 4e 61    int showFullNa
5b80: 6d 65 73 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c  mes;.    p = pEL
5b90: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5ba0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
5bb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5bc0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
5bd0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
5be0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
5bf0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
5c00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5c10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
5c20: 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 29 3b 0a 20  mnName, i, 0);. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5c40: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
5c50: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
5c60: 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  me));.      cont
5c70: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
5c80: 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 3d 20  showFullNames = 
5c90: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
5ca0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
5cb0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
5cc0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
5cd0: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
5ce0: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
5cf0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
5d00: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
5d10: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
5d20: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
5d30: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
5d40: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
5d50: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
5d60: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
5d70: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
5d80: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
5d90: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
5da0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
5db0: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
5dc0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
5dd0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
5de0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
5df0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
5e00: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
5e10: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
5e20: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
5e30: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52        zCol = "_R
5e40: 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20  OWID_";.        
5e50: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
5e60: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
5e70: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
5e80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
5e90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a  zName;.        z
5ea0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
5eb0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
5ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5ed0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
5ee0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 26 26 20 21 73  >span.z[0] && !s
5ef0: 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  howFullNames ){.
5f00: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
5f10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
5f20: 4f 70 28 76 2c 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  Op(v,OP_ColumnNa
5f30: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
5f40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
5f50: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
5f60: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
5f70: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
5f80: 74 65 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  teVdbeCompressSp
5f90: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ace(v, addr);.  
5fa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
5fb0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 7c  abList->nSrc>1 |
5fc0: 7c 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65 73 20  | showFullNames 
5fd0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5fe0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
5ff0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
6000: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
6010: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6020: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
6030: 69 66 28 20 73 68 6f 77 46 75 6c 6c 4e 61 6d 65  if( showFullName
6040: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
6050: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
6060: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
6070: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  eSetString(&zNam
6080: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
6090: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
60a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
60b0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
60c0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
60d0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
60e0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65  eP3(v, -1, zName
60f0: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
6100: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6110: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
6120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6130: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6140: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
6150: 6d 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  me, i, 0);.     
6160: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6170: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 43 6f  ngeP3(v, -1, zCo
6180: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
6190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
61a0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
61b0: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
61c0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
61d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 4f 50 5f  eVdbeAddOp(v,OP_
61e0: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30  ColumnName, i, 0
61f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6200: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6210: 31 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  1, p->span.z, p-
6220: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
6230: 73 71 6c 69 74 65 56 64 62 65 43 6f 6d 70 72 65  sqliteVdbeCompre
6240: 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29  ssSpace(v, addr)
6250: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6260: 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30     char zName[30
6270: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
6280: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
6290: 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30  N || pTabList==0
62a0: 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   );.      sprint
62b0: 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  f(zName, "column
62c0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
62d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
62e0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d  (v, OP_ColumnNam
62f0: 65 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, i, 0);.      
6300: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6310: 50 33 28 76 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c  P3(v, -1, zName,
6320: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
6330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
6340: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
6350: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
6360: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
6370: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
6380: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6390: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
63a0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
63b0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
63c0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
63d0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
63e0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
63f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6400: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
6410: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
6420: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6430: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
6440: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
6450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
6460: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
6470: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
6480: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
6490: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
64a0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
64b0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
64c0: 69 6e 74 20 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e  int fillInColumn
64d0: 4c 69 73 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  List(Parse*, Sel
64e0: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
64f0: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
6500: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
6510: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
6520: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
6530: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
6540: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
6550: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
6560: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
6570: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
6580: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
6590: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
65a0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
65b0: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pTab;.  int i;. 
65c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
65d0: 74 3b 0a 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e  t;..  if( fillIn
65e0: 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73  ColumnList(pPars
65f0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
6600: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6610: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
6620: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
6630: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
6640: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
6650: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
6660: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62  ab->zName = zTab
6670: 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72  Name ? sqliteStr
6680: 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20  Dup(zTabName) : 
6690: 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  0;.  pEList = pS
66a0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
66b0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45   pTab->nCol = pE
66c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  List->nExpr;.  a
66d0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
66e0: 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61  l>0 );.  pTab->a
66f0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Col = sqliteMall
6700: 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d  oc( sizeof(pTab-
6710: 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e  >aCol[0])*pTab->
6720: 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d  nCol );.  for(i=
6730: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
6740: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
6750: 2a 70 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  *p;.    if( pELi
6760: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
6770: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  {.      pTab->aC
6780: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  ol[i].zName = sq
6790: 6c 69 74 65 53 74 72 44 75 70 28 70 45 4c 69 73  liteStrDup(pELis
67a0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
67b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
67c0: 3d 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  =pEList->a[i].pE
67d0: 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  xpr)->span.z && 
67e0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
67f0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
6800: 53 74 72 69 6e 67 28 26 70 54 61 62 2d 3e 61 43  String(&pTab->aC
6810: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 2d 3e  ol[i].zName, p->
6820: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
6830: 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  n, 0);.    }else
6840: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44   if( p->op==TK_D
6850: 4f 54 20 26 26 20 70 2d 3e 70 52 69 67 68 74 20  OT && p->pRight 
6860: 26 26 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  && p->pRight->to
6870: 6b 65 6e 2e 7a 20 26 26 0a 20 20 20 20 20 20 20  ken.z &&.       
6880: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74      p->pRight->t
6890: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
68a0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
68b0: 69 6e 67 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ing(&pTab->aCol[
68c0: 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  i].zName, .     
68d0: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 2d        p->pRight-
68e0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 70 52 69  >token.z, p->pRi
68f0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29  ght->token.n, 0)
6900: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6910: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
6920: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  ;.      sprintf(
6930: 7a 42 75 66 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  zBuf, "column%d"
6940: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 70 54  , i+1);.      pT
6950: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
6960: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6970: 28 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20  (zBuf);.    }.  
6980: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
6990: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
69a0: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  Tab;.}../*.** Fo
69b0: 72 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45  r the given SELE
69c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 64 6f  CT statement, do
69d0: 20 74 68 72 65 65 20 74 68 69 6e 67 73 2e 0a 2a   three things..*
69e0: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 46 69 6c  *.**    (1)  Fil
69f0: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
6a00: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
6a10: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
6a20: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
6a30: 20 20 20 64 65 66 69 6e 65 73 20 74 68 65 20 73     defines the s
6a40: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
6a50: 74 20 73 68 6f 75 6c 64 20 62 65 20 73 63 61 6e  t should be scan
6a60: 6e 65 64 2e 20 20 46 6f 72 20 76 69 65 77 73 2c  ned.  For views,
6a70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
6a80: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
6a90: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
6aa0: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
6ab0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
6ac0: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
6ad0: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
6ae0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
6af0: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
6b00: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
6b10: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
6b20: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
6b30: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
6b40: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
6b50: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
6b60: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
6b70: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
6b80: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
6b90: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
6ba0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
6bb0: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  w..**.**    (2) 
6bc0: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
6bd0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
6be0: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
6bf0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
6c00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
6c10: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
6c20: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
6c30: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
6c40: 20 20 20 20 28 33 29 20 20 53 63 61 6e 20 74 68      (3)  Scan th
6c50: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
6c60: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
6c70: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
6c80: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
6c90: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
6ca0: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
6cb0: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
6cc0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
6cd0: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
6ce0: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
6cf0: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
6d00: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
6d10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
6d20: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
6d30: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
6d40: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
6d50: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
6d60: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
6d70: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
6d80: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
6d90: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
6da0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
6db0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6dc0: 66 69 6c 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74  fillInColumnList
6dd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6de0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
6df0: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
6e00: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6e10: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
6e20: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
6e30: 2a 70 54 61 62 3b 0a 0a 20 20 69 66 28 20 70 3d  *pTab;..  if( p=
6e40: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
6e50: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
6e60: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
6e70: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
6e80: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4c  >pEList;..  /* L
6e90: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
6ea0: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
6eb0: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  list..  */.  for
6ec0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
6ed0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
6ee0: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
6ef0: 61 5b 69 5d 2e 70 54 61 62 20 29 7b 0a 20 20 20  a[i].pTab ){.   
6f00: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
6f10: 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
6f20: 65 21 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e!  No need to c
6f30: 6f 6e 74 69 6e 75 65 20 2a 2f 0a 20 20 20 20 20  ontinue */.     
6f40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6f50: 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
6f60: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
6f80: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
6f90: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
6fa0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
6fb0: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
6fc0: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 21  t->a[i].pSelect!
6fd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
6fe0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
6ff0: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
7000: 20 20 20 20 63 68 61 72 20 7a 46 61 6b 65 4e 61      char zFakeNa
7010: 6d 65 5b 36 30 5d 3b 0a 20 20 20 20 20 20 20 20  me[60];.        
7020: 73 70 72 69 6e 74 66 28 7a 46 61 6b 65 4e 61 6d  sprintf(zFakeNam
7030: 65 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  e, "sqlite_subqu
7040: 65 72 79 5f 25 70 5f 22 2c 0a 20 20 20 20 20 20  ery_%p_",.      
7050: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 54 61 62       (void*)pTab
7060: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
7070: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ct);.        sql
7080: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 54  iteSetString(&pT
7090: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
70a0: 69 61 73 2c 20 7a 46 61 6b 65 4e 61 6d 65 2c 20  ias, zFakeName, 
70b0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
70c0: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
70d0: 2e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  .pTab = pTab = .
70e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65          sqliteRe
70f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
7100: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
7110: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 0a 20  ->a[i].zAlias,. 
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
7150: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a  >a[i].pSelect);.
7160: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7170: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7180: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7190: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
71a0: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
71b0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
71c0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
71d0: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
71e0: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
71f0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
7200: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
7210: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
7220: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
7230: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
7240: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
7250: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
7260: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
7270: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
7280: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
7290: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
72a0: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 20  Transient = 1;. 
72b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
72c0: 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
72d0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
72e0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
72f0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 54  ause */.      pT
7300: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
7310: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
7320: 20 20 20 20 73 71 6c 69 74 65 4c 6f 63 61 74 65      sqliteLocate
7330: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 54 61  Table(pParse,pTa
7340: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  bList->a[i].zNam
7350: 65 2c 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  e,pTabList->a[i]
7360: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
7370: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
7380: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7390: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
73a0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
73b0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
73c0: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
73d0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
73e0: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
73f0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
7400: 20 69 66 28 20 73 71 6c 69 74 65 56 69 65 77 47   if( sqliteViewG
7410: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
7420: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
7430: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7440: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
7450: 20 20 20 20 20 2f 2a 20 49 66 20 70 54 61 62 4c       /* If pTabL
7460: 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
7470: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
7480: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
7490: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
74a0: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
74b0: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
74c0: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
74d0: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
74e0: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
74f0: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
7500: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
7510: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
7520: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7530: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
7540: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
7550: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
7560: 5b 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [i].pSelect==0 )
7570: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
7580: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
7590: 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  ct = sqliteSelec
75a0: 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65  tDup(pTab->pSele
75b0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
75c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
75d0: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
75e0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
75f0: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
7600: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
7610: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
7620: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
7630: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
7640: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
7650: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
7660: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
7670: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
7680: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
7690: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
76a0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
76b0: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
76c0: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
76d0: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
76e0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
76f0: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
7700: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
7710: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
7720: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
7730: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
7740: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
7750: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
7760: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
7770: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7780: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
7790: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
77a0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
77b0: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
77c0: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
77d0: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
77e0: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
77f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
7800: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
7810: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
7820: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
7830: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
7840: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
7850: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
7860: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
7870: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
7880: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
7890: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
78a0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
78b0: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
78c0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
78d0: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
78e0: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
78f0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
7900: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
7910: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
7920: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
7930: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
7940: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
7950: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
7960: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
7970: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
7980: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
7990: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
79a0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
79b0: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
79c0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
79d0: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
79e0: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
79f0: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
7a00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
7a10: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
7a20: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
7a30: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
7a40: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
7a50: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
7a60: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
7a70: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
7a80: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7a90: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
7aa0: 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
7ab0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
7ac0: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20  >op!=TK_ALL &&. 
7ad0: 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f            (pE->o
7ae0: 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
7af0: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45  >pRight==0 || pE
7b00: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
7b10: 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
7b20: 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
7b30: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
7b40: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
7b50: 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
7b60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7b70: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45 78 70  pNew = sqliteExp
7b80: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
7b90: 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29  , a[k].pExpr, 0)
7ba0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
7bb0: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
7bc0: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
7bd0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  ame;.        a[k
7be0: 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
7bf0: 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
7c00: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
7c10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
7c20: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7c30: 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
7c40: 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
7c50: 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
7c60: 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
7c70: 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
7c80: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
7c90: 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
7ca0: 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
7cb0: 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 4e         Token *pN
7cc0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
7cd0: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
7ce0: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
7cf0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
7d00: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
7d10: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
7d20: 70 4e 61 6d 65 20 3d 20 26 70 45 2d 3e 70 4c 65  pName = &pE->pLe
7d30: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
7d40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d50: 20 20 20 20 70 4e 61 6d 65 20 3d 20 30 3b 0a 20      pName = 0;. 
7d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7d70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
7d80: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
7d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
7da0: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
7db0: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20  st->a[i].pTab;. 
7dc0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
7dd0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 4c 69  TabName = pTabLi
7de0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b  st->a[i].zAlias;
7df0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
7e00: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
7e10: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
7e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
7e30: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
7e40: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
7e50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7e60: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
7e70: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
7e80: 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  [0]==0 || .     
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7ea0: 74 65 53 74 72 4e 49 43 6d 70 28 70 4e 61 6d 65  teStrNICmp(pName
7eb0: 2d 3e 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 70  ->z, zTabName, p
7ec0: 4e 61 6d 65 2d 3e 6e 29 21 3d 30 20 7c 7c 0a 20  Name->n)!=0 ||. 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 7a 54 61 62 4e 61 6d 65 5b 70 4e 61 6d 65 2d 3e  zTabName[pName->
7ef0: 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  n]!=0) ){.      
7f00: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7f10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7f20: 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
7f30: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
7f40: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
7f50: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
7f60: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
7f70: 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52  xpr, *pLeft, *pR
7f80: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
7f90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
7fa0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
7fb0: 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
7fc0: 20 20 69 66 28 20 69 3e 30 20 26 26 20 28 70 54    if( i>0 && (pT
7fd0: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a  abList->a[i-1].j
7fe0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
7ff0: 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  URAL)!=0 &&.    
8000: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
8010: 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
8020: 2d 3e 61 5b 69 2d 31 5d 2e 70 54 61 62 2c 20 7a  ->a[i-1].pTab, z
8030: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
8040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
8050: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
8060: 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
8070: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
8090: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
80a0: 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
80b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
80c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
80d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
80e0: 20 26 26 20 73 71 6c 69 74 65 49 64 4c 69 73 74   && sqliteIdList
80f0: 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2d 3e  Index(pTabList->
8100: 61 5b 69 2d 31 5d 2e 70 55 73 69 6e 67 2c 20 7a  a[i-1].pUsing, z
8110: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
8120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
8130: 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
8140: 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
8150: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
8170: 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
8180: 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
8190: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
81b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
81c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
81d0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
81e0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
81f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
8200: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
8210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8220: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
8230: 6e 2e 7a 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  n.z = zName;.   
8240: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
8250: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 73 74 72 6c 65  >token.n = strle
8260: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
8270: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
8280: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
8290: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
82a0: 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73  bName && pTabLis
82b0: 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
82c0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
82d0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
82e0: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
8300: 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  pr = sqliteExpr(
8310: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
8320: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
8330: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
8340: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
8360: 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a 54  ft->token.z = zT
8370: 61 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  abName;.        
8380: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
8390: 65 6e 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54  en.n = strlen(zT
83a0: 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
83b0: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
83c0: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
83d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
83e0: 65 53 65 74 53 74 72 69 6e 67 28 28 63 68 61 72  eSetString((char
83f0: 2a 2a 29 26 70 45 78 70 72 2d 3e 73 70 61 6e 2e  **)&pExpr->span.
8400: 7a 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 22 2e 22  z, zTabName, "."
8410: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
8420: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8430: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 73 74 72 6c 65  ->span.n = strle
8440: 6e 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29  n(pExpr->span.z)
8450: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8460: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
8470: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
8480: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
8490: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
84a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
84b0: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
84c0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
84d0: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
84e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8500: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8520: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
8530: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8550: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 45    pNew = sqliteE
8560: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
8570: 65 77 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ew, pExpr, 0);. 
8580: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8590: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
85a0: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
85b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61           if( pNa
85c0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
85d0: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
85e0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
85f0: 68 20 74 61 62 6c 65 3a 20 25 54 22 2c 20 70 4e  h table: %T", pN
8600: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
8610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8620: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
8640: 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
8650: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8660: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
8670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8680: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
8690: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
86a0: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
86b0: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
86c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
86d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
86e0: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
86f0: 6c 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53  ly unlinks the S
8700: 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70  elect.pSrc.a[].p
8710: 54 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  Tab pointers.** 
8720: 69 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75  in a select stru
8730: 63 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20  cture.  It just 
8740: 73 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72  sets the pointer
8750: 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  s to NULL.  This
8760: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72  .** routine is r
8770: 65 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20  ecursive in the 
8780: 73 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68  sense that if th
8790: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b  e Select.pSrc.a[
87a0: 5d 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69  ].pSelect.** poi
87b0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
87c0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
87d0: 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
87e0: 76 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69  vely on that poi
87f0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
8800: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8810: 65 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74  ed on the Select
8820: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8830: 64 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45  defines a.** VIE
8840: 57 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e  W in order to un
8850: 64 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20  do any bindings 
8860: 74 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73  to tables.  This
8870: 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a   is necessary.**
8880: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74   because those t
8890: 61 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44  ables might be D
88a0: 52 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65  ROPed by a subse
88b0: 71 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e  quent SQL comman
88c0: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e  d..** If the bin
88d0: 64 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65  dings are not re
88e0: 6d 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20  moved, then the 
88f0: 53 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d  Select.pSrc->a[]
8900: 2e 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77  .pTab field.** w
8910: 69 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e  ill be left poin
8920: 74 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f  ting to a deallo
8930: 63 61 74 65 64 20 54 61 62 6c 65 20 73 74 72 75  cated Table stru
8940: 63 74 75 72 65 20 61 66 74 65 72 20 74 68 65 0a  cture after the.
8950: 2a 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f  ** DROP and a co
8960: 72 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75  redump will occu
8970: 72 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  r the next time 
8980: 74 68 65 20 56 49 45 57 20 69 73 20 75 73 65 64  the VIEW is used
8990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
89a0: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53 65 6c  SelectUnbind(Sel
89b0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
89c0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
89d0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 54  c = p->pSrc;.  T
89e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
89f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
8a00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
8a10: 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
8a20: 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
8a30: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  pSrc->a[i].pTab)
8a40: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
8a50: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
8a60: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
8a70: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
8a80: 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  0, pTab);.      
8a90: 7d 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  }.      pSrc->a[
8aa0: 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  i].pTab = 0;.   
8ab0: 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
8ac0: 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ].pSelect ){.   
8ad0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
8ae0: 74 55 6e 62 69 6e 64 28 70 53 72 63 2d 3e 61 5b  tUnbind(pSrc->a[
8af0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
8b00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
8b10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8b20: 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20  tine associates 
8b30: 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52  entries in an OR
8b40: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8b50: 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63  n list with.** c
8b60: 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75  olumns in a resu
8b70: 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52  lt.  For each OR
8b80: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
8b90: 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66  n, the opcode of
8ba0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
8bb0: 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l node is change
8bc0: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61  d to TK_COLUMN a
8bd0: 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76  nd the iColumn v
8be0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  alue of.** the t
8bf0: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
8c00: 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
8c10: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
8c20: 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20  d the iTable.** 
8c30: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70  value of the top
8c40: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
8c50: 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c  illed with iTabl
8c60: 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  e parameter..**.
8c70: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
8c80: 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61  prior SELECT cla
8c90: 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70  uses, they are p
8ca0: 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20  rocessed first. 
8cb0: 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61   A match.** in a
8cc0: 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54  n earlier SELECT
8cd0: 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63   takes precedenc
8ce0: 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53  e over a later S
8cf0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ELECT..**.** Any
8d00: 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73   entry that does
8d10: 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c   not match is fl
8d20: 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f  agged as an erro
8d30: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  r.  The number.*
8d40: 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72  * of errors is r
8d50: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
8d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8d70: 20 4e 4f 54 20 63 6f 72 72 65 63 74 6c 79 20 69   NOT correctly i
8d80: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 45 78  nitialize the Ex
8d90: 70 72 2e 64 61 74 61 54 79 70 65 20 20 66 69 65  pr.dataType  fie
8da0: 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 52 44  ld.** of the ORD
8db0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
8dc0: 73 2e 20 20 54 68 65 20 6d 75 6c 74 69 53 65 6c  s.  The multiSel
8dd0: 65 63 74 53 6f 72 74 4f 72 64 65 72 28 29 20 72  ectSortOrder() r
8de0: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 62  outine.** must b
8df0: 65 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  e called to do t
8e00: 68 61 74 20 61 66 74 65 72 20 74 68 65 20 69 6e  hat after the in
8e10: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 20  dividual select 
8e20: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68 61  statements.** ha
8e30: 76 65 20 61 6c 6c 20 62 65 65 6e 20 61 6e 61 6c  ve all been anal
8e40: 79 7a 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  yzed.  This rout
8e50: 69 6e 65 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  ine is unable to
8e60: 20 63 6f 6d 70 75 74 65 20 45 78 70 72 2e 64 61   compute Expr.da
8e70: 74 61 54 79 70 65 0a 2a 2a 20 62 65 63 61 75 73  taType.** becaus
8e80: 65 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  e it must be cal
8e90: 6c 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 69  led before the i
8ea0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
8eb0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 68   statements.** h
8ec0: 61 76 65 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65  ave been analyze
8ed0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8ee0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
8ef0: 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
8f00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8f10: 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c   /* A place to l
8f20: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
8f30: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
8f40: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
8f50: 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73   /* Match to res
8f60: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ult columns of t
8f70: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
8f80: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8f90: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
8fa0: 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74  RDER BY values t
8fb0: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
8fc0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
8fd0: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
8fe0: 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74       /* Insert t
8ff0: 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61  his value in iTa
9000: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
9010: 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20  tComplete       
9020: 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20   /* If TRUE all 
9030: 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d  ORDER BYs must m
9040: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
9050: 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74   nErr = 0;.  int
9060: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
9070: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
9080: 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20  ( pSelect==0 || 
9090: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
90a0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75  turn 1;.  if( mu
90b0: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
90c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
90d0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
90e0: 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  +){ pOrderBy->a[
90f0: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20  i].done = 0; }. 
9100: 20 7d 0a 20 20 69 66 28 20 66 69 6c 6c 49 6e 43   }.  if( fillInC
9110: 6f 6c 75 6d 6e 4c 69 73 74 28 70 50 61 72 73 65  olumnList(pParse
9120: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
9130: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9140: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
9150: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
9160: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
9170: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53  olumn(pParse, pS
9180: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70  elect->pPrior, p
9190: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
91a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
91b0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
91c0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
91d0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  ect->pEList;.  f
91e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
91f0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
9200: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
9210: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
9220: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43  Expr;.    int iC
9230: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  ol = -1;.    if(
9240: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
9250: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
9260: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
9270: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
9280: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
9290: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
92a0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
92b0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
92c0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
92d0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
92e0: 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f  ORDER BY positio
92f0: 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62  n %d should be b
9300: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
9310: 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  ,.          iCol
9320: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
9330: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
9340: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9360: 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65  f( !mustComplete
9370: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9380: 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d     iCol--;.    }
9390: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43  .    for(j=0; iC
93a0: 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74  ol<0 && j<pEList
93b0: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
93c0: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
93d0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28  >a[j].zName && (
93e0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
93f0: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49   pE->op==TK_STRI
9400: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  NG) ){.        c
9410: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61  har *zName, *zLa
9420: 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  bel;.        zNa
9430: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  me = pEList->a[j
9440: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
9450: 20 61 73 73 65 72 74 28 20 70 45 2d 3e 74 6f 6b   assert( pE->tok
9460: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20  en.z );.        
9470: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 53  zLabel = sqliteS
9480: 74 72 4e 44 75 70 28 70 45 2d 3e 74 6f 6b 65 6e  trNDup(pE->token
9490: 2e 7a 2c 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pE->token.n)
94a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
94b0: 44 65 71 75 6f 74 65 28 7a 4c 61 62 65 6c 29 3b  Dequote(zLabel);
94c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
94d0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  iteStrICmp(zName
94e0: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
94f0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
9500: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
9510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
9520: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
9530: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
9540: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 45 78 70  l<0 && sqliteExp
9550: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
9560: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
9570: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
9580: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
9590: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
95a0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d  >=0 ){.      pE-
95b0: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
95c0: 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75  .      pE->iColu
95d0: 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
95e0: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
95f0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4f 72 64  able;.      pOrd
9600: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
9610: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
9620: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73  f( iCol<0 && mus
9630: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
9640: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
9650: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
9660: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
9670: 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20   number %d does 
9680: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
9690: 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b  sult column", i+
96a0: 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  1);.      nErr++
96b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
96c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
96d0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
96e0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
96f0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
9700: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
9710: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
9720: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
9730: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9740: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
9750: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
9760: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
9770: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 47 65 74  .Vdbe *sqliteGet
9780: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
9790: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
97a0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
97b0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
97c0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
97d0: 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  dbe = sqliteVdbe
97e0: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
97f0: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
9800: 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   v;.}../*.** Thi
9810: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
9820: 68 65 20 45 78 70 72 2e 64 61 74 61 54 79 70 65  he Expr.dataType
9830: 20 66 69 65 6c 64 20 6f 6e 20 61 6c 6c 20 65 6c   field on all el
9840: 65 6d 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65  ements of.** the
9850: 20 70 4f 72 64 65 72 42 79 20 65 78 70 72 65 73   pOrderBy expres
9860: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20  sion list.  The 
9870: 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 77 69  pOrderBy list wi
9880: 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ll have been.** 
9890: 73 65 74 20 75 70 20 62 79 20 6d 61 74 63 68 4f  set up by matchO
98a0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 29  rderbyToColumn()
98b0: 2e 20 20 48 65 6e 63 65 20 65 61 63 68 20 65 78  .  Hence each ex
98c0: 70 72 65 73 73 69 6f 6e 20 68 61 73 0a 2a 2a 20  pression has.** 
98d0: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 73 20 69  a TK_COLUMN as i
98e0: 74 73 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 20 54  ts root node.  T
98f0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
9900: 72 65 66 65 72 73 20 74 6f 20 61 20 0a 2a 2a 20  refers to a .** 
9910: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
9920: 73 75 6c 74 20 73 65 74 2e 20 20 20 54 68 65 20  sult set.   The 
9930: 64 61 74 61 74 79 70 65 20 69 73 20 73 65 74 20  datatype is set 
9940: 74 6f 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  to SQLITE_SO_TEX
9950: 54 0a 2a 2a 20 69 66 20 74 68 65 20 63 6f 72 72  T.** if the corr
9960: 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
9970: 20 69 6e 20 70 20 61 6e 64 20 65 76 65 72 79 20   in p and every 
9980: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 6c 65  SELECT to the le
9990: 66 74 20 6f 66 0a 2a 2a 20 70 20 68 61 73 20 61  ft of.** p has a
99a0: 20 64 61 74 61 74 79 70 65 20 6f 66 20 53 51 4c   datatype of SQL
99b0: 49 54 45 5f 53 4f 5f 54 45 58 54 2e 20 20 49 66  ITE_SO_TEXT.  If
99c0: 20 74 68 65 20 63 6f 6f 72 65 73 73 70 6f 6e 64   the cooresspond
99d0: 69 6e 67 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e  ing column.** in
99e0: 20 70 20 6f 72 20 61 6e 79 20 6f 66 20 74 68 65   p or any of the
99f0: 20 6c 65 66 74 20 53 45 4c 45 43 54 73 20 69 73   left SELECTs is
9a00: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 2c 20   SQLITE_SO_NUM, 
9a10: 74 68 65 6e 20 74 68 65 20 64 61 74 61 74 79 70  then the datatyp
9a20: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 72 64 65  e.** of the orde
9a30: 72 2d 62 79 20 65 78 70 72 65 73 73 69 6f 6e 20  r-by expression 
9a40: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
9a50: 5f 53 4f 5f 4e 55 4d 2e 0a 2a 2a 0a 2a 2a 20 45  _SO_NUM..**.** E
9a60: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
9a70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9a80: 6f 6e 65 28 61 20 49 4e 54 45 47 45 52 2c 20 62  one(a INTEGER, b
9a90: 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20 20 43   TEXT);.**     C
9aa0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 77 6f 28  REATE TABLE two(
9ab0: 63 20 56 41 52 43 48 41 52 28 35 29 2c 20 64 20  c VARCHAR(5), d 
9ac0: 46 4c 4f 41 54 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  FLOAT);.**.**   
9ad0: 20 20 53 45 4c 45 43 54 20 62 2c 20 62 20 46 52    SELECT b, b FR
9ae0: 4f 4d 20 6f 6e 65 20 55 4e 49 4f 4e 20 53 45 4c  OM one UNION SEL
9af0: 45 43 54 20 64 2c 20 63 20 46 52 4f 4d 20 74 77  ECT d, c FROM tw
9b00: 6f 20 4f 52 44 45 52 20 42 59 20 31 2c 20 32 3b  o ORDER BY 1, 2;
9b10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 69 6d 61  .**.** The prima
9b20: 72 79 20 73 6f 72 74 20 6b 65 79 20 77 69 6c 6c  ry sort key will
9b30: 20 75 73 65 20 53 51 4c 49 54 45 5f 53 4f 5f 4e   use SQLITE_SO_N
9b40: 55 4d 20 62 65 63 61 75 73 65 20 74 68 65 20 22  UM because the "
9b50: 64 22 20 69 6e 0a 2a 2a 20 74 68 65 20 73 65 63  d" in.** the sec
9b60: 6f 6e 64 20 53 45 4c 45 43 54 20 69 73 20 6e 75  ond SELECT is nu
9b70: 6d 65 72 69 63 2e 20 20 54 68 65 20 31 73 74 20  meric.  The 1st 
9b80: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69  column of the fi
9b90: 72 73 74 20 53 45 4c 45 43 54 0a 2a 2a 20 69 73  rst SELECT.** is
9ba0: 20 74 65 78 74 20 62 75 74 20 74 68 61 74 20 64   text but that d
9bb0: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62  oes not matter b
9bc0: 65 63 61 75 73 65 20 61 20 6e 75 6d 65 72 69 63  ecause a numeric
9bd0: 20 61 6c 77 61 79 73 20 6f 76 65 72 72 69 64 65   always override
9be0: 73 0a 2a 2a 20 61 20 74 65 78 74 2e 0a 2a 2a 0a  s.** a text..**.
9bf0: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 61 72 79  ** The secondary
9c00: 20 6b 65 79 20 77 69 6c 6c 20 75 73 65 20 74 68   key will use th
9c10: 65 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  e SQLITE_SO_TEXT
9c20: 20 73 6f 72 74 20 6f 72 64 65 72 20 62 65 63 61   sort order beca
9c30: 75 73 65 0a 2a 2a 20 62 6f 74 68 20 74 68 65 20  use.** both the 
9c40: 28 73 65 63 6f 6e 64 29 20 22 62 22 20 69 6e 20  (second) "b" in 
9c50: 74 68 65 20 66 69 72 73 74 20 53 45 4c 45 43 54  the first SELECT
9c60: 20 61 6e 64 20 74 68 65 20 22 63 22 20 69 6e 20   and the "c" in 
9c70: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 53 45  the second.** SE
9c80: 4c 45 43 54 20 68 61 76 65 20 61 20 64 61 74 61  LECT have a data
9c90: 74 79 70 65 20 6f 66 20 74 65 78 74 2e 0a 2a 2f  type of text..*/
9ca0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 75   .static void mu
9cb0: 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72 64  ltiSelectSortOrd
9cc0: 65 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 45 78  er(Select *p, Ex
9cd0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
9ce0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
9cf0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
9d00: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
9d10: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
9d20: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ( p==0 ){.    fo
9d30: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
9d40: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
9d50: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
9d60: 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 64 61 74 61  a[i].pExpr->data
9d70: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  Type = SQLITE_SO
9d80: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
9d90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6d   return;.  }.  m
9da0: 75 6c 74 69 53 65 6c 65 63 74 53 6f 72 74 4f 72  ultiSelectSortOr
9db0: 64 65 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  der(p->pPrior, p
9dc0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 45 4c 69  OrderBy);.  pELi
9dd0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
9de0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
9df0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9e00: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
9e10: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
9e20: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
9e30: 20 70 45 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53   pE->dataType==S
9e40: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 20 63  QLITE_SO_NUM ) c
9e50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
9e60: 65 72 74 28 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e  ert( pE->iColumn
9e70: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
9e80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 70 45 2d  EList->nExpr>pE-
9e90: 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
9ea0: 20 20 70 45 2d 3e 64 61 74 61 54 79 70 65 20 3d    pE->dataType =
9eb0: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
9ec0: 70 45 4c 69 73 74 2d 3e 61 5b 70 45 2d 3e 69 43  pEList->a[pE->iC
9ed0: 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 29 3b 0a 20  olumn].pExpr);. 
9ee0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9ef0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9f00: 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
9f10: 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61 74  ess a query that
9f20: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75   is really the u
9f30: 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72  nion.** or inter
9f40: 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f  section of two o
9f50: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
9f60: 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22  queries..**.** "
9f70: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
9f80: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
9f90: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
9fa0: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
9fb0: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
9fc0: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
9fd0: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
9fe0: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
9ff0: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
a000: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
a010: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
a020: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
a030: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
a040: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
a050: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
a060: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
a070: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
a080: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
a090: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
a0a0: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
a0b0: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
a0c0: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
a0d0: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
a0e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
a0f0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
a100: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
a110: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
a120: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
a130: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
a140: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
a150: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a160: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
a170: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
a180: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
a190: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
a1a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a1b0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
a1c0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
a1d0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31  SELECT c FROM t1
a1e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
a1f0: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
a200: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
a210: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
a220: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
a230: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
a240: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
a250: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
a260: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
a270: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
a280: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
a290: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
a2a0: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
a2b0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
a2c0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
a2d0: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
a2e0: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
a2f0: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
a300: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
a310: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
a320: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a330: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
a340: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 50  nt multiSelect(P
a350: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
a360: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
a370: 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
a380: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a390: 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73        /* Success
a3a0: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
a3b0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
a3c0: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
a3d0: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
a3e0: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
a3f0: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
a400: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
a410: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
a420: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
a430: 45 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  E */..  /* Make 
a440: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
a450: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
a460: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
a470: 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20  s.  Only the .  
a480: 2a 2a 20 6c 61 73 74 20 53 45 4c 45 43 54 20 69  ** last SELECT i
a490: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
a4a0: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
a4b0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  Y..  */.  if( p=
a4c0: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
a4d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a4e0: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
a4f0: 69 6f 72 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  ior;.  if( pPrio
a500: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
a510: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
a520: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
a530: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
a540: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
a550: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
a560: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
a570: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 65 74 75  ->op));.    retu
a580: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
a590: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
a5a0: 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79 20  e a valid query 
a5b0: 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c  engine.  If not,
a5c0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
a5d0: 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
a5e0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
a5f0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
a600: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
a610: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
a620: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
a630: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
a640: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
a650: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
a660: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
a670: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a680: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
a690: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73  rm, 0);.    eDes
a6a0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
a6b0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
a6c0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
a6d0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
a6e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
a6f0: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
a700: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
a710: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
a720: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
a730: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
a740: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
a750: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
a760: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
a770: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
a780: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a790: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 2d  n rc;.        p-
a7a0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
a7b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a7c0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
a7d0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
a7e0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
a7f0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
a800: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
a810: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a820: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
a840: 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20  * For UNION ALL 
a850: 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c  ... ORDER BY fal
a860: 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
a870: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
a880: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a890: 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
a8a0: 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
a8b0: 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
a8c0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
a8d0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
a8e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
a8f0: 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
a900: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
a910: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
a920: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
a930: 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
a940: 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
a950: 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
a960: 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
a970: 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
a980: 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
a990: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
a9a0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 54  *pOrderBy;  /* T
a9b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
a9c0: 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  se for the right
a9d0: 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20   SELECT */..    
a9e0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
a9f0: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
aa00: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
aa10: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
aa20: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
aa30: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ->pOrderBy==0 ){
aa40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
aa50: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
aa60: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
aa70: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
aa80: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
aa90: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
aaa0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
aab0: 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20  onTab = iParm;. 
aac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aad0: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
aae0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
aaf0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
ab00: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
ab10: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
ab20: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
ab30: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
ab40: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
ab50: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
ab60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
ab70: 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20 20  pOrderBy .      
ab80: 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62    && matchOrderb
ab90: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
aba0: 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
abb0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29  , unionTab, 1) )
abc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
abd0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
abe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
abf0: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
ac00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
ac10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
ac20: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
ac30: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
ac40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ac50: 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20  , OP_KeyAsData, 
ac60: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b 0a 20 20  unionTab, 1);.  
ac70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ac80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
ac90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
aca0: 6e 54 65 6d 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  nTemp, unionTab,
acb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
acc0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
acd0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
ace0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
acf0: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
ad00: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ad10: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
ad20: 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70   pPrior, priorOp
ad30: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
ad40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
ad50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ad60: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
ad70: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
ad80: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
ad90: 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63    */.      switc
ada0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
adb0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
adc0: 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45  EPT:  op = SRT_E
add0: 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a  xcept;   break;.
ade0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
adf0: 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53  _UNION:   op = S
ae00: 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65  RT_Union;    bre
ae10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
ae20: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70  e TK_ALL:     op
ae30: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20   = SRT_Table;   
ae40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ae50: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ae60: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  = 0;.      pOrde
ae70: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
ae80: 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  y;.      p->pOrd
ae90: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
aea0: 72 63 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  rc = sqliteSelec
aeb0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
aec0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
aed0: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50   0);.      p->pP
aee0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
aef0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
af00: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
af10: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
af20: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a  rn rc;..      /*
af30: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
af40: 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
af50: 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
af60: 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
af70: 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
af80: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
af90: 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20  d..      */     
afa0: 20 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73   .      if( eDes
afb0: 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e  t!=priorOp || un
afc0: 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b  ionTab!=iParm ){
afd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
afe0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
aff0: 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
b000: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
b010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65  .        if( eDe
b020: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
b030: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
b040: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
b050: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
b060: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
b070: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
b080: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
b090: 2d 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73  ->pSrc, p->pELis
b0a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
b0b0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
b0c0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
b0d0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
b0e0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Cont = sqliteVdb
b0f0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
b120: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
b130: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
b140: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 56  iStart = sqliteV
b150: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b160: 29 3b 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69  );.        multi
b170: 53 65 6c 65 63 74 53 6f 72 74 4f 72 64 65 72 28  SelectSortOrder(
b180: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  p, p->pOrderBy);
b190: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
b1a0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
b1b0: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
b1c0: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
b1d0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
b200: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
b210: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
b240: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
b250: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b260: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n 1;.        sql
b270: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b280: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
b290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
b2a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
b2b0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
b2c0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
b2d0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
b2e0: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
b2f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
b300: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b310: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
b320: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
b330: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
b340: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
b350: 65 53 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20  eSortTail(p, v, 
b360: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
b370: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
b380: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b390: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b3a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b3b0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
b3c0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
b3d0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
b3e0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
b3f0: 74 61 72 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  tart;..      /* 
b400: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
b410: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
b420: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
b430: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
b440: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
b450: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
b460: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
b470: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
b480: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
b490: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
b4a0: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
b4b0: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
b4c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
b4d0: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
b4e0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
b4f0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
b500: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
b510: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
b520: 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79  se,p,p->pOrderBy
b530: 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20  ,tab1,1) ){.    
b540: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b550: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b560: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b570: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31  P_OpenTemp, tab1
b580: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
b590: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b5a0: 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62  P_KeyAsData, tab
b5b0: 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  1, 1);..      /*
b5c0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
b5d0: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
b5e0: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
b5f0: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
b600: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
b610: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
b620: 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f  se, pPrior, SRT_
b630: 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20  Union, tab1, 0, 
b640: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
b650: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b660: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
b670: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
b680: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
b690: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
b6a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
b6b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b6c0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
b6d0: 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  b2, 1);.      sq
b6e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b6f0: 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c 20 74   OP_KeyAsData, t
b700: 61 62 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ab2, 1);.      p
b710: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
b720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 53      rc = sqliteS
b730: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
b740: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
b750: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b760: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
b770: 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
b780: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
b790: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
b7a0: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
b7b0: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
b7c0: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
b7d0: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
b7e0: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
b7f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b800: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
b810: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b820: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
b830: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
b840: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
b850: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
b860: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
b870: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
b880: 65 2c 20 70 2d 3e 70 53 72 63 2c 20 70 2d 3e 70  e, p->pSrc, p->p
b890: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
b8a0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
b8b0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
b8c0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
b8d0: 6e 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nt = sqliteVdbeM
b8e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b8f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b900: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
b910: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
b920: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
b930: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b940: 2c 20 4f 50 5f 46 75 6c 6c 4b 65 79 2c 20 74 61  , OP_FullKey, ta
b950: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
b960: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b970: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
b980: 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  b2, iCont);.    
b990: 20 20 6d 75 6c 74 69 53 65 6c 65 63 74 53 6f 72    multiSelectSor
b9a0: 74 4f 72 64 65 72 28 70 2c 20 70 2d 3e 70 4f 72  tOrder(p, p->pOr
b9b0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 72 63  derBy);.      rc
b9c0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
b9d0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
b9e0: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
b9f0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
ba00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
ba20: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
ba30: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
ba60: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ba70: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ba80: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
ba90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
baa0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
bab0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
bac0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  p(v, OP_Next, ta
bad0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
bae0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
baf0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
bb00: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
bb10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
bb20: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
bb30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
bb40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
bb50: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
bb60: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
bb70: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
bb80: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
bb90: 6c 28 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  l(p, v, p->pELis
bba0: 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
bbb0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d   iParm);.      }
bbc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bbd0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
bbe0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
bbf0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
bc00: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
bc10: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
bc20: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
bc30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
bc40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
bc50: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
bc60: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
bc70: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
bc80: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
bc90: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
bca0: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
bcb0: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
bcc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
bcd0: 20 7d 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61   }..  /* Issue a
bce0: 20 6e 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69   null callback i
bcf0: 66 20 74 68 61 74 20 69 73 20 77 68 61 74 20 74  f that is what t
bd00: 68 65 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20  he user wants.. 
bd10: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
bd20: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26 26  =SRT_Callback &&
bd30: 0a 20 20 20 20 28 70 50 61 72 73 65 2d 3e 75 73  .    (pParse->us
bd40: 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20  eCallback==0 || 
bd50: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
bd60: 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c  gs & SQLITE_Null
bd70: 43 61 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20 20  Callback)!=0).  
bd80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
bd90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
bda0: 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 2d 3e 70 45  lCallback, p->pE
bdb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
bdc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
bdd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
bde0: 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
bdf0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
be00: 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
be10: 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
be20: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
be30: 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
be40: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
be50: 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
be60: 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
be70: 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
be80: 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
be90: 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
bea0: 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
beb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
bec0: 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
bed0: 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
bee0: 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
bef0: 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
bf00: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
bf10: 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
bf20: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
bf30: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
bf40: 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
bf50: 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
bf60: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
bf70: 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
bf80: 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
bf90: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
bfa0: 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
bfb0: 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
bfc0: 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
bfd0: 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
bfe0: 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
bff0: 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
c000: 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
c010: 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
c020: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
c030: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
c040: 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
c050: 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78  ExprList*,int,Ex
c060: 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f  prList*);  /* Fo
c070: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
c080: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
c090: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
c0a0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
c0b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
c0c0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
c0d0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
c0e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
c0f0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
c100: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
c110: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
c120: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  0 ){.    Expr *p
c130: 4e 65 77 3b 0a 20 20 20 20 61 73 73 65 72 74 28  New;.    assert(
c140: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
c150: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
c160: 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
c170: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
c180: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
c190: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
c1a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
c1b0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70   );.    pNew = p
c1c0: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
c1d0: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
c1e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
c1f0: 21 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72  !=0 );.    pExpr
c200: 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
c210: 0a 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61  .    pExpr->data
c220: 54 79 70 65 20 3d 20 70 4e 65 77 2d 3e 64 61 74  Type = pNew->dat
c230: 61 54 79 70 65 3b 0a 20 20 20 20 61 73 73 65 72  aType;.    asser
c240: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
c250: 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
c260: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45  >pLeft = sqliteE
c270: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65  xprDup(pNew->pLe
c280: 66 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ft);.    assert(
c290: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
c2a0: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
c2b0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45  pRight = sqliteE
c2c0: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
c2d0: 67 68 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ght);.    assert
c2e0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
c2f0: 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
c300: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  pList = sqliteEx
c310: 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e  prListDup(pNew->
c320: 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  pList);.    pExp
c330: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
c340: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 45  ->iTable;.    pE
c350: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
c360: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
c370: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
c380: 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20  pNew->iAgg;.    
c390: 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28  sqliteTokenCopy(
c3a0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
c3b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
c3c0: 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70    sqliteTokenCop
c3d0: 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20  y(&pExpr->span, 
c3e0: 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20  &pNew->span);.  
c3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
c400: 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  Expr(pExpr->pLef
c410: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
c420: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
c430: 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  r(pExpr->pRight,
c440: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
c450: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
c460: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
c470: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
c480: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
c490: 76 6f 69 64 20 0a 73 75 62 73 74 45 78 70 72 4c  void .substExprL
c4a0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ist(ExprList *pL
c4b0: 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  ist, int iTable,
c4c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c4d0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
c4e0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
c4f0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
c500: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c510: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74   i++){.    subst
c520: 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Expr(pList->a[i]
c530: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
c540: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  pEList);.  }.}..
c550: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c560: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
c570: 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
c580: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
c590: 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
c5a0: 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
c5b0: 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
c5c0: 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
c5d0: 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
c5e0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
c5f0: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
c600: 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
c610: 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
c620: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
c630: 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
c640: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
c650: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
c660: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
c670: 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
c680: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
c690: 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
c6a0: 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
c6b0: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
c6c0: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
c6d0: 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
c6e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
c6f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
c700: 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
c710: 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
c720: 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
c730: 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
c740: 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
c750: 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
c760: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
c770: 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
c780: 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
c790: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
c7a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
c7b0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
c7c0: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
c7d0: 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
c7e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
c7f0: 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
c800: 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
c810: 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
c820: 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
c830: 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
c840: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
c850: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
c860: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
c870: 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
c880: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
c890: 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
c8a0: 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
c8b0: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
c8c0: 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
c8d0: 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
c8e0: 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
c8f0: 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
c900: 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
c910: 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
c920: 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
c930: 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
c940: 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
c950: 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
c960: 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
c970: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
c980: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
c990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
c9a0: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
c9b0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
c9c0: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
c9d0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
c9e0: 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
c9f0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
ca00: 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
ca10: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
ca20: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
ca30: 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
ca40: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
ca50: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
ca60: 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
ca70: 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
ca80: 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
ca90: 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
caa0: 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
cab0: 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
cac0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
cad0: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
cae0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
caf0: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
cb00: 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
cb10: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
cb20: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
cb30: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
cb40: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
cb50: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
cb60: 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
cb70: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
cb80: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
cb90: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
cba0: 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
cbb0: 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
cbc0: 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
cbd0: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
cbe0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
cbf0: 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
cc00: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
cc10: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
cc20: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
cc30: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
cc40: 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
cc50: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
cc60: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
cc70: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
cc80: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
cc90: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
cca0: 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
ccb0: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
ccc0: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
ccd0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
cce0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
ccf0: 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
cd00: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
cd10: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
cd20: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
cd30: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
cd40: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
cd50: 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
cd60: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
cd70: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
cd80: 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
cd90: 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
cda0: 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
cdb0: 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
cdc0: 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
cdd0: 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
cde0: 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
cdf0: 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
ce00: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
ce10: 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
ce20: 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
ce30: 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
ce40: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
ce50: 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
ce60: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
ce70: 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
ce80: 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
ce90: 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
cea0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
ceb0: 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
cec0: 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
ced0: 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
cee0: 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
cef0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
cf00: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
cf10: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
cf20: 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
cf30: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
cf40: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
cf50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
cf60: 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
cf70: 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
cf80: 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
cf90: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
cfa0: 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
cfb0: 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
cfc0: 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
cfd0: 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
cfe0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
cff0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
d000: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
d010: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
d020: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
d030: 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
d040: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
d050: 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
d060: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
d070: 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
d080: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
d090: 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
d0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
d0b0: 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
d0c0: 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
d0d0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
d0e0: 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
d0f0: 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
d100: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
d110: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
d120: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  tions */.){.  Se
d130: 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
d140: 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
d150: 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
d160: 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  y" */.  SrcList 
d170: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
d180: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
d190: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
d1a0: 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
d1b0: 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
d1c0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
d1d0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
d1e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d1f0: 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
d200: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
d210: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
d220: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
d230: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
d240: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
d250: 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
d260: 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
d270: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
d280: 2a 70 57 68 65 72 65 3b 0a 0a 20 20 2f 2a 20 43  *pWhere;..  /* C
d290: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
d2a0: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
d2b0: 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
d2c0: 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
d2d0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
d2e0: 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
d2f0: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
d300: 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
d310: 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
d320: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
d330: 20 3d 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d   = pSrc->a[iFrom
d340: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ].pSelect;.  ass
d350: 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
d360: 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
d370: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
d380: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
d390: 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
d3a0: 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
d3b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53  eturn 0;.  pSubS
d3c0: 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
d3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
d3e0: 72 63 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  rc );.  if( pSub
d3f0: 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
d400: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
d410: 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
d420: 20 7c 7c 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74   || pSub->nLimit
d430: 3e 3d 30 29 20 26 26 20 20 28 70 53 72 63 2d 3e  >=0) &&  (pSrc->
d440: 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
d450: 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
d460: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  0;.  }.  if( (p-
d470: 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
d480: 2d 3e 6e 4c 69 6d 69 74 3e 3d 30 29 20 26 26 20  ->nLimit>=0) && 
d490: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
d4a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
d4b0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
d4c0: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
d4d0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
d4e0: 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
d4f0: 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
d500: 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
d510: 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
d520: 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
d530: 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
d540: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
d550: 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
d560: 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
d570: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
d580: 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
d590: 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
d5a0: 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
d5b0: 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
d5c0: 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
d5d0: 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
d5e0: 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
d5f0: 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
d600: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
d610: 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
d620: 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
d630: 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
d640: 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   thing..  */.  i
d650: 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
d660: 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26  >1 && iFrom>0 &&
d670: 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d   (pSrc->a[iFrom-
d680: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
d690: 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
d6a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d6b0: 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
d6c0: 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
d6d0: 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
d6e0: 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
d6f0: 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
d700: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
d710: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
d720: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
d730: 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
d740: 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
d750: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
d760: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
d770: 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
d780: 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
d790: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
d7a0: 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
d7b0: 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
d7c0: 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
d7d0: 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
d7e0: 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
d7f0: 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
d800: 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
d810: 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
d820: 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
d830: 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
d840: 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
d850: 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
d860: 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
d870: 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
d880: 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
d890: 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46  N..  */.  if( iF
d8a0: 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e  rom>0 && (pSrc->
d8b0: 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74  a[iFrom-1].joint
d8c0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
d8d0: 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53 75  =0 .      && pSu
d8e0: 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a  b->pWhere!=0 ){.
d8f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d900: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
d910: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
d920: 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e  it means flatten
d930: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
d940: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46   for the.  ** iF
d950: 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
d960: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
d970: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
d980: 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d  ry..  */..  /* M
d990: 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ove all of the F
d9a0: 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
d9b0: 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
d9c0: 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
d9d0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
d9e0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
d9f0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
da00: 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
da10: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
da20: 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
da30: 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
da40: 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
da50: 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
da60: 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
da70: 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
da80: 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
da90: 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
daa0: 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
dab0: 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
dac0: 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
dad0: 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
dae0: 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
daf0: 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
db00: 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
db10: 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
db20: 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
db30: 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
db40: 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
db50: 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 72 63    iParent = pSrc
db60: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 69 43 75 72 73  ->a[iFrom].iCurs
db70: 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  or;.  {.    int 
db80: 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
db90: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74  c->nSrc;.    int
dba0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 72 63   jointype = pSrc
dbb0: 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
dbc0: 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ype;..    if( pS
dbd0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 70 54 61  rc->a[iFrom].pTa
dbe0: 62 20 26 26 20 70 53 72 63 2d 3e 61 5b 69 46 72  b && pSrc->a[iFr
dbf0: 6f 6d 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e  om].pTab->isTran
dc00: 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  sient ){.      s
dc10: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
dc20: 28 30 2c 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f  (0, pSrc->a[iFro
dc30: 6d 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  m].pTab);.    }.
dc40: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
dc50: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 44  Src->a[iFrom].zD
dc60: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
dc70: 6c 69 74 65 46 72 65 65 28 70 53 72 63 2d 3e 61  liteFree(pSrc->a
dc80: 5b 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 29 3b 0a  [iFrom].zName);.
dc90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
dca0: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 7a 41  Src->a[iFrom].zA
dcb0: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e  lias);.    if( n
dcc0: 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
dcd0: 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53    int extra = nS
dce0: 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20  ubSrc - 1;.     
dcf0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62   for(i=1; i<nSub
dd00: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
dd10: 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
dd20: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53  SrcListAppend(pS
dd30: 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
dd40: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63   }.      p->pSrc
dd50: 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
dd60: 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
dd70: 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
dd80: 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
dd90: 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
dda0: 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
ddb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ddc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
ddd0: 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
dde0: 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
ddf0: 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
de00: 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
de10: 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
de20: 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
de30: 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
de40: 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
de50: 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a  rom+nSubSrc-1].j
de60: 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
de70: 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
de80: 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
de90: 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
dea0: 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
deb0: 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
dec0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
ded0: 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
dee0: 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
def0: 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
df00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
df10: 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
df20: 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
df30: 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
df40: 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
df50: 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
df80: 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
df90: 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
dfa0: 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
dfb0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
dfc0: 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
dfd0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
dfe0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
dff0: 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
e000: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
e010: 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
e020: 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
e030: 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
e040: 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
e050: 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
e060: 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
e070: 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
e080: 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73  "y+10"..  */.  s
e090: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
e0a0: 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
e0b0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
e0c0: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
e0d0: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
e0e0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
e0f0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
e100: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
e110: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
e120: 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
e130: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e140: 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
e150: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
e160: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
e170: 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e  eStrNDup(pExpr->
e180: 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
e190: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pan.n);.    }.  
e1a0: 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
e1b0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
e1c0: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
e1d0: 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
e1e0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
e1f0: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
e200: 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
e210: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
e220: 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
e230: 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
e240: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
e250: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
e260: 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
e270: 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
e280: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
e290: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
e2a0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
e2b0: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
e2c0: 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
e2d0: 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
e2e0: 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
e2f0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
e300: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
e310: 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72  rDup(pSub->pWher
e320: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
e330: 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
e340: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
e350: 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65  sAgg ){.    asse
e360: 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  rt( p->pHaving==
e370: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  0 );.    p->pHav
e380: 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ing = p->pWhere;
e390: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
e3a0: 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62   pWhere;.    sub
e3b0: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
e3c0: 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
e3d0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
e3e0: 66 28 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  f( pSub->pHaving
e3f0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
e400: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
e410: 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48  ExprDup(pSub->pH
e420: 61 76 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66  aving);.      if
e430: 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
e440: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69          p->pHavi
e450: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  ng = sqliteExpr(
e460: 54 4b 5f 41 4e 44 2c 20 70 2d 3e 70 48 61 76 69  TK_AND, p->pHavi
e470: 6e 67 2c 20 70 48 61 76 69 6e 67 2c 20 30 29 3b  ng, pHaving, 0);
e480: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e490: 20 20 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67        p->pHaving
e4a0: 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 20 20   = pHaving;.    
e4b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e4c0: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
e4d0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
e4e0: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
e4f0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62  ExprListDup(pSub
e500: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d  ->pGroupBy);.  }
e510: 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 57 68 65  else if( p->pWhe
e520: 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  re==0 ){.    p->
e530: 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
e540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
e550: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
e560: 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
e570: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
e580: 66 28 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20  f( pWhere ){.   
e590: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
e5a0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44  qliteExpr(TK_AND
e5b0: 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  , p->pWhere, pWh
e5c0: 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ere, 0);.    }. 
e5d0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61   }..  /* The fla
e5e0: 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
e5f0: 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
e600: 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
e610: 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71  the.  ** outer q
e620: 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
e630: 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44  . .  */.  p->isD
e640: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
e650: 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d  istinct || pSub-
e660: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20  >isDistinct;..  
e670: 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
e680: 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  limit expression
e690: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
e6a0: 72 79 20 74 6f 20 74 68 65 20 6f 75 74 65 72 0a  ry to the outer.
e6b0: 20 20 2a 2a 20 71 75 65 72 79 2e 0a 20 20 2a 2f    ** query..  */
e6c0: 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 6e 4c 69  .  if( pSub->nLi
e6d0: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  mit>=0 ){.    if
e6e0: 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29 7b  ( p->nLimit<0 ){
e6f0: 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74  .      p->nLimit
e700: 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d 69 74 3b   = pSub->nLimit;
e710: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
e720: 2d 3e 6e 4c 69 6d 69 74 2b 70 2d 3e 6e 4f 66 66  ->nLimit+p->nOff
e730: 73 65 74 20 3e 20 70 53 75 62 2d 3e 6e 4c 69 6d  set > pSub->nLim
e740: 69 74 2b 70 53 75 62 2d 3e 6e 4f 66 66 73 65 74  it+pSub->nOffset
e750: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
e760: 6d 69 74 20 3d 20 70 53 75 62 2d 3e 6e 4c 69 6d  mit = pSub->nLim
e770: 69 74 20 2b 20 70 53 75 62 2d 3e 6e 4f 66 66 73  it + pSub->nOffs
e780: 65 74 20 2d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et - p->nOffset;
e790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
e7a0: 6e 4f 66 66 73 65 74 20 2b 3d 20 70 53 75 62 2d  nOffset += pSub-
e7b0: 3e 6e 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20  >nOffset;..  /* 
e7c0: 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
e7d0: 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
e7e0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
e7f0: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
e800: 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
e810: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
e820: 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pSub);.  return
e830: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
e840: 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
e850: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
e860: 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65   in as an argume
e870: 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
e880: 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ** is a simple m
e890: 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
e8a0: 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61  ery.  If it is a
e8b0: 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61  nd this query ca
e8c0: 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65  n be.** satisfie
e8d0: 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  d using a single
e8e0: 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67   seek to the beg
e8f0: 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66  inning or end of
e900: 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68   an index,.** th
e910: 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  en generate the 
e920: 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45  code for this SE
e930: 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20  LECT and return 
e940: 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e  1.  If this is n
e950: 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20  ot a .** simple 
e960: 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
e970: 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  uery, then retur
e980: 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d  n 0;.**.** A sim
e990: 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ply min() or max
e9a0: 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c  () query looks l
e9b0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
e9c0: 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29     SELECT min(a)
e9d0: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20   FROM table;.** 
e9e0: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29     SELECT max(a)
e9f0: 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a   FROM table;.**.
ea00: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79  ** The query may
ea10: 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
ea20: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73  gle table in its
ea30: 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20   FROM argument. 
ea40: 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65   There.** can be
ea50: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20   no GROUP BY or 
ea60: 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20  HAVING or WHERE 
ea70: 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65  clauses.  The re
ea80: 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a  sult set must.**
ea90: 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   be the min() or
eaa0: 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67   max() of a sing
eab0: 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  le column of the
eac0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c   table.  The col
ead0: 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69  umn.** in the mi
eae0: 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
eaf0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e  ction must be in
eb00: 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dexed..**.** The
eb10: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
eb20: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20  his routine are 
eb30: 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20  the same as for 
eb40: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 29 2e 0a  sqliteSelect()..
eb50: 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
eb60: 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
eb70: 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
eb80: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
eb90: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
eba0: 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
ebb0: 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
ebc0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
ebd0: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
ebe0: 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
ebf0: 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
ec00: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
ec10: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
ec20: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
ec30: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
ec40: 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
ec50: 0a 20 20 45 78 70 72 4c 69 73 74 20 65 4c 69 73  .  ExprList eLis
ec60: 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
ec70: 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49  List_item eListI
ec80: 74 65 6d 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  tem;..  /* Check
ec90: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
eca0: 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
ecb0: 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
ecc0: 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
ecd0: 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
ece0: 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
ecf0: 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
ed00: 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
ed10: 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
ed20: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
ed30: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
ed40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
ed50: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
ed60: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
ed70: 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
ed80: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
ed90: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
eda0: 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
edb0: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
edc0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  if( pExpr->pList
edd0: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
ede0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
edf0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
ee00: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
ee10: 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
ee20: 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43  if( sqliteStrNIC
ee30: 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  mp(pExpr->token.
ee40: 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b  z,"min",3)==0 ){
ee50: 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50  .    seekOp = OP
ee60: 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65  _Rewind;.  }else
ee70: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
ee80: 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
ee90: 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29  .z,"max",3)==0 )
eea0: 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
eeb0: 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  P_Last;.  }else{
eec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
eed0: 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 45 78   }.  pExpr = pEx
eee0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
eef0: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
ef00: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
ef10: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
ef20: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
ef30: 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20  olumn;.  pTab = 
ef40: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
ef50: 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ab;..  /* If we 
ef60: 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
ef70: 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
ef80: 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
ef90: 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
efa0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
efb0: 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
efc0: 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
efd0: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
efe0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
eff0: 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
f000: 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
f010: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
f020: 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
f030: 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
f040: 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
f050: 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
f060: 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
f070: 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
f080: 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
f090: 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
f0a0: 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
f0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
f0c0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
f0d0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f0e0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f0f0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
f100: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
f110: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
f120: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
f130: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
f140: 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
f150: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
f160: 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
f170: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
f180: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
f190: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  the callback.  T
f1a0: 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
f1b0: 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
f1c0: 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
f1d0: 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20  to a table or a 
f1e0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a  memory cell..  *
f1f0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * The column nam
f200: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
f210: 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69  been generated i
f220: 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  n the calling fu
f230: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76  nction..  */.  v
f240: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
f250: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f260: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
f270: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
f280: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
f290: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
f2a0: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 2d  Types(pParse, p-
f2b0: 3e 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74  >pSrc, p->pEList
f2c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
f2d0: 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20  erating code to 
f2e0: 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20  find the min or 
f2f0: 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61  the max.  Basica
f300: 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a  lly all we have.
f310: 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69    ** to do is fi
f320: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  nd the first or 
f330: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
f340: 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64  n the chosen ind
f350: 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65  ex.  If.  ** the
f360: 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
f370: 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45  is on the INTEGE
f380: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
f390: 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72  hen find the fir
f3a0: 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20  st.  ** or last 
f3b0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69  entry in the mai
f3c0: 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  n table..  */.  
f3d0: 73 71 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79  sqliteCodeVerify
f3e0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
f3f0: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73  Tab->iDb);.  bas
f400: 65 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  e = p->pSrc->a[0
f410: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c  ].iCursor;.  sql
f420: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f430: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
f440: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  ->iDb, 0);.  sql
f450: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f460: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62 61 73  OP_OpenRead, bas
f470: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  e, pTab->tnum);.
f480: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
f490: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
f4a0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
f4b0: 49 43 29 3b 0a 20 20 63 6f 6e 74 20 3d 20 73 71  IC);.  cont = sq
f4c0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
f4d0: 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78  l(v);.  if( pIdx
f4e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
f4f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65  eVdbeAddOp(v, se
f500: 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a  ekOp, base, 0);.
f510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
f520: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f530: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
f540: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
f550: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f560: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 62  , OP_OpenRead, b
f570: 61 73 65 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75  ase+1, pIdx->tnu
f580: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  m);.    sqliteVd
f590: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
f5a0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
f5b0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
f5c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f5d0: 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2b 31  , seekOp, base+1
f5e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
f5f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f600: 49 64 78 52 65 63 6e 6f 2c 20 62 61 73 65 2b 31  IdxRecno, base+1
f610: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
f620: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f630: 43 6c 6f 73 65 2c 20 62 61 73 65 2b 31 2c 20 30  Close, base+1, 0
f640: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
f650: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
f660: 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eTo, base, 0);. 
f670: 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
f680: 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
f690: 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
f6a0: 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
f6b0: 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
f6c0: 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
f6d0: 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
f6e0: 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
f6f0: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
f700: 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
f710: 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
f720: 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74  Parm, cont, cont
f730: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52  );.  sqliteVdbeR
f740: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63  esolveLabel(v, c
f750: 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 56 64  ont);.  sqliteVd
f760: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
f770: 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  ose, base, 0);. 
f780: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
f790: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f7a0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
f7b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f7c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
f7d0: 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
f7e0: 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
f7f0: 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
f800: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
f810: 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d   eDest and iParm
f820: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73  ..**.**     eDes
f830: 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65  t Value       Re
f840: 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
f850: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
f860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f880: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
f890: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
f8a0: 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
f8b0: 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
f8c0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
f8d0: 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
f8e0: 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
f8f0: 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
f900: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d  emory cell iParm
f910: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
f920: 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  et         Store
f930: 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
f940: 20 6f 66 20 61 20 74 61 62 6c 65 20 77 69 74 68   of a table with
f950: 20 63 75 72 73 6f 72 20 69 50 61 72 6d 0a 2a 2a   cursor iParm.**
f960: 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
f970: 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
f980: 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
f990: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
f9a0: 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  ble iParm.**.** 
f9b0: 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20      SRT_Except  
f9c0: 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c      Remove resul
f9d0: 74 73 20 66 6f 72 6d 20 74 68 65 20 74 65 6d 70  ts form the temp
f9e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
f9f0: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
fa00: 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
fa10: 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
fa20: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
fa30: 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  arm.**.** The ta
fa40: 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63  ble above is inc
fa50: 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69  omplete.  Additi
fa60: 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65  onal eDist value
fa70: 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a   have be added.*
fa80: 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d  * since this com
fa90: 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e  ment was written
faa0: 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65 63  .  See the selec
fab0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e  tInnerLoop() fun
fac0: 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63  ction for.** a c
fad0: 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20  omplete listing 
fae0: 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76  of the allowed v
faf0: 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
fb00: 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
fb10: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
fb20: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
fb30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
fb40: 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
fb50: 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
fb60: 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
fb70: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
fb80: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
fb90: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
fba0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
fbb0: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
fbc0: 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
fbd0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
fbe0: 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
fbf0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
fc00: 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
fc10: 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
fc20: 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
fc30: 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
fc40: 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
fc50: 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
fc60: 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
fc70: 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
fc80: 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
fc90: 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
fca0: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
fcb0: 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
fcc0: 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
fcd0: 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
fce0: 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
fcf0: 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
fd00: 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
fd10: 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
fd20: 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
fd30: 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
fd40: 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
fd50: 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
fd60: 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
fd70: 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
fd80: 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
fd90: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
fda0: 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
fdb0: 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
fdc0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
fdd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
fde0: 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
fdf0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
fe00: 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
fe10: 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
fe20: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
fe30: 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
fe40: 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
fe50: 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
fe90: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
fea0: 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
feb0: 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
fec0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
fed0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
fee0: 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
fef0: 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
ff00: 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
ff10: 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
ff20: 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
ff30: 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
ff40: 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
ff50: 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
ff60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ff70: 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
ff80: 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
ff90: 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
ffa0: 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
ffb0: 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
ffc0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
ffd0: 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
ffe0: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
fff0: 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
10000 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
10010 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
10020 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
10030 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
10040 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
10050 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
10060 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
10070 71 6c 69 74 65 53 65 6c 65 63 74 28 0a 20 20 50  qliteSelect(.  P
10080 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10090 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
100a0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
100b0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
100c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
100d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
100e0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
100f0 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
10100 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10110 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
10120 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
10130 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
10140 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d        /* A param
10150 65 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65  eter used by the
10160 20 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20   eDest disposal 
10170 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65  method */.  Sele
10180 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ct *pParent,    
10190 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
101a0 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74  LECT for which t
101b0 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65  his is a sub-que
101c0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ry */.  int pare
101d0 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  ntTab,         /
101e0 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65  * Index in pPare
101f0 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73  nt->pSrc of this
10200 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10210 2a 70 50 61 72 65 6e 74 41 67 67 20 20 20 20 20  *pParentAgg     
10220 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
10230 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65  arent uses aggre
10240 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
10250 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
10260 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
10270 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  o;.  Vdbe *v;.  
10280 69 6e 74 20 69 73 41 67 67 20 3d 20 30 3b 20 20  int isAgg = 0;  
10290 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
102a0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
102b0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
102c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
102d0 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
102e0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
102f0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
10300 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
10310 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
10320 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
10330 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
10340 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
10350 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
10360 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
10370 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
10380 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
10390 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
103a0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
103b0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
103c0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
103d0 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
103e0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
103f0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
10400 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
10410 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
10420 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
10430 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
10440 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
10450 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
10460 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
10470 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
10480 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
10490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
104a0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
104b0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
104c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
104d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
104e0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
104f0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
10500 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   */..  if( sqlit
10510 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
10520 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10530 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  || p==0 ) return
10540 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
10550 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10560 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
10570 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
10580 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rn 1;..  /* If t
10590 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
105a0 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
105b0 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
105c0 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
105d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
105e0 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
105f0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
10600 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
10610 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Parm);.  }..  /*
10620 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
10630 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
10640 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
10650 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
10660 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
10670 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
10680 68 65 72 65 3b 0a 20 20 70 4f 72 64 65 72 42 79  here;.  pOrderBy
10690 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
106a0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
106b0 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
106c0 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
106d0 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d  ;.  isDistinct =
106e0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
106f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 56  .  /* Allocate V
10700 44 42 45 20 63 75 72 73 6f 72 73 20 66 6f 72 20  DBE cursors for 
10710 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
10720 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
10730 2a 2f 0a 20 20 73 71 6c 69 74 65 53 72 63 4c 69  */.  sqliteSrcLi
10740 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
10750 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
10760 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  );..  /* .  ** D
10770 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
10780 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
10790 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
107a0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
107b0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
107c0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
107d0 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
107e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
107f0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
10800 65 6e 64 3b 0a 0a 20 20 2f 2a 20 45 78 70 61 6e  end;..  /* Expan
10810 64 20 61 6e 79 20 22 2a 22 20 74 65 72 6d 73 20  d any "*" terms 
10820 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
10830 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65  t.  (For example
10840 20 74 68 65 20 22 2a 22 20 69 6e 0a 20 20 2a 2a   the "*" in.  **
10850 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
10860 74 31 22 29 20 20 54 68 65 20 66 69 6c 6c 49 6e  t1")  The fillIn
10870 43 6f 6c 75 6d 6e 6c 69 73 74 28 29 20 72 6f 75  Columnlist() rou
10880 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 73  tine also does s
10890 6f 6d 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68  ome.  ** other h
108a0 6f 75 73 65 6b 65 65 70 69 6e 67 20 2d 20 73 65  ousekeeping - se
108b0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
108c0 6d 65 6e 74 20 66 6f 72 20 64 65 74 61 69 6c 73  ment for details
108d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 69 6c  ..  */.  if( fil
108e0 6c 49 6e 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 50  lInColumnList(pP
108f0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
10900 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
10910 0a 20 20 7d 0a 20 20 70 57 68 65 72 65 20 3d 20  .  }.  pWhere = 
10920 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 45 4c  p->pWhere;.  pEL
10930 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
10940 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
10950 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
10960 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
10970 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
10980 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
10990 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
109a0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
109b0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
109c0 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
109d0 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
109e0 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
109f0 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
10a00 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
10a10 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79  sg(pParse, "only
10a20 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
10a30 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20   allowed for ". 
10a40 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20        "a SELECT 
10a50 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
10a60 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  an expression");
10a70 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
10a80 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
10a90 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f  ORDER BY is igno
10aa0 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73  red for some des
10ab0 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  tinations..  */.
10ac0 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
10ad0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
10ae0 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65 20  Union:.    case 
10af0 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20 20  SRT_Except:.    
10b00 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72 64  case SRT_Discard
10b10 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  :.      pOrderBy
10b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
10b30 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
10b40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
10b50 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
10b60 6f 69 6e 74 2c 20 77 65 20 73 68 6f 75 6c 64 20  oint, we should 
10b70 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  have allocated a
10b80 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  ll the cursors t
10b90 68 61 74 20 77 65 0a 20 20 2a 2a 20 6e 65 65 64  hat we.  ** need
10ba0 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 62 71 75   to handle subqu
10bb0 65 72 79 73 20 61 6e 64 20 74 65 6d 70 6f 72 61  erys and tempora
10bc0 72 79 20 74 61 62 6c 65 73 2e 20 20 0a 20 20 2a  ry tables.  .  *
10bd0 2a 0a 20 20 2a 2a 20 52 65 73 6f 6c 76 65 20 74  *.  ** Resolve t
10be0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
10bf0 61 6e 64 20 64 6f 20 61 20 73 65 6d 61 6e 74 69  and do a semanti
10c00 63 73 20 63 68 65 63 6b 20 6f 6e 20 61 6c 6c 20  cs check on all 
10c10 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  the expressions.
10c20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
10c30 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
10c40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10c50 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
10c60 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
10c70 62 4c 69 73 74 2c 20 30 2c 20 70 45 4c 69 73 74  bList, 0, pEList
10c80 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
10c90 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
10ca0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
10cb0 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
10cc0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
10cd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10ce0 2c 20 31 2c 20 26 69 73 41 67 67 29 20 29 7b 0a  , 1, &isAgg) ){.
10cf0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
10d00 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_end;.    }.  }
10d10 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 29 7b  .  if( pWhere ){
10d20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
10d30 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
10d40 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
10d50 70 45 4c 69 73 74 2c 20 70 57 68 65 72 65 29 20  pEList, pWhere) 
10d60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
10d70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
10d80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
10d90 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
10da0 70 57 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b  pWhere, 0, 0) ){
10db0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
10dc0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
10dd0 20 20 73 71 6c 69 74 65 4f 72 61 63 6c 65 38 4a    sqliteOracle8J
10de0 6f 69 6e 46 69 78 75 70 28 70 54 61 62 4c 69 73  oinFixup(pTabLis
10df0 74 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a  t, pWhere);.  }.
10e00 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
10e10 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
10e20 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
10e30 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
10e40 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59  rse, "a GROUP BY
10e50 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69   clause is requi
10e60 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e  red before HAVIN
10e70 47 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  G");.      goto 
10e80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10e90 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
10ea0 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
10eb0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
10ec0 20 70 45 4c 69 73 74 2c 20 70 48 61 76 69 6e 67   pEList, pHaving
10ed0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
10ee0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10ef0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
10f00 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
10f10 2c 20 70 48 61 76 69 6e 67 2c 20 31 2c 20 26 69  , pHaving, 1, &i
10f20 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 67  sAgg) ){.      g
10f30 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
10f40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10f50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10f60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
10f70 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
10f80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
10f90 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
10fa0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
10fb0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
10fc0 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  f( sqliteExprIsI
10fd0 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
10fe0 29 20 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69  ) && iCol>0 && i
10ff0 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
11000 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
11010 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
11020 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d  E);.        pE =
11030 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
11040 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78  pExpr = sqliteEx
11050 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
11060 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a  iCol-1].pExpr);.
11070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11080 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
11090 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
110a0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
110b0 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pE) ){.        
110c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
110d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
110e0 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
110f0 63 6b 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69  ck(pParse, pE, i
11100 73 41 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20  sAgg, 0) ){.    
11110 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
11120 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11130 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
11140 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20  rIsConstant(pE) 
11150 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11160 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
11170 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30  er(pE, &iCol)==0
11180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11190 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
111a0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
111b0 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
111c0 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
111d0 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
111e0 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nts");.         
111f0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
11200 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11210 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
11220 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
11230 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
11240 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
11250 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
11260 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 63 6f      "ORDER BY co
11270 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
11280 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
11290 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
112a0 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
112b0 31 20 61 6e 64 20 25 64 22 2c 20 69 43 6f 6c 2c  1 and %d", iCol,
112c0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
112d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
112e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
112f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11300 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 47    }.  }.  if( pG
11310 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 66 6f  roupBy ){.    fo
11320 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
11330 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
11340 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
11350 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
11360 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
11370 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
11380 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
11390 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
113a0 26 26 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f  && iCol>0 && iCo
113b0 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l<=pEList->nExpr
113c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
113d0 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  teExprDelete(pE)
113e0 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
113f0 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
11400 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
11410 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
11420 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
11430 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11440 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
11450 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
11460 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  bList, pEList, p
11470 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  E) ){.        go
11480 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
11490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
114a0 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
114b0 28 70 50 61 72 73 65 2c 20 70 45 2c 20 69 73 41  (pParse, pE, isA
114c0 67 67 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  gg, 0) ){.      
114d0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
114e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
114f0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49   if( sqliteExprI
11500 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
11510 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
11520 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72  iteExprIsInteger
11530 28 70 45 2c 20 26 69 43 6f 6c 29 3d 3d 30 20 29  (pE, &iCol)==0 )
11540 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11550 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
11560 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e,.            "
11570 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 6d  GROUP BY terms m
11580 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69  ust not be non-i
11590 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73  nteger constants
115a0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ");.          go
115b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
115c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
115d0 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
115e0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
115f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11600 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
11610 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
11620 22 47 52 4f 55 50 20 42 59 20 63 6f 6c 75 6d 6e  "GROUP BY column
11630 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
11640 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
11650 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
11660 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
11670 64 20 25 64 22 2c 20 69 43 6f 6c 2c 20 70 45 4c  d %d", iCol, pEL
11680 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
11690 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
116a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
116b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
116c0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
116d0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
116e0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
116f0 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
11700 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
11710 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
11720 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
11730 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
11740 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
11750 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62   them in a callb
11760 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
11770 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
11780 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
11790 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f   going to some o
117a0 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e  ther destination
117b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
117c0 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
117d0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
117e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
117f0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
11800 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
11810 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
11820 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
11830 70 68 72 61 73 65 20 22 4c 49 4d 49 54 20 30 22  phrase "LIMIT 0"
11840 20 6d 65 61 6e 73 20 61 6c 6c 20 72 6f 77 73 20   means all rows 
11850 61 72 65 20 73 68 6f 77 6e 2c 20 6e 6f 74 20 7a  are shown, not z
11860 65 72 6f 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 49  ero rows..  ** I
11870 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
11880 20 69 73 20 70 2d 3e 6e 4c 69 6d 69 74 3c 3d 30   is p->nLimit<=0
11890 20 74 68 65 6e 20 22 4c 49 4d 49 54 20 30 22 20   then "LIMIT 0" 
118a0 73 68 6f 77 73 0a 20 20 2a 2a 20 61 6c 6c 20 72  shows.  ** all r
118b0 6f 77 73 2e 20 20 49 74 20 69 73 20 74 68 65 20  ows.  It is the 
118c0 73 61 6d 65 20 61 73 20 6e 6f 20 6c 69 6d 69 74  same as no limit
118d0 2e 20 49 66 20 74 68 65 20 63 6f 6d 70 61 72 69  . If the compari
118e0 73 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 70 2d 3e  sion is.  ** p->
118f0 6e 4c 69 6d 69 74 3c 30 20 74 68 65 6e 20 22 4c  nLimit<0 then "L
11900 49 4d 49 54 20 30 22 20 73 68 6f 77 20 6e 6f 20  IMIT 0" show no 
11910 72 6f 77 73 20 61 74 20 61 6c 6c 2e 0a 20 20 2a  rows at all..  *
11920 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
11930 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
11940 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
11950 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65  me.  ** contrave
11960 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
11970 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
11980 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
11990 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
119a0 61 74 20 75 70 20 75 6e 74 69 6c 20 74 68 69 73  at up until this
119b0 20 70 6f 69 6e 74 2c 20 74 68 65 20 6e 4c 69 6d   point, the nLim
119c0 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68  it and nOffset h
119d0 6f 6c 64 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d  old.  ** the num
119e0 65 72 69 63 20 76 61 6c 75 65 73 20 6f 66 20 74  eric values of t
119f0 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
11a00 73 65 74 20 74 68 61 74 20 61 70 70 65 61 72 65  set that appeare
11a10 64 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 72  d in.  ** the or
11a20 69 67 69 6e 61 6c 20 53 51 4c 2e 20 20 41 66 74  iginal SQL.  Aft
11a30 65 72 20 74 68 69 73 20 63 6f 64 65 2c 20 74 68  er this code, th
11a40 65 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66  e nLimit and nOf
11a50 66 73 65 74 20 68 6f 6c 64 0a 20 20 2a 2a 20 74  fset hold.  ** t
11a60 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
11a70 65 72 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 75  er of counters u
11a80 73 65 64 20 74 6f 20 74 72 61 63 6b 20 74 68 65  sed to track the
11a90 20 6c 69 6d 69 74 20 61 6e 64 0a 20 20 2a 2a 20   limit and.  ** 
11aa0 6f 66 66 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  offset..  */.  i
11ab0 66 28 20 70 2d 3e 6e 4c 69 6d 69 74 3c 30 20 29  f( p->nLimit<0 )
11ac0 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20  {.    p->nLimit 
11ad0 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
11ae0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
11af0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
11b00 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11b10 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
11b20 20 2d 70 2d 3e 6e 4c 69 6d 69 74 2c 20 30 29 3b   -p->nLimit, 0);
11b30 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
11b40 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
11b50 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
11b60 20 20 20 70 2d 3e 6e 4c 69 6d 69 74 20 3d 20 69     p->nLimit = i
11b70 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Mem;.  }.  if( p
11b80 2d 3e 6e 4f 66 66 73 65 74 3c 3d 30 20 29 7b 0a  ->nOffset<=0 ){.
11b90 20 20 20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 3d      p->nOffset =
11ba0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11bb0 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
11bc0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
11bd0 69 66 28 20 69 4d 65 6d 3d 3d 30 20 29 20 69 4d  if( iMem==0 ) iM
11be0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
11bf0 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  m++;.    sqliteV
11c00 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11c10 6e 74 65 67 65 72 2c 20 2d 70 2d 3e 6e 4f 66 66  nteger, -p->nOff
11c20 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  set, 0);.    sql
11c30 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11c40 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
11c50 6d 2c 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f  m, 1);.    p->nO
11c60 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
11c70 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
11c80 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  r the special ca
11c90 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72  se of a min() or
11ca0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
11cb0 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69  by itself.  ** i
11cc0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
11cd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d  ..  */.  if( sim
11ce0 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70  pleMinMaxQuery(p
11cf0 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
11d00 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72   iParm) ){.    r
11d10 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 0;.    goto 
11d20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
11d30 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
11d40 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
11d50 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
11d60 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
11d70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
11d80 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
11d90 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
11da0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
11db0 74 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 65  text;.    int ne
11dc0 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
11dd0 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c  ;..    if( pTabL
11de0 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  ist->a[i].pSelec
11df0 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
11e00 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73  .    if( pTabLis
11e10 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30  t->a[i].zName!=0
11e20 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
11e30 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
11e40 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
11e50 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
11e60 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
11e70 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
11e80 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65  zName;.      nee
11e90 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
11ea0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
11eb0 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
11ec0 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  eContext = 0;.  
11ed0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65    }.    sqliteSe
11ee0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
11ef0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
11f00 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62  ect, SRT_TempTab
11f10 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
11f20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
11f30 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c  a[i].iCursor, p,
11f40 20 69 2c 20 26 69 73 41 67 67 29 3b 0a 20 20 20   i, &isAgg);.   
11f50 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65   if( needRestore
11f60 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20  Context ){.     
11f70 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
11f80 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
11f90 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d  thContext;.    }
11fa0 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
11fb0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68  p->pSrc;.    pWh
11fc0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
11fd0 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d  .    if( eDest!=
11fe0 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65  SRT_Union && eDe
11ff0 73 74 21 3d 53 52 54 5f 45 78 63 65 70 74 20 26  st!=SRT_Except &
12000 26 20 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  & eDest!=SRT_Dis
12010 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 70 4f  card ){.      pO
12020 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
12030 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erBy;.    }.    
12040 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
12050 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76  roupBy;.    pHav
12060 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
12070 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74  ;.    isDistinct
12080 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
12090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
120a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
120b0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
120c0 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
120d0 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
120e0 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
120f0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
12100 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
12110 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
12120 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
12130 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26  .  if( pParent &
12140 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a  & pParentAgg &&.
12150 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62        flattenSub
12160 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50  query(pParse, pP
12170 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
12180 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69  , *pParentAgg, i
12190 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28  sAgg) ){.    if(
121a0 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e   isAgg ) *pParen
121b0 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 72 65  tAgg = 1;.    re
121c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
121d0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
121e0 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77  mn types if we w
121f0 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 61 20 63  ill be using a c
12200 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
12210 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
12220 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
12230 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20  t is going to a 
12240 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
12250 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 63 61  r.  ** than a ca
12260 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  llback..  **.  *
12270 2a 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20  * We have to do 
12280 74 68 69 73 20 73 65 70 61 72 61 74 65 6c 79 20  this separately 
12290 66 72 6f 6d 20 74 68 65 20 63 72 65 61 74 69 6f  from the creatio
122a0 6e 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  n of column name
122b0 73 0a 20 20 2a 2a 20 61 62 6f 76 65 20 62 65 63  s.  ** above bec
122c0 61 75 73 65 20 69 66 20 74 68 65 20 70 54 61 62  ause if the pTab
122d0 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 76 69  List contains vi
122e0 65 77 73 20 74 68 65 6e 20 74 68 65 79 20 77 69  ews then they wi
122f0 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 68 61 76 65  ll not.  ** have
12300 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 20 61   been resolved a
12310 6e 64 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 6b  nd we will not k
12320 6e 6f 77 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  now the column t
12330 79 70 65 73 20 75 6e 74 69 6c 0a 20 20 2a 2a 20  ypes until.  ** 
12340 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
12350 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
12360 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
12370 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
12380 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
12390 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
123a0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
123b0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
123c0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
123d0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
123e0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
123f0 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
12400 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
12410 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12420 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
12430 72 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rm, 0);.  }..  /
12440 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  * Do an analysis
12450 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65 78   of aggregate ex
12460 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
12470 20 20 73 71 6c 69 74 65 41 67 67 72 65 67 61 74    sqliteAggregat
12480 65 49 6e 66 6f 52 65 73 65 74 28 70 50 61 72 73  eInfoReset(pPars
12490 65 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20  e);.  if( isAgg 
124a0 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  || pGroupBy ){. 
124b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
124c0 65 2d 3e 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20  e->nAgg==0 );.  
124d0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
124e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
124f0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12500 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12510 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
12520 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
12530 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
12540 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  r) ){.        go
12550 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12570 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
12580 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12590 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
125a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
125b0 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 41   if( sqliteExprA
125c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
125d0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
125e0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  y->a[i].pExpr) )
125f0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
12600 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
12610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12620 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
12630 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 45 78  ving && sqliteEx
12640 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
12650 74 65 73 28 70 50 61 72 73 65 2c 20 70 48 61 76  tes(pParse, pHav
12660 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ing) ){.      go
12670 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
12680 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72     }.    if( pOr
12690 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66  derBy ){.      f
126a0 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
126b0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
126c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
126d0 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
126e0 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
126f0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
12700 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
12710 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
12720 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
12730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12740 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65  ..  /* Reset the
12750 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f   aggregator.  */
12760 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
12770 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
12780 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73  dOp(v, OP_AggRes
12790 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  et, 0, pParse->n
127a0 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Agg);.    for(i=
127b0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
127c0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  g; i++){.      F
127d0 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20  uncDef *pFunc;. 
127e0 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20       if( (pFunc 
127f0 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
12800 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70  ].pFunc)!=0 && p
12810 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  Func->xFinalize!
12820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
12830 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12840 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 30 2c 20   OP_AggInit, 0, 
12850 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i);.        sqli
12860 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
12870 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 46 75  , -1, (char*)pFu
12880 6e 63 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  nc, P3_POINTER);
12890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
128a0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
128b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
128c0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
128d0 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
128e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
128f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
12900 46 6f 63 75 73 2c 20 30 2c 20 30 29 3b 0a 20 20  Focus, 0, 0);.  
12910 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e    }.  }..  /* In
12920 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
12930 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c  ory cell to NULL
12940 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
12950 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
12960 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12970 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
12980 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12990 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
129a0 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
129b0 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
129c0 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
129d0 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   table to use fo
129e0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
129f0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  et..  */.  if( i
12a00 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
12a10 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
12a20 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12a30 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12a40 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
12a50 64 69 73 74 69 6e 63 74 2c 20 31 29 3b 0a 20 20  distinct, 1);.  
12a60 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
12a70 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  nct = -1;.  }.. 
12a80 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
12a90 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f  tabase scan.  */
12aa0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
12ab0 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  teWhereBegin(pPa
12ac0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
12ad0 57 68 65 72 65 2c 20 30 2c 20 0a 20 20 20 20 20  Where, 0, .     
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
12b00 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29  ? 0 : &pOrderBy)
12b10 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
12b20 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
12b30 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74  end;..  /* Use t
12b40 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
12b50 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65  r loop if we are
12b60 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74   not dealing wit
12b70 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  h.  ** aggregate
12b80 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  s.  */.  if( !is
12b90 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  Agg ){.    if( s
12ba0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
12bb0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
12bc0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
12bd0 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
12be0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
12bf0 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57         iParm, pW
12c00 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
12c10 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
12c20 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20   ){.       goto 
12c30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
12c40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
12c50 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
12c60 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74  th aggregates, t
12c70 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69  hen do the speci
12c80 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a  al aggregate.  *
12c90 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a  * processing.  .
12ca0 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
12cb0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
12cc0 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 31 3b  .      int lbl1;
12cd0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12ce0 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
12cf0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
12d00 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
12d10 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
12d20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
12d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12d40 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12d50 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 47 72 6f  OP_MakeKey, pGro
12d60 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  upBy->nExpr, 0);
12d70 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
12d80 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e->db->file_form
12d90 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64  at>=4 ) sqliteAd
12da0 64 4b 65 79 54 79 70 65 28 76 2c 20 70 47 72 6f  dKeyType(v, pGro
12db0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 6c 62 6c  upBy);.      lbl
12dc0 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  1 = sqliteVdbeMa
12dd0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
12de0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12df0 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f 63 75 73  p(v, OP_AggFocus
12e00 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  , 0, lbl1);.    
12e10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
12e20 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b  rse->nAgg; i++){
12e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
12e40 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
12e50 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
12e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
12e70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 50  rCode(pParse, pP
12e80 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
12e90 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
12ea0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
12eb0 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69   OP_AggSet, 0, i
12ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12ed0 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
12ee0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29  veLabel(v, lbl1)
12ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
12f00 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
12f10 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
12f20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
12f30 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
12f40 28 20 21 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  ( !pParse->aAgg[
12f50 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
12f60 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  nue;.      pE = 
12f70 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
12f80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
12f90 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pE->op==TK_
12fa0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
12fb0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c        if( pE->pL
12fc0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ist ){.        f
12fd0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 2d 3e 70 4c  or(j=0; j<pE->pL
12fe0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
12ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
13000 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
13010 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61 5b  e, pE->pList->a[
13020 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
13030 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13040 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
13050 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
13060 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , i, 0);.      s
13070 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
13080 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c  , OP_AggFunc, 0,
13090 20 70 45 2d 3e 70 4c 69 73 74 20 3f 20 70 45 2d   pE->pList ? pE-
130a0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
130b0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
130c0 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  ( pParse->aAgg[i
130d0 5d 2e 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20  ].pFunc!=0 );.  
130e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
130f0 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e  se->aAgg[i].pFun
13100 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20  c->xStep!=0 );. 
13110 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
13120 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
13130 63 68 61 72 2a 29 70 50 61 72 73 65 2d 3e 61 41  char*)pParse->aA
13140 67 67 5b 69 5d 2e 70 46 75 6e 63 2c 20 50 33 5f  gg[i].pFunc, P3_
13150 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 0a  POINTER);.    }.
13160 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68    }..  /* End th
13170 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
13180 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  loop..  */.  sql
13190 69 74 65 57 68 65 72 65 45 6e 64 28 70 57 49 6e  iteWhereEnd(pWIn
131a0 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  fo);..  /* If we
131b0 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20   are processing 
131c0 61 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e  aggregates, we n
131d0 65 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20  eed to set up a 
131e0 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a  second loop.  **
131f0 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
13200 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65   aggregate value
13210 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68  s and process th
13220 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  em..  */.  if( i
13230 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  sAgg ){.    int 
13240 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 56  endagg = sqliteV
13250 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
13260 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67  .    int startag
13270 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20  g;.    startagg 
13280 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
13290 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c  p(v, OP_AggNext,
132a0 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20   0, endagg);.   
132b0 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
132c0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 48 61  = 1;.    if( pHa
132d0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
132e0 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28  liteExprIfFalse(
132f0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
13300 20 73 74 61 72 74 61 67 67 2c 20 31 29 3b 0a 20   startagg, 1);. 
13310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 6c     }.    if( sel
13320 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
13330 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
13340 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
13350 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c  distinct, eDest,
13360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13370 20 20 20 20 20 69 50 61 72 6d 2c 20 73 74 61 72       iParm, star
13380 74 61 67 67 2c 20 65 6e 64 61 67 67 29 20 29 7b  tagg, endagg) ){
13390 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
133a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
133b0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
133c0 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
133d0 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20   startagg);.    
133e0 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
133f0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67  eLabel(v, endagg
13400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
13410 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f  eAddOp(v, OP_Noo
13420 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  p, 0, 0);.    pP
13430 61 72 73 65 2d 3e 75 73 65 41 67 67 20 3d 20 30  arse->useAgg = 0
13440 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
13450 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
13460 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
13470 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
13480 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
13490 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
134a0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
134b0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
134c0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
134d0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
134e0 6f 72 74 54 61 69 6c 28 70 2c 20 76 2c 20 70 45  ortTail(p, v, pE
134f0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65  List->nExpr, eDe
13500 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a  st, iParm);.  }.
13510 0a 0a 20 20 2f 2a 20 49 73 73 75 65 20 61 20 6e  ..  /* Issue a n
13520 75 6c 6c 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ull callback if 
13530 74 68 61 74 20 69 73 20 77 68 61 74 20 74 68 65  that is what the
13540 20 75 73 65 72 20 77 61 6e 74 73 2e 0a 20 20 2a   user wants..  *
13550 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
13560 52 54 5f 43 61 6c 6c 62 61 63 6b 20 26 26 0a 20  RT_Callback &&. 
13570 20 20 20 28 70 50 61 72 73 65 2d 3e 75 73 65 43     (pParse->useC
13580 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c 7c 20 28 70  allback==0 || (p
13590 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
135a0 20 26 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61   & SQLITE_NullCa
135b0 6c 6c 62 61 63 6b 29 21 3d 30 29 0a 20 20 29 7b  llback)!=0).  ){
135c0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
135d0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 43  ddOp(v, OP_NullC
135e0 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73 74 2d  allback, pEList-
135f0 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a  >nExpr, 0);.  }.
13600 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
13610 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
13620 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
13630 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
13640 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
13650 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
13660 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
13670 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
13680 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
13690 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
136a0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
136b0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
136c0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
136d0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
136e0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71  select_end:.  sq
136f0 6c 69 74 65 41 67 67 72 65 67 61 74 65 49 6e 66  liteAggregateInf
13700 6f 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  oReset(pParse);.
13710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.