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

Artifact a324af36afe5f050a1e070806ad3ededf1d58f50:


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 32 34 33  select.c,v 1.243
0200: 20 32 30 30 35 2f 30 33 2f 32 38 20 30 33 3a 33   2005/03/28 03:3
0210: 39 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a 2a  9:56 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 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0440: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0470: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0480: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0490: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
04a0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
04b0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
04c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
04d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
04e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
04f0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0500: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0510: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0520: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0530: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0540: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0560: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0570: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0580: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
0590: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
05a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
05b0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
05c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
05d0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
05e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
05f0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0610: 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a  lete(pOrderBy);.
0620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0630: 65 6c 65 74 65 28 70 4c 69 6d 69 74 29 3b 0a 20  elete(pLimit);. 
0640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0650: 6c 65 74 65 28 70 4f 66 66 73 65 74 29 3b 0a 20  lete(pOffset);. 
0660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0670: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0680: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
06a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
06b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
06c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  0);.    }.    pN
06d0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
06e0: 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ist;.    pNew->p
06f0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
0700: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0710: 57 68 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d  Where;.    pNew-
0720: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0730: 75 70 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  upBy;.    pNew->
0740: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0750: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  g;.    pNew->pOr
0760: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
0770: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69  ;.    pNew->isDi
0780: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0790: 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  nct;.    pNew->o
07a0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
07b0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
07c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e  = pLimit;.    pN
07d0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
07e0: 66 66 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d  ffset;.    pNew-
07f0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
0800: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0810: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0820: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0830: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
0840: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
0850: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0860: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0870: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0880: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0890: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
08a0: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
08b0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
08c0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
08d0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
08e0: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
08f0: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0900: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0910: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0920: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0930: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0940: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0950: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0960: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0970: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0980: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0990: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
09a0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
09b0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
09c0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
09d0: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
09e0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
09f0: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a10: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a20: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0a30: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0a40: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0a50: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0a60: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0a70: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0a80: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0a90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0aa0: 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20   *zKeyword;.    
0ab0: 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20 75 38  u8 nChar;.    u8
0ac0: 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f   code;.  } keywo
0ad0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  rds[] = {.    { 
0ae0: 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54  "natural", 7, JT
0af0: 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20  _NATURAL },.    
0b00: 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20  { "left",    4, 
0b10: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
0b20: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74   },.    { "right
0b30: 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54  ",   5, JT_RIGHT
0b40: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0b50: 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c   { "full",    4,
0b60: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
0b70: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0b80: 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35    { "outer",   5
0b90: 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  , JT_OUTER },.  
0ba0: 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35    { "inner",   5
0bb0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20  , JT_INNER },.  
0bc0: 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35    { "cross",   5
0bd0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20  , JT_INNER },.  
0be0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
0bf0: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
0c00: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
0c10: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
0c20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
0c30: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
0c40: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
0c50: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
0c60: 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77  0; j<sizeof(keyw
0c70: 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79  ords)/sizeof(key
0c80: 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b  words[0]); j++){
0c90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
0ca0: 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68  =keywords[j].nCh
0cb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
0cc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
0cd0: 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b  (p->z, keywords[
0ce0: 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e  j].zKeyword, p->
0cf0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
0d00: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79   jointype |= key
0d10: 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  words[j].code;. 
0d20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
0d40: 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65  if( j>=sizeof(ke
0d50: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0d60: 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20  eywords[0]) ){. 
0d70: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0d80: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
0d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0da0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
0db0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
0dc0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
0dd0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
0de0: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
0df0: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
0e00: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
0e10: 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20 3d 20  st char *zSp1 = 
0e20: 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  " ";.    const c
0e30: 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b  har *zSp2 = " ";
0e40: 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30 20 29  .    if( pB==0 )
0e50: 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20 20 20  { zSp1++; }.    
0e60: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
0e70: 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  2++; }.    sqlit
0e80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
0e90: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
0ea0: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0eb0: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
0ec0: 25 54 25 73 25 54 25 73 25 54 22 2c 20 70 41 2c  %T%s%T%s%T", pA,
0ed0: 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70 32 2c   zSp1, pB, zSp2,
0ee0: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
0ef0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0f00: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74   }else if( joint
0f10: 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29  ype & JT_RIGHT )
0f20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0f30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
0f40: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
0f50: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
0f60: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0f70: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
0f80: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
0f90: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
0fa0: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
0fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0fc0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
0fd0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
0fe0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
0ff0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
1000: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1010: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1020: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1030: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1040: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1050: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1060: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1070: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1080: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1090: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
10a0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
10b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
10c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10e0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b  e value of a tok
10f0: 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d 74  en to a '\000'-t
1100: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
1110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1120: 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20   setToken(Token 
1130: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1140: 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a 3b 0a  z){.  p->z = z;.
1150: 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28    p->n = strlen(
1160: 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30  z);.  p->dyn = 0
1170: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
1180: 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48  a term to the WH
1190: 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ERE expression i
11a0: 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20 72  n *ppExpr that r
11b0: 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a  equires the.** z
11c0: 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  Col column to be
11d0: 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77   equal in the tw
11e0: 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20 61  o tables pTab1 a
11f0: 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61  nd pTab2..*/.sta
1200: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1210: 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63  eTerm(.  const c
1220: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20  har *zCol,      
1230: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1240: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
1250: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c  st Table *pTab1,
1260: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1270: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1280: 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20  char *zAlias1,  
1290: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
12a0: 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20 4d 61  first table.  Ma
12b0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  y be NULL */.  c
12c0: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
12d0: 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  2,      /* Secon
12e0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  d table */.  con
12f0: 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 32  st char *zAlias2
1300: 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66  ,     /* Alias f
1310: 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e  or second table.
1320: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1330: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
1340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1350: 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  dd the equality 
1360: 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70  term to this exp
1370: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
1380: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45  Token dummy;.  E
1390: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
13a0: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
13b0: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
13c0: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
13d0: 0a 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75  ..  setToken(&du
13e0: 6d 6d 79 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45  mmy, zCol);.  pE
13f0: 31 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1a = sqlite3Expr
1400: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1410: 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20  ummy);.  pE2a = 
1420: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1430: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1440: 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d  ;.  if( zAlias1=
1450: 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73  =0 ){.    zAlias
1460: 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  1 = pTab1->zName
1470: 3b 0a 20 20 7d 0a 20 20 73 65 74 54 6f 6b 65 6e  ;.  }.  setToken
1480: 28 26 64 75 6d 6d 79 2c 20 7a 41 6c 69 61 73 31  (&dummy, zAlias1
1490: 29 3b 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69  );.  pE1b = sqli
14a0: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
14b0: 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  , 0, &dummy);.  
14c0: 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29  if( zAlias2==0 )
14d0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20  {.    zAlias2 = 
14e0: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
14f0: 7d 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75  }.  setToken(&du
1500: 6d 6d 79 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  mmy, zAlias2);. 
1510: 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 45   pE2b = sqlite3E
1520: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1530: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 31 63   &dummy);.  pE1c
1540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
1550: 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31  K_DOT, pE1b, pE1
1560: 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20  a, 0);.  pE2c = 
1570: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
1580: 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20  OT, pE2b, pE2a, 
1590: 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74  0);.  pE = sqlit
15a0: 65 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70 45  e3Expr(TK_EQ, pE
15b0: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
15c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
15d0: 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
15e0: 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71  ;.  *ppExpr = sq
15f0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70  lite3ExprAnd(*pp
1600: 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a  Expr, pE);.}../*
1610: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1620: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1630: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1640: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1650: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1660: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1670: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
1680: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
1690: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
16a0: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
16b0: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
16c0: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
16d0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
16e0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
16f0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
1700: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
1710: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
1720: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
1730: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1740: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1750: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
1760: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
1770: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1780: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
1790: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
17a0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
17b0: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
17c0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
17d0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
17e0: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
17f0: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
1800: 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68  r(Expr *p){.  wh
1810: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
1820: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
1830: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1840: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
1850: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20  ->pLeft);.    p 
1860: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
1870: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
1880: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
1890: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
18a0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
18b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
18c0: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
18d0: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
18e0: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
18f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
1900: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
1910: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
1920: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
1930: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1940: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
1950: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
1960: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
1970: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
1980: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
1990: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
19a0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
19b0: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
19c0: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
19d0: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
19e0: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
19f0: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
1a00: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
1a10: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
1a20: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
1a30: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
1a40: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
1a50: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
1a60: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
1a70: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
1a80: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
1a90: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
1aa0: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
1ab0: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
1ac0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1ad0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
1ae0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1af0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1b00: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
1b10: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
1b20: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
1b30: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
1b40: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
1b50: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
1b80: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1b90: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
1ba0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1bc0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
1bd0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1be0: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
1bf0: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
1c00: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
1c10: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c20: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
1c30: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
1c40: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
1c50: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1c60: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
1c70: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
1c80: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
1c90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
1ca0: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
1cb0: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
1cc0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
1cd0: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
1ce0: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
1cf0: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
1d00: 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69  ht->pTab;..    i
1d10: 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  f( pLeftTab==0 |
1d20: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29  | pRightTab==0 )
1d30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
1d40: 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55  /* When the NATU
1d50: 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70  RAL keyword is p
1d60: 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52  resent, add WHER
1d70: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
1d80: 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
1d90: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
1da0: 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20  two tables have 
1db0: 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a  in common..    *
1dc0: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
1dd0: 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
1de0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
1df0: 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c  if( pLeft->pOn |
1e00: 7c 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20  | pLeft->pUsing 
1e10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e30: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
1e40: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
1e50: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
1e60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1e70: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
1e80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1e90: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
1ea0: 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e  0; j<pLeftTab->n
1eb0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1ec0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1ed0: 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b   pLeftTab->aCol[
1ee0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
1ef0: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
1f00: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
1f10: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1f20: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
1f30: 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62  (zName, pLeftTab
1f40: 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c  , pLeft->zAlias,
1f50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
1f80: 74 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70  t->zAlias, &p->p
1f90: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
1fa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1fb0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
1fc0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1fd0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
1fe0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
1ff0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  */.    if( pLeft
2000: 2d 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e  ->pOn && pLeft->
2010: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2020: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2030: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2040: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2050: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2060: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2070: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2080: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2090: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
20a0: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
20b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
20d0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
20e0: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
20f0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2100: 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a  ( pLeft->pOn ){.
2110: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
2120: 72 28 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20  r(pLeft->pOn);. 
2130: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
2140: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2150: 70 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66 74  p->pWhere, pLeft
2160: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c  ->pOn);.      pL
2170: 65 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  eft->pOn = 0;.  
2180: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2190: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
21a0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
21b0: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
21c0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
21d0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
21e0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
21f0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
2200: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
2210: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
2220: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
2230: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
2240: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
2250: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
2260: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2270: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
2280: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
2290: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
22a0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
22b0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
22c0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
22d0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
22e0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
22f0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
2300: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
2310: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
2320: 65 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  eft->pUsing ){. 
2330: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
2340: 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69  st = pLeft->pUsi
2350: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
2360: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
2370: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2380: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69  har *zName = pLi
2390: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
23a0: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
23b0: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62  mnIndex(pLeftTab
23c0: 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f  , zName)<0 || co
23d0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
23e0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b  Tab, zName)<0 ){
23f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2400: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2410: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
2420: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
2430: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
2440: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2450: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2460: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
2470: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2480: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2490: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
24a0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
24b0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
24c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
24e0: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
24f0: 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65  zAlias, &p->pWhe
2500: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
2530: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
2540: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
2550: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2560: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
2570: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2580: 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a  tDelete(Select *
2590: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
25a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
25b0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
25c0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
25d0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
25e0: 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  ete(p->pSrc);.  
25f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2600: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
2610: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2620: 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42  elete(p->pGroupB
2630: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y);.  sqlite3Exp
2640: 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69  rDelete(p->pHavi
2650: 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ng);.  sqlite3Ex
2660: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2670: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  pOrderBy);.  sql
2680: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
2690: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73  (p->pPrior);.  s
26a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26b0: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73  (p->pLimit);.  s
26c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26d0: 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20  (p->pOffset);.  
26e0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
26f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2700: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2710: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2720: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2730: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2740: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2750: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2760: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2770: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2780: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2790: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
27a0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
27b0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
27c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
27d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
27e0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
27f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2800: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
2810: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
2820: 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79 2d  ecord, pOrderBy-
2830: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71  >nExpr, 0);.  sq
2840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2850: 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30 2c  , OP_SortPut, 0,
2860: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   0);.}../*.** Ad
2870: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
2880: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 20 61  ent the OFFSET a
2890: 6e 64 20 4c 49 4d 49 54 0a 2a 2f 0a 73 74 61 74  nd LIMIT.*/.stat
28a0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4c 69 6d 69  ic void codeLimi
28b0: 74 65 72 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ter(.  Vdbe *v, 
28c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
28d0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
28e0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
28f0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
2900: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2910: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2920: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
2930: 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  inue,    /* Jump
2940: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
2950: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
2960: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
2970: 2c 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ,       /* Jump 
2980: 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65 20  here to end the 
2990: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  loop */.  int nP
29a0: 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  op          /* N
29b0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
29c0: 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68 65 6e  o pop stack when
29d0: 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20   jumping */.){. 
29e0: 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e   if( p->iOffset>
29f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
2a00: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2a10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
2a20: 20 33 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70   3;.    if( nPop
2a30: 3e 30 20 29 20 61 64 64 72 2b 2b 3b 0a 20 20 20  >0 ) addr++;.   
2a40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a50: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
2a60: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b   p->iOffset, 0);
2a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
2a90: 6d 50 6f 73 2c 20 70 2d 3e 69 4f 66 66 73 65 74  mPos, p->iOffset
2aa0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
2ab0: 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20   nPop>0 ){.     
2ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ad0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f  p(v, OP_Pop, nPo
2ae0: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p, 0);.    }.   
2af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b00: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
2b10: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
2b20: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2b30: 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20   "# skip OFFSET 
2b40: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 7d 0a  records"));.  }.
2b50: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
2b60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2b70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2b80: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69  _MemIncr, p->iLi
2b90: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
2ba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bb0: 2c 20 22 23 20 65 78 69 74 20 77 68 65 6e 20 4c  , "# exit when L
2bc0: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
2bd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2be0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2bf0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
2c00: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2c10: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2c20: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2c30: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2c40: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2c50: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2c60: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2c70: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2c80: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2c90: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2ca0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2cb0: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2cc0: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2cd0: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2ce0: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2cf0: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
2d00: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2d10: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2d20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2d30: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2d40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d60: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2d70: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d90: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2da0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2db0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2dc0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2dd0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2de0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2df0: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2e00: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2e10: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2e20: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2e30: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2e40: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2e50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2e60: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2e70: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2e80: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2e90: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2ea0: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2eb0: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2ec0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2ed0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2ee0: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2ef0: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2f00: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2f10: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2f20: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2f30: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2f40: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2f50: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2f60: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2f70: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2f80: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2f90: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2fa0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2fb0: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2fc0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2fd0: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2ff0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
3000: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
3010: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
3020: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
3030: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
3040: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
3050: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
3060: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3070: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3080: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
3090: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
30a0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
30b0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
30c0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20  is present */.. 
30d0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
30e0: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
30f0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
3100: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
3110: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
3120: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
3130: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
3140: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
3150: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
3160: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
3170: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
3180: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
3190: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
31a0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
31b0: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
31c0: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
31d0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
31e0: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
31f0: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
3200: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3210: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3220: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
3230: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
3240: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3250: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
3260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3270: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
3280: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
32a0: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
32b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
32c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
32d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
32e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
32f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3300: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3310: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3320: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3330: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3340: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3350: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3360: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3370: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3380: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3390: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
33a0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
33b0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
33c0: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
33d0: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
33e0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
33f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3400: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
3410: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
3420: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3430: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
3440: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65  #endif.    /* De
3450: 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65  liberately leave
3460: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
3470: 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20  ring off of the 
3480: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
3490: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a   OP_MakeRecord *
34a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
34b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
34c0: 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d  eRecord, pEList-
34d0: 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b  >nExpr * -1, 0);
34e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
34f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3500: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3510: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3520: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
3530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3540: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45  Op(v, OP_Pop, pE
3550: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30  List->nExpr+1, 0
3560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3570: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3580: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3590: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
35a0: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69  nt((v, "# skip i
35b0: 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64  ndistinct record
35c0: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
35d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
35e0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
35f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3600: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
3610: 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c  trKey, distinct,
3620: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   0);.    if( pOr
3630: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
3640: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
3650: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69   p, iContinue, i
3660: 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Break, nColumn);
3670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
3680: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 23  itch( eDest ){.#
3690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36a0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
36b0: 43 54 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  CT.    /* In thi
36c0: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
36d0: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
36e0: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
36f0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
3700: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
3710: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3720: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
3730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3740: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3750: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
3760: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
3770: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
3780: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3790: 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53  v, -1, aff, P3_S
37a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
37c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
37d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
37e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
37f0: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61  P_PutStrKey, iPa
3800: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
3810: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3820: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
3830: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
3840: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
3850: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
3860: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
3870: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
3880: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
3890: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
38a0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
38b0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
38c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
38d0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
38e0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
38f0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
3900: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3910: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
3920: 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57  Column, NULL_ALW
3930: 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20  AYS_DISTINCT);. 
3940: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3950: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
3960: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
3970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3980: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
3990: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
39a0: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
39b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
39c0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61  , OP_Delete, iPa
39d0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
39e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
39f0: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
3a00: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
3a10: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
3a20: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
3a30: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
3a40: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
3a50: 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20  empTable: {.    
3a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3a70: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3a80: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
3a90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3aa0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3ab0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3ac0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3ad0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3ae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3af0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3b00: 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d  _NewRecno, iParm
3b10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3b20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3b30: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
3b40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3b50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3b60: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
3b70: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
3b80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3b90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3ba0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
3bb0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
3bc0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
3bd0: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
3be0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
3bf0: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
3c00: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
3c10: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
3c20: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
3c30: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
3c40: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
3c50: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
3c60: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
3c70: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3c80: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
3c90: 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
3ca0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3cb0: 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  (v);.      int a
3cc0: 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73  ddr2;..      ass
3cd0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
3ce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3cf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3d00: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
3d10: 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  r1+3);.      sql
3d20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3d30: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
3d40: 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71        addr2 = sq
3d50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3d60: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
3d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3d80: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3d90: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3da0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3db0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3dc0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  {.        char a
3dd0: 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29  ff = (iParm>>16)
3de0: 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61  &0xFF;.        a
3df0: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
3e00: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
3e10: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
3e20: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71  aff);.        sq
3e30: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
3e40: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
3e50: 2c 20 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20  , 0, &aff, 1);. 
3e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3e80: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
3e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3ea0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3eb0: 53 74 72 4b 65 79 2c 20 28 69 50 61 72 6d 26 30  StrKey, (iParm&0
3ec0: 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a  x0000FFFF), 0);.
3ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
3ee0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3ef0: 32 28 76 2c 20 61 64 64 72 32 2c 20 73 71 6c 69  2(v, addr2, sqli
3f00: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3f10: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 62 72  dr(v));.      br
3f20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3f30: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
3f40: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
3f50: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
3f60: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
3f70: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
3f80: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
3f90: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
3fa0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
3fb0: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
3fc0: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
3fd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3fe0: 20 53 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20   SRT_Exists:.   
3ff0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
4000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4010: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4020: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4030: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
4040: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4050: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
4060: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4080: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
4090: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
40a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
40b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
40c0: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
40d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
40e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
40f0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
4100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4110: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
4120: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
4130: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
4140: 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
4150: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4160: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
4170: 54 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20  T_Sorter: {.    
4180: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
4190: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
41a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
41b0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
41c0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
41d0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
41e0: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
41f0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
4200: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
4210: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  rt( eDest==SRT_C
4220: 61 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  allback );.     
4230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4240: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4250: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4270: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4280: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 20 73 75 62   /* Invoke a sub
4290: 72 6f 75 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c  routine to handl
42a0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  e the results.  
42b0: 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  The subroutine i
42c0: 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20  tself.    ** is 
42d0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
42e0: 70 6f 70 70 69 6e 67 20 74 68 65 20 72 65 73 75  popping the resu
42f0: 6c 74 73 20 6f 66 66 20 6f 66 20 74 68 65 20 73  lts off of the s
4300: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
4310: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4320: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
4330: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4360: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
4370: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
4380: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4390: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
43a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
43b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
43c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
43d0: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
43e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
43f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
4400: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4410: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
4420: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
4430: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
4440: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
4450: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
4460: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
4470: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
4480: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
4490: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
44a0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
44b0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
44c0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
44d0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
44e0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
44f0: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
4500: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
4510: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
4520: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
4530: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
4540: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
4550: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
4560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4570: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4580: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4590: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
45a0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
45b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
45c0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
45d0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
45e0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
45f0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
4600: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
4610: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
4620: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
4630: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4640: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4650: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4660: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4670: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
4680: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
4690: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
46a0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
46b0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
46c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
46d0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
46e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
46f0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
4700: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4710: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
4720: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
4730: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
4740: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4750: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4760: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
4770: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4780: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
4790: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
47a0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
47b0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
47c0: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
47d0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
47e0: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
47f0: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
4800: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
4810: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
4820: 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d 20 73  {.  int end1 = s
4830: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4840: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e  bel(v);.  int en
4850: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
4860: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4870: 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65 79 49  int addr;.  KeyI
4880: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78  nfo *pInfo;.  Ex
4890: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
48a0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b  ;.  int nCol, i;
48b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
48c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
48d0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
48e0: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
48f0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
4900: 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f 6c  pOrderBy;.  nCol
4910: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
4920: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
4930: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4940: 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43 6f  of(*pInfo) + nCo
4950: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
4960: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
4970: 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  pInfo==0 ) retur
4980: 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  n;.  pInfo->aSor
4990: 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29  tOrder = (char*)
49a0: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43  &pInfo->aColl[nC
49b0: 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46  ol];.  pInfo->nF
49c0: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66  ield = nCol;.  f
49d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
49e0: 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  i++){.    /* If 
49f0: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
4a00: 65 6e 63 65 20 77 61 73 20 73 70 65 63 69 66 69  ence was specifi
4a10: 65 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74 68  ed explicity, th
4a20: 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  en it.    ** is 
4a30: 73 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65 72  stored in pOrder
4a40: 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20  By->a[i].zName. 
4a50: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
4a60: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  he default.    *
4a70: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
4a80: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
4a90: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
4aa0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
4ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
4ac0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72  lSeq(pParse, pOr
4ad0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
4ae0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 6e  r);.    if( !pIn
4af0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
4b00: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
4b10: 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c  ll[i] = db->pDfl
4b20: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
4b30: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
4b40: 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
4b50: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
4b60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4b70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  dbeOp3(v, OP_Sor
4b80: 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  t, 0, 0, (char*)
4b90: 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  pInfo, P3_KEYINF
4ba0: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61 64  O_HANDOFF);.  ad
4bb0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4bc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4bd0: 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Next, 0, end1);.
4be0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
4bf0: 20 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20   p, addr, end2, 
4c00: 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44  1);.  switch( eD
4c10: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
4c20: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
4c30: 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ase SRT_TempTabl
4c40: 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e: {.      sqlit
4c50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c60: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72  P_NewRecno, iPar
4c70: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
4c80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c90: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4cb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4cc0: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
4cd0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4ce0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
4cf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4d00: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
4d10: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
4d20: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4d30: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4d40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4d50: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
4d60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4d70: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
4d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d90: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
4da0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4dc0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
4dd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4de0: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
4df0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
4e00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4e10: 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53 54  1, 0, "n", P3_ST
4e20: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
4e30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4e40: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
4e50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4e60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4e70: 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50 61  _PutStrKey, (iPa
4e80: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
4e90: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4eb0: 53 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20 20  SRT_Exists:.    
4ec0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
4ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4ee0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4ef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f00: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
4f10: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4f40: 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20 20   0, end1);.     
4f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4f60: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52  ndif.    case SR
4f70: 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  T_Callback:.    
4f80: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
4f90: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
4fa0: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
4fb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4fc0: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c  _Integer, p->pEL
4fd0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  ist->nExpr, 0);.
4fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4ff0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
5000: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
5010: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
5020: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5040: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
5050: 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20   -1-i, i);.     
5060: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65   }.      if( eDe
5070: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
5080: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5090: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
50a0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
50b0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
50c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
50d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
50e0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
50f0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
5100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
5120: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 2, 0);.      b
5130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5140: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5150: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
5160: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
5170: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5180: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5190: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
51a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
51b0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
51c0: 6e 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nd2);.  sqlite3V
51d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
51e0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  op, 1, 0);.  sql
51f0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5200: 61 62 65 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20  abel(v, end1);. 
5210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5220: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65  p(v, OP_SortRese
5230: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
5240: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
5250: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
5260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
5270: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5280: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
5290: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
52a0: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
52b0: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
52c0: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
52d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 65  .**.** If the de
52e0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
52f0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
5300: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
5310: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a  extracted from.*
5320: 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 43  * the original C
5330: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5340: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
5350: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
5360: 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  umn..** .** The 
5370: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5380: 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69   for an expressi
5390: 6f 6e 20 69 73 20 65 69 74 68 65 72 20 54 45 58  on is either TEX
53a0: 54 2c 20 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e  T, NUMERIC or AN
53b0: 59 2e 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  Y..** The declar
53c0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
53d0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
53e0: 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74  INTEGER..*/.stat
53f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
5400: 6f 6c 75 6d 6e 54 79 70 65 28 4e 61 6d 65 43 6f  olumnType(NameCo
5410: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
5420: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
5430: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20   const *zType;. 
5440: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45   int j;.  if( pE
5450: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70  xpr==0 || pNC->p
5460: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
5470: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  urn 0;..  /* The
5480: 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20   TK_AS operator 
5490: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
54a0: 6e 20 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55  n ORDER BY, GROU
54b0: 50 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20  P BY, HAVING,.  
54c0: 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61  ** and LIMIT cla
54d0: 75 73 65 73 2e 20 20 42 75 74 20 70 45 78 70 72  uses.  But pExpr
54e0: 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
54f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5500: 20 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20   a.  ** SELECT. 
5510: 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65   So pExpr can ne
5520: 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41  ver contain an A
5530: 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  S operator..  */
5540: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
5550: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a  ->op!=TK_AS );..
5560: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
5570: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
5580: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
5590: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
55a0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   0;.      int iC
55b0: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
55c0: 75 6d 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  umn;.      while
55d0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
55e0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
55f0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
5600: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
5610: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
5620: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
5630: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
5640: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
5650: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
5660: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
5670: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
5680: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
5690: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
56a0: 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  b;.        }else
56b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
56c0: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
56d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
56e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
56f0: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
5700: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
5710: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
5720: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
5730: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
5740: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5750: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
5760: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
5770: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
5780: 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  GER";.      }els
5790: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  e{.        zType
57a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
57b0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
57c0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
57d0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
57e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
57f0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
5800: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 4e  ELECT: {.      N
5810: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
5820: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
5830: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
5840: 74 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  t;.      sNC.pSr
5850: 63 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  cList = pExpr->p
5860: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
5870: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
5880: 70 4e 43 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  pNC;.      zType
5890: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
58a0: 4e 43 2c 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  NC, pS->pEList->
58b0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a 20 20  a[0].pExpr); .  
58c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
58d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
58e0: 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79 70 65  ult:.      zType
58f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 72   = 0;.  }.  .  r
5900: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
5910: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
5920: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
5930: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
5940: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5950: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
5960: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
5970: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5980: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
5990: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
59a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
59b0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
59c0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
59d0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
59e0: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
59f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
5a00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
5a10: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
5a20: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
5a30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5a40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5a50: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
5a60: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
5a70: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
5a80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5a90: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
5aa0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
5ab0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
5ac0: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
5ad0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f  char *zType = co
5ae0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
5af0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65  );.    if( zType
5b00: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
5b10: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
5b20: 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f  must make it's o
5b30: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
5b40: 6f 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63  olumn-type, in c
5b50: 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ase the .    ** 
5b60: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
5b70: 62 65 66 6f 72 65 20 74 68 69 73 20 76 69 72 74  before this virt
5b80: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
5b90: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
5ba0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
5bb0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45  tColName(v, i+pE
5bc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79  List->nExpr, zTy
5bd0: 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65  pe, strlen(zType
5be0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
5bf0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5c00: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
5c10: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
5c20: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
5c30: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
5c40: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
5c50: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
5c60: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
5c70: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
5c80: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
5c90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
5ca0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
5cb0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5cc0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
5cd0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
5ce0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5cf0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
5d00: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
5d10: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
5d20: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
5d30: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
5d40: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
5d50: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5d60: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
5d70: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
5d80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5d90: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
5da0: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
5db0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5dc0: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
5dd0: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
5de0: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
5df0: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
5e00: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
5e10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
5e20: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
5e30: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
5e40: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
5e50: 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71  et || v==0 || sq
5e60: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
5e70: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
5e80: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
5e90: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
5ea0: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
5eb0: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
5ec0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
5ed0: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
5ee0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5ef0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
5f00: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
5f10: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
5f20: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
5f30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
5f40: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5f50: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
5f60: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
5f70: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
5f80: 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   p==0 ) continue
5f90: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
5fa0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
5fb0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
5fc0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
5fd0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
5fe0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
5ff0: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
6000: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
6010: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
6020: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6030: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
6040: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
6050: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
6060: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
6070: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
6080: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
6090: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
60a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
60b0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
60c0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
60d0: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
60e0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
60f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
6100: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
6110: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
6120: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
6130: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
6140: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
6150: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
6160: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
6170: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
6180: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
6190: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
61a0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
61b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61c0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
61d0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
61e0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
61f0: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
6200: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26   && !fullNames &
6210: 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  & p->span.z && p
6220: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
6230: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6240: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
6250: 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  i, p->span.z, p-
6260: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
6270: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
6280: 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61  mes || (!shortNa
6290: 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d  mes && pTabList-
62a0: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
62b0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
62c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
62d0: 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20  r *zTab;. .     
62e0: 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69     zTab = pTabLi
62f0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b  st->a[j].zAlias;
6300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c  .        if( ful
6310: 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d  lNames || zTab==
6320: 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d  0 ) zTab = pTab-
6330: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
6340: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
6350: 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22  (&zName, zTab, "
6360: 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  .", zCol, 0);.  
6370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6380: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6390: 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41  , zName, P3_DYNA
63a0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
63b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
63c0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
63d0: 28 76 2c 20 69 2c 20 7a 43 6f 6c 2c 20 73 74 72  (v, i, zCol, str
63e0: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
63f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
6400: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
6410: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
6420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6430: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
6440: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
6450: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a  pan.n);.      /*
6460: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70   sqlite3VdbeComp
6470: 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64  ressSpace(v, add
6480: 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  r); */.    }else
6490: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61  {.      char zNa
64a0: 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73  me[30];.      as
64b0: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
64c0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69  COLUMN || pTabLi
64d0: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  st==0 );.      s
64e0: 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63  printf(zName, "c
64f0: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
6500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6510: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6520: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
6530: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
6540: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
6550: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
6560: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64  EList);.}..#ifnd
6570: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
6580: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
6590: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
65a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
65b0: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
65c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
65d0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
65e0: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
65f0: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
6600: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
6610: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
6620: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
6630: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
6640: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6650: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
6660: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
6670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6680: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
6690: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
66a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
66b0: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
66c0: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
66d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
66e0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
66f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6700: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6710: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  T */../*.** Forw
6720: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
6730: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
6740: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
6750: 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a  se*, Select*);..
6760: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
6770: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
6780: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
6790: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
67a0: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
67b0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
67c0: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
67d0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
67e0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
67f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
6800: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65  ar *zTabName, Se
6810: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6820: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
6830: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
6840: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
6850: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
6860: 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65  pCol;..  if( pre
6870: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
6880: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
6890: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
68a0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  }.  if( sqlite3S
68b0: 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
68c0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
68d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
68e0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
68f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
6900: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
6910: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
6920: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6930: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
6940: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
6950: 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d  teStrDup(zTabNam
6960: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
6970: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
6980: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
6990: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
69a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
69b0: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
69c0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
69d0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
69e0: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
69f0: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
6a00: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
6a10: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
6a20: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
6a30: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
6a40: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
6a50: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
6a60: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
6a70: 61 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20  ar *zBasename;. 
6a80: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
6a90: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
6aa0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74  .    .    /* Get
6ab0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
6ac0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
6ad0: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
6ae0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
6af0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
6b00: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
6b10: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
6b20: 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ken.z==0 || p->p
6b30: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
6b40: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
6b50: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
6b60: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
6b70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
6b80: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
6b90: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
6ba0: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
6bb0: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
6bc0: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
6bd0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
6be0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
6bf0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44   if( p->op==TK_D
6c00: 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OT .            
6c10: 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67    && (pR=p->pRig
6c20: 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f  ht)!=0 && pR->to
6c30: 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b  ken.z && pR->tok
6c40: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
6c50: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
6c60: 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20  of the from A.B 
6c70: 75 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d  use B as the nam
6c80: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
6c90: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
6ca0: 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b  f("%T", &pR->tok
6cb0: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  en);.    }else i
6cc0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
6cd0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
6ce0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
6cf0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
6d00: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
6d10: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
6d20: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
6d30: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
6d40: 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70  ntf("%T", &p->sp
6d50: 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  an);.    }else{.
6d60: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
6d70: 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65  else fails, make
6d80: 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20   up a name */.  
6d90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
6da0: 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75  te3MPrintf("colu
6db0: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
6dc0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
6dd0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
6de0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
6df0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
6e00: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6e10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
6e20: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
6e30: 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  (0, pTab);.     
6e40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6e50: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
6e60: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
6e70: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
6e80: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
6e90: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
6ea0: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
6eb0: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
6ec0: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
6ed0: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
6ee0: 20 20 20 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20      zBasename = 
6ef0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a  zName;.    for(j
6f00: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
6f10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
6f20: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
6f30: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
6f40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6f50: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
6f60: 50 72 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20  Printf("%s:%d", 
6f70: 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74  zBasename, ++cnt
6f80: 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  );.        j = -
6f90: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
6fa0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
6fb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6fc0: 20 20 20 69 66 28 20 7a 42 61 73 65 6e 61 6d 65     if( zBasename
6fd0: 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  !=zName ){.     
6fe0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 61 73   sqliteFree(zBas
6ff0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
7000: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
7010: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
7020: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
7030: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
7040: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
7050: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
7060: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
7070: 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 53 72    */.    sNC.pSr
7080: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
7090: 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65  >pSrc;.    zType
70a0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
70b0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
70c0: 20 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e   p));.    pCol->
70d0: 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20  zType = zType;. 
70e0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
70f0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
7100: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
7110: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  pCol->pColl = sq
7120: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
7130: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
7140: 20 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c   if( !pCol->pCol
7150: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  l ){.      pCol-
7160: 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d  >pColl = pParse-
7170: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
7180: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
7190: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
71a0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
71b0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
71c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
71d0: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
71e0: 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c  by doing the fol
71f0: 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73  lowing.** things
7200: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
7210: 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
7220: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
7230: 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
7240: 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
7250: 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
7260: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
7270: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
7280: 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
7290: 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
72a0: 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
72b0: 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
72c0: 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
72d0: 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
72e0: 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
72f0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
7300: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
7310: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
7320: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
7330: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
7340: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
7350: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
7360: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
7370: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
7380: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
7390: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
73a0: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
73b0: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
73c0: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
73d0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
73e0: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
73f0: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
7400: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
7410: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
7420: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
7430: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
7440: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
7450: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
7460: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
7470: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
7480: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
7490: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
74a0: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
74b0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
74c0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
74d0: 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
74e0: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
74f0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
7500: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
7510: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
7520: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
7530: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
7540: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
7550: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
7560: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
7570: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
7580: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
7590: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
75a0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
75b0: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
75c0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
75d0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
75e0: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
75f0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
7600: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
7610: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
7620: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
7630: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
7640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7650: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
7660: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
7670: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
7680: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
7690: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
76a0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
76b0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
76c0: 54 61 62 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Tab;.  struct Sr
76d0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
76e0: 6d 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  m;..  if( p==0 |
76f0: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  | p->pSrc==0 || 
7700: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
7710: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
7720: 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
7730: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
7740: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
7750: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
7760: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
7770: 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
7780: 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
7790: 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
77a0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
77b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
77c0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
77d0: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
77e0: 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  rs(pParse, p->pS
77f0: 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  rc);..  /* Look 
7800: 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
7810: 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
7820: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
7830: 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
7840: 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
7850: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
7860: 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
7870: 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
7880: 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
7890: 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
78a0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
78b0: 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
78c0: 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
78d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
78e0: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
78f0: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
7900: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
7910: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
7920: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
7930: 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
7940: 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
7950: 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
7960: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
7970: 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
7980: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
7990: 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
79a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
79b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
79c0: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
79d0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
79e0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
79f0: 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
7a00: 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
7a10: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
7a20: 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
7a30: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
7a40: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
7a50: 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  f( pFrom->zAlias
7a60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
7a70: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20  From->zAlias =. 
7a80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7a90: 4d 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f  MPrintf("sqlite_
7aa0: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28  subquery_%p_", (
7ab0: 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65  void*)pFrom->pSe
7ac0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
7ad0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
7ae0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
7af0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74     sqlite3Result
7b00: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
7b10: 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  se, pFrom->zAlia
7b20: 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  s, pFrom->pSelec
7b30: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
7b40: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
7b50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7b60: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
7b70: 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67  isTransient flag
7b80: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
7b90: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
7ba0: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
7bb0: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
7bc0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
7bd0: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
7be0: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
7bf0: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
7c00: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
7c10: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
7c20: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
7c30: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
7c40: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
7c50: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
7c60: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
7c70: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20  ->isTransient = 
7c80: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  1;.#endif.    }e
7c90: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
7ca0: 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
7cb0: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
7cc0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7cd0: 2a 2f 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  */.      pFrom->
7ce0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
7cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
7d00: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
7d10: 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
7d20: 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
7d30: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
7d40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
7d50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
7d60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d70: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69  MIT_VIEW.      i
7d80: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
7d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
7da0: 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
7db0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
7dc0: 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
7dd0: 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
7de0: 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
7df0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
7e00: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
7e10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7e20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7e30: 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e     /* If pFrom->
7e40: 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65  pSelect!=0 it me
7e50: 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
7e60: 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20  ng with a.      
7e70: 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e    ** view within
7e80: 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45   a view.  The SE
7e90: 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68  LECT structure h
7ea0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
7eb0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
7ec0: 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76  d by the outer v
7ed0: 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b  iew so we can sk
7ee0: 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70  ip the copy step
7ef0: 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   here.        **
7f00: 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69   in the inner vi
7f10: 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ew..        */. 
7f20: 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d         if( pFrom
7f30: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
7f40: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d            pFrom-
7f50: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
7f60: 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62  e3SelectDup(pTab
7f70: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
7f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
7f90: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
7fa0: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
7fb0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
7fc0: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
7fd0: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
7fe0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
7ff0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
8000: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
8010: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
8020: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
8030: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
8040: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
8050: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
8060: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
8070: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
8080: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
8090: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
80a0: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
80b0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
80c0: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
80d0: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
80e0: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
80f0: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
8100: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
8110: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
8120: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
8130: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
8140: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
8150: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
8160: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
8170: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
8180: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
8190: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
81a0: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
81b0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
81c0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
81d0: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
81e0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
81f0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
8200: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
8210: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
8220: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
8230: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
8240: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
8250: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
8260: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
8270: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
8280: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
8290: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
82a0: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
82b0: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
82c0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
82d0: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
82e0: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
82f0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
8300: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
8310: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
8320: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
8330: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
8340: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
8350: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
8360: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
8370: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
8380: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
8390: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
83a0: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
83b0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
83c0: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
83d0: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
83e0: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
83f0: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
8400: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
8410: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
8420: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
8430: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
8440: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
8450: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
8460: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
8470: 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
8480: 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
8490: 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
84a0: 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
84b0: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
84c0: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
84d0: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
84e0: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
84f0: 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
8500: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
8510: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
8520: 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
8530: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
8540: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
8550: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
8560: 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b   a[k].pExpr, 0);
8570: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
8580: 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
8590: 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
85a0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d  me;.        a[k]
85b0: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
85c0: 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
85d0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
85e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
85f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
8600: 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
8610: 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
8620: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
8630: 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
8640: 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
8650: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
8660: 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
8670: 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
8680: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
8690: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
86a0: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
86b0: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
86c0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
86d0: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
86e0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
86f0: 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
8700: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
8710: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
8720: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8730: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
8740: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
8750: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
8760: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
8770: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
8780: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
8790: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
87a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
87b0: 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
87c0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
87d0: 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
87e0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
87f0: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
8800: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
8810: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
8820: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
8830: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
8840: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
8850: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54  f( zTName && (zT
8860: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
8870: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
88a0: 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
88b0: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
88c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
88d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
88e0: 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
88f0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
8900: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
8910: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
8920: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
8930: 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  pr, *pLeft, *pRi
8940: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
8950: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
8960: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
8970: 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
8980: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
8990: 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
89a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
89b0: 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74  Left = &pTabList
89c0: 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20  ->a[i-1];.      
89d0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65          if( (pLe
89e0: 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ft->jointype & J
89f0: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
8a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8a10: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
8a20: 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62  ndex(pLeft->pTab
8a30: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a50: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
8a60: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
8a70: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
8a80: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
8a90: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e       ** table on
8aa0: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
8ac0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ae0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8af0: 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65  3IdListIndex(pLe
8b00: 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  ft->pUsing, zNam
8b10: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
8b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
8b30: 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
8b40: 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
8b50: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
8b70: 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
8b80: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
8b90: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
8bb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8bc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8be0: 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
8bf0: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
8c00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
8c10: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
8c20: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
8c30: 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e          setToken
8c40: 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c  (&pRight->token,
8c50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
8c60: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
8c70: 65 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  e && pTabList->n
8c80: 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
8c90: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
8ca0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
8cb0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
8cc0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
8cd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
8ce0: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
8cf0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
8d00: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
8d10: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
8d20: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
8d30: 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  ken(&pLeft->toke
8d40: 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  n, zTabName);.  
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
8d60: 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61  oken(&pExpr->spa
8d70: 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74  n, sqlite3MPrint
8d80: 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  f("%s.%s", zTabN
8d90: 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20  ame, zName));.  
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8db0: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
8dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8dd0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
8de0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
8df0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
8e00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
8e10: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
8e20: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
8e30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8e40: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
8e50: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
8e60: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
8e70: 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
8e80: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
8e90: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
8ea0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
8eb0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
8ec0: 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d   pExpr, &pRight-
8ed0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
8ee0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8ef0: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
8f00: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
8f10: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
8f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
8f30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8f40: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
8f50: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
8f60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
8f70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8f80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8f90: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
8fa0: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
8fb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8fc0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
8fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8fe0: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d  sqliteFree(zTNam
8ff0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
9000: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
9010: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
9020: 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
9030: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
9040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9060: 65 20 72 65 63 75 72 73 69 76 65 6c 79 20 75 6e  e recursively un
9070: 6c 69 6e 6b 73 20 74 68 65 20 53 65 6c 65 63 74  links the Select
9080: 2e 70 53 72 63 2e 61 5b 5d 2e 70 54 61 62 20 70  .pSrc.a[].pTab p
9090: 6f 69 6e 74 65 72 73 0a 2a 2a 20 69 6e 20 61 20  ointers.** in a 
90a0: 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  select structure
90b0: 2e 20 20 49 74 20 6a 75 73 74 20 73 65 74 73 20  .  It just sets 
90c0: 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  the pointers to 
90d0: 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 2a 2a 20 72  NULL.  This.** r
90e0: 6f 75 74 69 6e 65 20 69 73 20 72 65 63 75 72 73  outine is recurs
90f0: 69 76 65 20 69 6e 20 74 68 65 20 73 65 6e 73 65  ive in the sense
9100: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 65 6c   that if the Sel
9110: 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 53 65  ect.pSrc.a[].pSe
9120: 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  lect.** pointer 
9130: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 69  is not NULL, thi
9140: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9150: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
9160: 6f 6e 20 74 68 61 74 20 70 6f 69 6e 74 65 72 2e  on that pointer.
9170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9180: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
9190: 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
91a0: 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e  cture that defin
91b0: 65 73 20 61 0a 2a 2a 20 56 49 45 57 20 69 6e 20  es a.** VIEW in 
91c0: 6f 72 64 65 72 20 74 6f 20 75 6e 64 6f 20 61 6e  order to undo an
91d0: 79 20 62 69 6e 64 69 6e 67 73 20 74 6f 20 74 61  y bindings to ta
91e0: 62 6c 65 73 2e 20 20 54 68 69 73 20 69 73 20 6e  bles.  This is n
91f0: 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61  ecessary.** beca
9200: 75 73 65 20 74 68 6f 73 65 20 74 61 62 6c 65 73  use those tables
9210: 20 6d 69 67 68 74 20 62 65 20 44 52 4f 50 65 64   might be DROPed
9220: 20 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74   by a subsequent
9230: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a   SQL command..**
9240: 20 49 66 20 74 68 65 20 62 69 6e 64 69 6e 67 73   If the bindings
9250: 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f 76 65 64   are not removed
9260: 2c 20 74 68 65 6e 20 74 68 65 20 53 65 6c 65 63  , then the Selec
9270: 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e 70 54 61 62  t.pSrc->a[].pTab
9280: 20 66 69 65 6c 64 0a 2a 2a 20 77 69 6c 6c 20 62   field.** will b
9290: 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
92a0: 74 6f 20 61 20 64 65 61 6c 6c 6f 63 61 74 65 64  to a deallocated
92b0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
92c0: 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 44 52   after the.** DR
92d0: 4f 50 20 61 6e 64 20 61 20 63 6f 72 65 64 75 6d  OP and a coredum
92e0: 70 20 77 69 6c 6c 20 6f 63 63 75 72 20 74 68 65  p will occur the
92f0: 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 56   next time the V
9300: 49 45 57 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  IEW is used..*/.
9310: 23 69 66 20 30 0a 76 6f 69 64 20 73 71 6c 69 74  #if 0.void sqlit
9320: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 53  e3SelectUnbind(S
9330: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
9340: 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
9350: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
9360: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
9370: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 54  item *pItem;.  T
9380: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
9390: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
93a0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65  .  for(i=0, pIte
93b0: 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3c 70 53 72  m=pSrc->a; i<pSr
93c0: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  c->nSrc; i++, pI
93d0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
93e0: 28 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  (pTab = pItem->p
93f0: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
9400: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
9410: 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  nsient ){.      
9420: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
9430: 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20  able(0, pTab);. 
9440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
9450: 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
9460: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
9470: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
9480: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55    sqlite3SelectU
9490: 6e 62 69 6e 64 28 70 49 74 65 6d 2d 3e 70 53 65  nbind(pItem->pSe
94a0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
94b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
94c0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
94d0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
94e0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
94f0: 73 20 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69  s routine associ
9500: 61 74 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20  ates entries in 
9510: 61 6e 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  an ORDER BY expr
9520: 65 73 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  ession list with
9530: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  .** columns in a
9540: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61   result.  For ea
9550: 63 68 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  ch ORDER BY expr
9560: 65 73 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f  ession, the opco
9570: 64 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  de of.** the top
9580: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63  -level node is c
9590: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
95a0: 55 4d 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c  UMN and the iCol
95b0: 75 6d 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  umn value of.** 
95c0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
95d0: 64 65 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  de is filled in 
95e0: 77 69 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  with column numb
95f0: 65 72 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c  er and the iTabl
9600: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
9610: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
9620: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
9630: 69 54 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72  iTable parameter
9640: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
9650: 20 61 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43   are prior SELEC
9660: 54 20 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20  T clauses, they 
9670: 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 66 69  are processed fi
9680: 72 73 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a  rst.  A match.**
9690: 20 69 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53   in an earlier S
96a0: 45 4c 45 43 54 20 74 61 6b 65 73 20 70 72 65 63  ELECT takes prec
96b0: 65 64 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61  edence over a la
96c0: 74 65 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  ter SELECT..**.*
96d0: 2a 20 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74  * Any entry that
96e0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
96f0: 69 73 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e  is flagged as an
9700: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d   error.  The num
9710: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
9720: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9730: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63  .static int matc
9740: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
9750: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9760: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  e,          /* A
9770: 20 70 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20   place to leave 
9780: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
9790: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
97a0: 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d  ect,        /* M
97b0: 61 74 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63  atch to result c
97c0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53  olumns of this S
97d0: 45 4c 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c  ELECT */.  ExprL
97e0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
97f0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
9800: 42 59 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74  BY values to mat
9810: 63 68 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  ch against colum
9820: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
9830: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
9840: 2f 2a 20 49 6e 73 65 72 74 20 74 68 69 73 20 76  /* Insert this v
9850: 61 6c 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a  alue in iTable *
9860: 2f 0a 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70  /.  int mustComp
9870: 6c 65 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49  lete        /* I
9880: 66 20 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52  f TRUE all ORDER
9890: 20 42 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20   BYs must match 
98a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
98b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
98c0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
98d0: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65  List;..  if( pSe
98e0: 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65  lect==0 || pOrde
98f0: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
9900: 31 3b 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d  1;.  if( mustCom
9910: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72  plete ){.    for
9920: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
9930: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70  ->nExpr; i++){ p
9940: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
9950: 6e 65 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20  ne = 0; }.  }.  
9960: 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
9970: 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mt(pParse, pSele
9980: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
9990: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
99a0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
99b0: 7b 0a 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f  {.    if( matchO
99c0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
99d0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
99e0: 70 50 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79  pPrior, pOrderBy
99f0: 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
9a00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9a10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
9a20: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
9a30: 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  List;.  for(i=0;
9a40: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
9a50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
9a60: 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42  pr *pE = pOrderB
9a70: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
9a80: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31     int iCol = -1
9a90: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
9aa0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20  By->a[i].done ) 
9ab0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
9ac0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
9ad0: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
9ae0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
9af0: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
9b00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
9b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9b20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
9b30: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
9b40: 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20   BY position %d 
9b50: 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65  should be betwee
9b60: 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20  n 1 and %d",.   
9b70: 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c         iCol, pEL
9b80: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
9b90: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
9ba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9bb0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d    }.      if( !m
9bc0: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f  ustComplete ) co
9bd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43  ntinue;.      iC
9be0: 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol--;.    }.    
9bf0: 66 6f 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20  for(j=0; iCol<0 
9c00: 26 26 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  && j<pEList->nEx
9c10: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
9c20: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  if( pEList->a[j]
9c30: 2e 7a 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f  .zName && (pE->o
9c40: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e  p==TK_ID || pE->
9c50: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29  op==TK_STRING) )
9c60: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
9c70: 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a  zName, *zLabel;.
9c80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9c90: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
9ca0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62  me;.        zLab
9cb0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  el = sqlite3Name
9cc0: 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74  FromToken(&pE->t
9cd0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  oken);.        a
9ce0: 73 73 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30  ssert( zLabel!=0
9cf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9d00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9d10: 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30  Name, zLabel)==0
9d20: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69   ){ .          i
9d30: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  Col = j;.       
9d40: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
9d50: 65 46 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20  eFree(zLabel);. 
9d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9d70: 20 69 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74   iCol<0 && sqlit
9d80: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
9d90: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  , pEList->a[j].p
9da0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
9db0: 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20   iCol = j;.     
9dc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9dd0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
9de0: 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f    pE->op = TK_CO
9df0: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e  LUMN;.      pE->
9e00: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
9e10: 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65        pE->iTable
9e20: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20   = iTable;.     
9e30: 20 70 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a   pE->iAgg = -1;.
9e40: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
9e50: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20  a[i].done = 1;. 
9e60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
9e70: 6c 3c 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c  l<0 && mustCompl
9e80: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ete ){.      sql
9e90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9ea0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52  rse,.        "OR
9eb0: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
9ec0: 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d  er %d does not m
9ed0: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
9ee0: 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20  column", i+1);. 
9ef0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
9f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9f10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
9f20: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
9f30: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
9f40: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9f50: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  LECT */../*.** G
9f60: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
9f70: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
9f80: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
9f90: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
9fa0: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
9fb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9fc0: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
9fd0: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
9fe0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
9ff0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
a000: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
a010: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
a020: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
a030: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
a040: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a050: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
a060: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
a070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
a080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
a090: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
a0a0: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
a0b0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
a0c0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
a0d0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
a0e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
a0f0: 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73  nLimit and nOffs
a100: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
a110: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
a120: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
a130: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
a140: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
a150: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
a160: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
a170: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
a180: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
a190: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
a1a0: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
a1b0: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
a1c0: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
a1d0: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
a1e0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
a1f0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
a200: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
a210: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
a220: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
a230: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
a240: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
a250: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
a260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
a270: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
a280: 69 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  if iLimit and iO
a290: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
a2a0: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
a2b0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
a2c0: 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66   nLimit and nOff
a2d0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
a2e0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
a2f0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
a300: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
a310: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
a320: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
a330: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
a340: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
a350: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
a360: 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69  ** Only if nLimi
a370: 74 3e 3d 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e  t>=0 or nOffset>
a380: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
a390: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
a3a0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
a3b0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
a3c0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
a3d0: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
a3e0: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
a3f0: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
a400: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
a410: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
a420: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
a430: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
a440: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
a450: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
a460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
a470: 65 63 74 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20  ect *p){.  /* . 
a480: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
a490: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
a4a0: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
a4b0: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
a4c0: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
a4d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
a4e0: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
a4f0: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
a500: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
a510: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
a520: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
a530: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
a540: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
a550: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d   ){.    int iMem
a560: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a570: 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  +;.    Vdbe *v =
a580: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
a590: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
a5a0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
a5b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
a5c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
a5d0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
a5e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a5f0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
a600: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a610: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a620: 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b  Negative, 0, 0);
a630: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a640: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
a650: 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a  tore, iMem, 1);.
a660: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
a670: 28 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75  (v, "# LIMIT cou
a680: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e  nter"));.    p->
a690: 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  iLimit = iMem;. 
a6a0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
a6b0: 73 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  set ){.    int i
a6c0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
a6d0: 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a  em++;.    Vdbe *
a6e0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a6f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
a700: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
a710: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
a720: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a730: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
a740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a750: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
a760: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
a770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a780: 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c   OP_Negative, 0,
a790: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a7a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a7b0: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
a7c0: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
a7d0: 65 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45  ent((v, "# OFFSE
a7e0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
a7f0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
a800: 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Mem;.  }.}../*.*
a810: 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
a820: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
a830: 74 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 74 72  t will open a tr
a840: 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68  ansient table th
a850: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73  at.** will be us
a860: 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  ed for an index 
a870: 6f 72 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 65  or to store keye
a880: 64 20 72 65 73 75 6c 74 73 20 66 6f 72 20 61 20  d results for a 
a890: 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 73 65 6c 65  compound.** sele
a8a0: 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
a8b0: 72 64 73 2c 20 6f 70 65 6e 20 61 20 74 72 61 6e  rds, open a tran
a8c0: 73 69 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74  sient table that
a8d0: 20 6e 65 65 64 73 20 61 0a 2a 2a 20 4b 65 79 49   needs a.** KeyI
a8e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
a8f0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  The number of co
a900: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4b 65 79  lumns in the Key
a910: 49 6e 66 6f 20 69 73 20 64 65 74 65 72 6d 69 6e  Info is determin
a920: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 72 65 73  ed.** by the res
a930: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
a940: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a950: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
a960: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  gument..**.** Sp
a970: 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
a980: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a990: 65 64 20 74 6f 20 6f 70 65 6e 20 61 6e 20 69 6e  ed to open an in
a9a0: 64 65 78 20 74 61 62 6c 65 20 66 6f 72 0a 2a 2a  dex table for.**
a9b0: 20 44 49 53 54 49 4e 43 54 2c 20 55 4e 49 4f 4e   DISTINCT, UNION
a9c0: 2c 20 49 4e 54 45 52 53 45 43 54 20 61 6e 64 20  , INTERSECT and 
a9d0: 45 58 43 45 50 54 20 73 65 6c 65 63 74 20 73 74  EXCEPT select st
a9e0: 61 74 65 6d 65 6e 74 73 20 28 62 75 74 20 6e 6f  atements (but no
a9f0: 74 20 0a 2a 2a 20 55 4e 49 4f 4e 20 41 4c 4c 29  t .** UNION ALL)
aa00: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65  ..**.** Make the
aa10: 20 6e 65 77 20 74 61 62 6c 65 20 61 20 4b 65 79   new table a Key
aa20: 41 73 44 61 74 61 20 74 61 62 6c 65 20 69 66 20  AsData table if 
aa30: 6b 65 79 41 73 44 61 74 61 20 69 73 20 74 72 75  keyAsData is tru
aa40: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  e..**.** The val
aa50: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
aa60: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
aa70: 65 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e  e OP_OpenTemp in
aa80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  struction..*/.st
aa90: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 54 65 6d  atic int openTem
aaa0: 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
aab0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
aac0: 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 6b   int iTab, int k
aad0: 65 79 41 73 44 61 74 61 29 7b 0a 20 20 4b 65 79  eyAsData){.  Key
aae0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
aaf0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20    int nColumn;. 
ab00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ab10: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
ab20: 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   i;.  Vdbe *v = 
ab30: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
ab40: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66   int addr;..  if
ab50: 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
ab60: 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
ab70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ab80: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  .  nColumn = p->
ab90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
aba0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
abb0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
abc0: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
abd0: 75 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  umn*sizeof(CollS
abe0: 65 71 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b  eq*) );.  if( pK
abf0: 65 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75  eyInfo==0 ) retu
ac00: 72 6e 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f  rn 0;.  pKeyInfo
ac10: 2d 3e 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b  ->enc = db->enc;
ac20: 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  .  pKeyInfo->nFi
ac30: 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  eld = nColumn;. 
ac40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
ac50: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  umn; i++){.    p
ac60: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
ac70: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
ac80: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
ac90: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
aca0: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21  Expr);.    if( !
acb0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
acc0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  i] ){.      pKey
acd0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
ace0: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
acf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72      }.  }.  addr
ad00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70   = sqlite3VdbeOp
ad10: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  3(v, OP_OpenTemp
ad20: 2c 20 69 54 61 62 2c 20 30 2c 20 0a 20 20 20 20  , iTab, 0, .    
ad30: 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
ad40: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
ad50: 4e 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6b 65  NDOFF);.  if( ke
ad60: 79 41 73 44 61 74 61 20 29 7b 0a 20 20 20 20 73  yAsData ){.    s
ad70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ad80: 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74 61 2c  v, OP_KeyAsData,
ad90: 20 69 54 61 62 2c 20 31 29 3b 0a 20 20 7d 0a 20   iTab, 1);.  }. 
ada0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
adb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
adc0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
add0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  LECT./*.** Add t
ade0: 68 65 20 61 64 64 72 65 73 73 20 22 61 64 64 72  he address "addr
adf0: 22 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  " to the set of 
ae00: 61 6c 6c 20 4f 70 65 6e 54 65 6d 70 20 6f 70 63  all OpenTemp opc
ae10: 6f 64 65 20 61 64 64 72 65 73 73 65 73 0a 2a 2a  ode addresses.**
ae20: 20 74 68 61 74 20 61 72 65 20 62 65 69 6e 67 20   that are being 
ae30: 61 63 63 75 6d 75 6c 61 74 65 64 20 69 6e 20 70  accumulated in p
ae40: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2e 0a 2a 2f  ->ppOpenTemp..*/
ae50: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
ae60: 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41  iSelectOpenTempA
ae70: 64 64 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ddr(Select *p, i
ae80: 6e 74 20 61 64 64 72 29 7b 0a 20 20 49 64 4c 69  nt addr){.  IdLi
ae90: 73 74 20 2a 70 4c 69 73 74 20 3d 20 2a 70 2d 3e  st *pList = *p->
aea0: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 73 71 6c  ppOpenTemp = sql
aeb0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
aec0: 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2c  (*p->ppOpenTemp,
aed0: 20 30 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74   0);.  if( pList
aee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
aef0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
af00: 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70    }.  pList->a[p
af10: 4c 69 73 74 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78  List->nId-1].idx
af20: 20 3d 20 61 64 64 72 3b 0a 20 20 72 65 74 75 72   = addr;.  retur
af30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
af40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
af50: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
af60: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
af70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
af80: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
af90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
afa0: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
afb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
afc0: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
afd0: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
afe0: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
aff0: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
b000: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
b010: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
b020: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
b030: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
b040: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
b050: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
b060: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
b070: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
b080: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
b090: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
b0a0: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
b0b0: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
b0c0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
b0d0: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
b0e0: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
b0f0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
b100: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
b110: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
b120: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
b130: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
b140: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
b150: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
b160: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
b170: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
b180: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
b190: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
b1a0: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52  Ret==0 ){.    pR
b1b0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
b1c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b1d0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
b1e0: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
b1f0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
b200: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b210: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b220: 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  ELECT */..#ifnde
b230: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
b240: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
b250: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b260: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
b270: 6f 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68  ocess a query th
b280: 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  at is really the
b290: 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74   union.** or int
b2a0: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f  ersection of two
b2b0: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
b2c0: 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  e queries..**.**
b2d0: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
b2e0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
b2f0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
b300: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
b310: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
b320: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
b330: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
b340: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
b350: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
b360: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
b370: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
b380: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
b390: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
b3a0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
b3b0: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
b3c0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
b3d0: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
b3e0: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
b3f0: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
b400: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
b410: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
b420: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
b430: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
b440: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
b450: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
b460: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
b470: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
b480: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
b490: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
b4a0: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
b4b0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
b4c0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
b4d0: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
b4e0: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
b4f0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b500: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
b510: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
b520: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
b530: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
b540: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
b550: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
b560: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
b570: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
b580: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
b590: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
b5a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
b5b0: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
b5c0: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
b5d0: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
b5e0: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
b5f0: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
b600: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
b610: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
b620: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
b630: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
b640: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
b650: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
b660: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
b670: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
b680: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
b690: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
b6a0: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
b6b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b6c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
b6d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b6e0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
b6f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
b700: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
b710: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
b720: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
b730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c              /* \
b740: 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79  ___  Store query
b750: 20 72 65 73 75 6c 74 73 20 61 73 20 73 70 65 63   results as spec
b760: 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ified */.  int i
b770: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
b780: 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65   /* /     by the
b790: 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72  se two parameter
b7a0: 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s.         */.  
b7b0: 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
b7c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73        /* If eDes
b7d0: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  t is SRT_Union, 
b7e0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
b7f0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
b800: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
b810: 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
b820: 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
b830: 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
b840: 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
b850: 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
b860: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
b870: 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
b880: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
b890: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
b8a0: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
b8b0: 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  E */.  IdList *p
b8c0: 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 2f 2a 20  OpenTemp = 0;/* 
b8d0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 6f 70 63 6f  OP_OpenTemp opco
b8e0: 64 65 73 20 74 68 61 74 20 6e 65 65 64 20 61 20  des that need a 
b8f0: 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74  KeyInfo */.  int
b900: 20 61 41 64 64 72 5b 35 5d 3b 20 20 20 20 20 20   aAddr[5];      
b910: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20     /* Addresses 
b920: 6f 66 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  of SetNumColumns
b930: 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
b940: 69 6e 74 20 6e 41 64 64 72 20 3d 20 30 3b 20 20  int nAddr = 0;  
b950: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b960: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  used */.  int nC
b970: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
b980: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
b990: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
b9a0: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20  lt set */..  /* 
b9b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
b9c0: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
b9d0: 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
b9e0: 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
b9f0: 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
ba00: 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
ba10: 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
ba20: 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
ba30: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
ba40: 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  IMIT..  */.  if(
ba50: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69   p==0 || p->pPri
ba60: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  or==0 ){.    rc 
ba70: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
ba80: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ba90: 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70    }.  pPrior = p
baa0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20  ->pPrior;.  if( 
bab0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
bac0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bad0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
bae0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
baf0: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
bb00: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
bb10: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
bb20: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
bb30: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
bb40: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
bb50: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
bb60: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
bb70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bb80: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
bb90: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
bba0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
bbb0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
bbc0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
bbd0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
bbe0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
bbf0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
bc00: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
bc10: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
bc20: 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e  id query engine.
bc30: 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65    If not, create
bc40: 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
bc50: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
bc60: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bc70: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
bc80: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
bc90: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bca0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  nd;.  }..  /* If
bcb0: 20 2a 70 20 74 68 69 73 20 69 73 20 74 68 65 20   *p this is the 
bcc0: 72 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c 65 63  right-most selec
bcd0: 74 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  t statement, the
bce0: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  n initialize.  *
bcf0: 2a 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20  * p->ppOpenTemp 
bd00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 70 4f 70 65  to point to pOpe
bd10: 6e 54 65 6d 70 2e 20 20 49 66 20 2a 70 20 69 73  nTemp.  If *p is
bd20: 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6d   not the right m
bd30: 6f 73 74 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ost.  ** stateme
bd40: 6e 74 20 74 68 65 6e 20 70 2d 3e 70 70 4f 70 65  nt then p->ppOpe
bd50: 6e 54 65 6d 70 20 77 69 6c 6c 20 68 61 76 65 20  nTemp will have 
bd60: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 69  already been ini
bd70: 74 69 61 6c 69 7a 65 64 0a 20 20 2a 2a 20 62 79  tialized.  ** by
bd80: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
bd90: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
bda0: 64 75 72 65 2e 20 20 50 61 73 73 20 61 6c 6f 6e  dure.  Pass alon
bdb0: 67 20 74 68 65 20 70 4f 70 65 6e 54 65 6d 70 0a  g the pOpenTemp.
bdc0: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
bdd0: 70 50 72 69 6f 72 2c 20 74 68 65 20 6e 65 78 74  pPrior, the next
bde0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6f 75   statement to ou
bdf0: 72 20 6c 65 66 74 2e 0a 20 20 2a 2f 0a 20 20 69  r left..  */.  i
be00: 66 28 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  f( p->ppOpenTemp
be10: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 70  ==0 ){.    p->pp
be20: 4f 70 65 6e 54 65 6d 70 20 3d 20 26 70 4f 70 65  OpenTemp = &pOpe
be30: 6e 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 50 72  nTemp;.  }.  pPr
be40: 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20  ior->ppOpenTemp 
be50: 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 3b  = p->ppOpenTemp;
be60: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
be70: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
be80: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
be90: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
bea0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
beb0: 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
bec0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
bed0: 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
bee0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bef0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72  P_OpenTemp, iPar
bf00: 6d 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  m, 0);.    asser
bf10: 74 28 20 6e 41 64 64 72 3d 3d 30 20 29 3b 0a 20  t( nAddr==0 );. 
bf20: 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b     aAddr[nAddr++
bf30: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
bf40: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
bf50: 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c  mColumns, iParm,
bf60: 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d   0);.    eDest =
bf70: 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
bf80: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
bf90: 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
bfa0: 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
bfb0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
bfc0: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
bfd0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
bfe0: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
bff0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
c000: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
c010: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
c020: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
c030: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
c040: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
c050: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
c060: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
c070: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
c080: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c090: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65  rse, pPrior, eDe
c0a0: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
c0b0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
c0c0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c0d0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c0e0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c0f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
c100: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
c110: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
c120: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
c130: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
c140: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
c150: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
c160: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
c170: 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65         p->pOffse
c180: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
c190: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c1a0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
c1b0: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
c1c0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
c1d0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
c1e0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
c1f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c200: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c210: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c220: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
c230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c240: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
c250: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
c260: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
c270: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
c280: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c290: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
c2a0: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
c2b0: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
c2c0: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
c2d0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
c2e0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
c2f0: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
c300: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
c310: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
c320: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
c330: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
c340: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
c350: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
c360: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
c370: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
c380: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
c390: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
c3a0: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
c3b0: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
c3c0: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
c3d0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
c3e0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
c3f0: 4f 72 64 65 72 42 79 3b 20 20 20 20 20 2f 2a 20  OrderBy;     /* 
c400: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
c410: 75 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  use for the righ
c420: 74 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  t SELECT */.    
c430: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
c440: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e     priorOp = p->
c450: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54  op==TK_ALL ? SRT
c460: 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69  _Table : SRT_Uni
c470: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  on;.      if( eD
c480: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
c490: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  p->pOrderBy==0 &
c4a0: 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20  & !p->pLimit && 
c4b0: 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20  !p->pOffset ){. 
c4c0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
c4d0: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
c4e0: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
c4f0: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
c500: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
c510: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
c520: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
c530: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
c540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c550: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
c560: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
c570: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
c580: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
c590: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
c5a0: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
c5b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c5c0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
c5d0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
c5e0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
c5f0: 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20  rderBy .        
c600: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
c610: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
c620: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
c630: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a  unionTab, 1) ){.
c640: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
c650: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
c660: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c670: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
c680: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
c690: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c6a0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 75 6e 69  OP_OpenTemp, uni
c6b0: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
c6c0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b     if( p->op!=TK
c6d0: 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _ALL ){.        
c6e0: 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
c6f0: 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70  ctOpenTempAddr(p
c700: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20  , addr);.       
c710: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c720: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c730: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c740: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
c760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c770: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
c780: 61 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 3b  a, unionTab, 1);
c790: 0a 20 20 20 20 20 20 20 20 7d 0a 09 61 73 73 65  .        }..asse
c7a0: 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66  rt( nAddr<sizeof
c7b0: 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61  (aAddr)/sizeof(a
c7c0: 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Addr[0]) );.    
c7d0: 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b      aAddr[nAddr+
c7e0: 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  +] = sqlite3Vdbe
c7f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
c800: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e  umColumns, union
c810: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
c820: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c830: 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
c840: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
c850: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c860: 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
c870: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
c880: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
c890: 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
c8a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c8b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
c8c0: 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  or, priorOp, uni
c8d0: 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20  onTab, 0, 0, 0, 
c8e0: 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  aff);.      if( 
c8f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c900: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c910: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
c920: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
c930: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
c940: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
c950: 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  /.      switch( 
c960: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  p->op ){.       
c970: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
c980: 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65  :  op = SRT_Exce
c990: 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  pt;   break;.   
c9a0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e        case TK_UN
c9b0: 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f  ION:   op = SRT_
c9c0: 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b  Union;    break;
c9d0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
c9e0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20  K_ALL:     op = 
c9f0: 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72  SRT_Table;    br
ca00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ca10: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
ca20: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
ca30: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
ca40: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
ca50: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  y = 0;.      pLi
ca60: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
ca70: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
ca80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
ca90: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
caa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
cab0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  et = 0;.      rc
cac0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
cad0: 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20  (pParse, p, op, 
cae0: 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20  unionTab, 0, 0, 
caf0: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
cb00: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
cb10: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
cb20: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
cb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
cb40: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
cb50: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
cb60: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
cb70: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
cb80: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
cb90: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b   p->iLimit = -1;
cba0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
cbb0: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  t = -1;.      if
cbc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
cbd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cbe0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
cbf0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
cc00: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
cc10: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
cc20: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
cc30: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
cc40: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
cc50: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
cc60: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
cc70: 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f   if( eDest!=prio
cc80: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
cc90: 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20  =iParm ){.      
cca0: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
ccb0: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
ccc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ccd0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
cce0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
ccf0: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
cd00: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
cd10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
cd20: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
cd30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cd40: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
cd50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cd60: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
cd70: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
cd80: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
cd90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cda0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
cdb0: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
cdc0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
cdd0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
cde0: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
cdf0: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
ce00: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
ce10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
ce20: 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65         rc = sele
ce30: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
ce40: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
ce50: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
ce60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f             p->pO
ce90: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
cea0: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
ced0: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
cee0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
cef0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
cf00: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
cf10: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cf20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cf40: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
cf50: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
cf60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cf70: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
cf80: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
cf90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cfa0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
cfb0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
cfc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cfd0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
cfe0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
cff0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d010: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b   TK_INTERSECT: {
d020: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
d030: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
d040: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
d050: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
d060: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
d070: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
d080: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  addr;..      /* 
d090: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
d0a0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
d0b0: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
d0c0: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
d0d0: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
d0e0: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
d0f0: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
d100: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
d110: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
d120: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
d130: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
d140: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
d150: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d160: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
d170: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d180: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
d190: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
d1a0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
d1b0: 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72 42 79  se,p,p->pOrderBy
d1c0: 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20  ,tab1,1) ){.    
d1d0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d1e0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d1f0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d200: 20 7d 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d   }..      addr =
d210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d220: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
d230: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
d240: 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
d250: 63 74 4f 70 65 6e 54 65 6d 70 41 64 64 72 28 70  ctOpenTempAddr(p
d260: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 69  , addr);.      i
d270: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d280: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d290: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d2a0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
d2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d2c0: 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44 61 74  p(v, OP_KeyAsDat
d2d0: 61 2c 20 74 61 62 31 2c 20 31 29 3b 0a 20 20 20  a, tab1, 1);.   
d2e0: 20 20 20 61 73 73 65 72 74 28 20 6e 41 64 64 72     assert( nAddr
d2f0: 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73  <sizeof(aAddr)/s
d300: 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20  izeof(aAddr[0]) 
d310: 29 3b 0a 20 20 20 20 20 20 61 41 64 64 72 5b 6e  );.      aAddr[n
d320: 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  Addr++] = sqlite
d330: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d340: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
d350: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
d360: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d370: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
d380: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
d390: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
d3a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d3b0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
d3c0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
d3d0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d3e0: 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55  e, pPrior, SRT_U
d3f0: 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30  nion, tab1, 0, 0
d400: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d410: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d420: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d430: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d440: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
d450: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
d460: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
d470: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
d480: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
d490: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d4a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
d4b0: 6e 54 65 6d 70 2c 20 74 61 62 32 2c 20 30 29 3b  nTemp, tab2, 0);
d4c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  .      rc = mult
d4d0: 69 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41  iSelectOpenTempA
d4e0: 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20  ddr(p, addr);.  
d4f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d500: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d510: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d520: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
d530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d540: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79  eAddOp(v, OP_Key
d550: 41 73 44 61 74 61 2c 20 74 61 62 32 2c 20 31 29  AsData, tab2, 1)
d560: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d570: 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64  nAddr<sizeof(aAd
d580: 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72  dr)/sizeof(aAddr
d590: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 41  [0]) );.      aA
d5a0: 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73  ddr[nAddr++] = s
d5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d5c0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
d5d0: 6d 6e 73 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  mns, tab2, 0);. 
d5e0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d5f0: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
d600: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
d610: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
d620: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
d630: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
d640: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d650: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
d660: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
d670: 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69  arse, p, SRT_Uni
d680: 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20  on, tab2, 0, 0, 
d690: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70  0, aff);.      p
d6a0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
d6b0: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
d6c0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
d6d0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
d6e0: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
d6f0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
d700: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
d710: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d720: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d730: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d740: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
d750: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
d760: 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
d770: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
d780: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
d790: 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
d7a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
d7b0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
d7c0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
d7d0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
d7e0: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
d7f0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
d800: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
d810: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d820: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
d830: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d840: 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
d850: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d860: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d880: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
d890: 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
d8a0: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
d8b0: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
d8c0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53 74 61  , p);.      iSta
d8d0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
d8e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6c 6c  AddOp(v, OP_Full
d8f0: 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  Key, tab1, 0);. 
d900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d910: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
d920: 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
d930: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
d940: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
d950: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
d960: 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
d970: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72            p->pOr
d9a0: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
d9b0: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
d9e0: 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  reak, 0);.      
d9f0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
da00: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
da10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
da20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
da30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
da40: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
da50: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
da60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da70: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
da80: 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
da90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
daa0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
dab0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
dac0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dad0: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
dae0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
daf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
db00: 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
db10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
db20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
db30: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
db40: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
db50: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
db60: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
db70: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
db80: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
db90: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
dba0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
dbb0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
dbc0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
dbd0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
dbe0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
dbf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
dc00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
dc10: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
dc20: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
dc30: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
dc40: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
dc50: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
dc60: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
dc70: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
dc80: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
dc90: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
dca0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
dcb0: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
dcc0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
dcd0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a  emporary tables.
dce0: 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d    */.  nCol = p-
dcf0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
dd00: 20 20 77 68 69 6c 65 28 20 6e 41 64 64 72 3e 30    while( nAddr>0
dd10: 20 29 7b 0a 20 20 20 20 6e 41 64 64 72 2d 2d 3b   ){.    nAddr--;
dd20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
dd30: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 41 64 64  ChangeP2(v, aAdd
dd40: 72 5b 6e 41 64 64 72 5d 2c 20 6e 43 6f 6c 29 3b  r[nAddr], nCol);
dd50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
dd60: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
dd70: 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 65  uences used by e
dd80: 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52 20  ither the ORDER 
dd90: 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a  BY clause or.  *
dda0: 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61  * by any tempora
ddb0: 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
ddc0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
ddd0: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
dde0: 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
ddf0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
de00: 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
de10: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49  orary tables.  I
de20: 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f  nvoke the.  ** O
de30: 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73 69  RDER BY processi
de40: 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ng if there is a
de50: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
de60: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
de70: 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
de80: 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
de90: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
dea0: 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
deb0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
dec0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
ded0: 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
dee0: 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
def0: 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
df00: 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
df10: 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
df20: 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
df30: 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
df40: 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
df50: 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
df60: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
df70: 72 42 79 20 7c 7c 20 28 70 4f 70 65 6e 54 65 6d  rBy || (pOpenTem
df80: 70 20 26 26 20 70 4f 70 65 6e 54 65 6d 70 2d 3e  p && pOpenTemp->
df90: 6e 49 64 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e  nId>0) ){.    in
dfa0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
dfc0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
dfd0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
dfe0: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
dff0: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
e000: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
e010: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
e020: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 70 4f    assert( p->ppO
e030: 70 65 6e 54 65 6d 70 20 3d 3d 20 26 70 4f 70 65  penTemp == &pOpe
e040: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 70 4b 65  nTemp );.    pKe
e050: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
e060: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65  lloc(sizeof(*pKe
e070: 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65  yInfo)+nCol*size
e080: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20  of(CollSeq*));. 
e090: 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
e0a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e0b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e0c0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e0d0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
e0e0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
e0f0: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
e100: 3e 65 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e  >enc;.    pKeyIn
e110: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f  fo->nField = nCo
e120: 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
e130: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
e140: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
e150: 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
e160: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
e170: 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
e180: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d    if( !pKeyInfo-
e190: 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
e1a0: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
e1b0: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65  Coll[i] = pParse
e1c0: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
e1d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e1e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 4f 70      for(i=0; pOp
e1f0: 65 6e 54 65 6d 70 20 26 26 20 69 3c 70 4f 70 65  enTemp && i<pOpe
e200: 6e 54 65 6d 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  nTemp->nId; i++)
e210: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 33 74 79  {.      int p3ty
e220: 70 65 20 3d 20 28 69 3d 3d 30 3f 50 33 5f 4b 45  pe = (i==0?P3_KE
e230: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 50 33  YINFO_HANDOFF:P3
e240: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
e250: 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4f 70 65   int addr = pOpe
e260: 6e 54 65 6d 70 2d 3e 61 5b 69 5d 2e 69 64 78 3b  nTemp->a[i].idx;
e270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e280: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
e290: 64 72 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  dr, (char *)pKey
e2a0: 49 6e 66 6f 2c 20 70 33 74 79 70 65 29 3b 0a 20  Info, p3type);. 
e2b0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
e2c0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
e2d0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
e2e0: 73 74 5f 69 74 65 6d 20 2a 70 4f 72 64 65 72 42  st_item *pOrderB
e2f0: 79 54 65 72 6d 20 3d 20 70 2d 3e 70 4f 72 64 65  yTerm = p->pOrde
e300: 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  rBy->a;.      fo
e310: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f 72 64  r(i=0; i<p->pOrd
e320: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
e330: 2c 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2b 2b  , pOrderByTerm++
e340: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
e350: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
e360: 79 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  yTerm->pExpr;.  
e370: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
e380: 65 20 3d 20 70 4f 72 64 65 72 42 79 54 65 72 6d  e = pOrderByTerm
e390: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
e3a0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e3b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
e3c0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
e3d0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
e3e0: 2f 2a 20 61 73 73 65 72 74 28 20 21 70 45 78 70  /* assert( !pExp
e3f0: 72 2d 3e 70 43 6f 6c 6c 20 29 3b 20 2a 2f 0a 20  r->pColl ); */. 
e400: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
e410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
e420: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
e430: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
e440: 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  q(pParse, zName,
e450: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   -1);.        }e
e460: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
e470: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b  Expr->pColl = pK
e480: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45  eyInfo->aColl[pE
e490: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20  xpr->iColumn];. 
e4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e4b0: 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
e4c0: 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
e4d0: 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
e4e0: 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
e4f0: 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Parm);.    }..  
e500: 20 20 69 66 28 20 21 70 4f 70 65 6e 54 65 6d 70    if( !pOpenTemp
e510: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
e520: 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55 4e  s happens for UN
e530: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
e540: 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73 71  R BY */.      sq
e550: 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66  liteFree(pKeyInf
e560: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6d  o);.    }.  }..m
e570: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
e580: 0a 20 20 69 66 28 20 70 4f 70 65 6e 54 65 6d 70  .  if( pOpenTemp
e590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
e5a0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 70 65  dListDelete(pOpe
e5b0: 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 70 2d  nTemp);.  }.  p-
e5c0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b  >ppOpenTemp = 0;
e5d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e5e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e5f0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
e600: 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  ELECT */..#ifnde
e610: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e620: 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  EW./*.** Scan th
e630: 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
e640: 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
e650: 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
e660: 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
e670: 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
e680: 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
e690: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
e6a0: 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
e6b0: 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
e6c0: 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
e6d0: 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
e6e0: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
e6f0: 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
e700: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
e710: 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
e720: 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
e730: 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
e740: 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
e750: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
e760: 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
e770: 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
e780: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
e790: 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
e7a0: 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
e7b0: 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
e7c0: 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
e7d0: 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
e7e0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
e7f0: 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
e800: 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
e810: 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
e820: 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
e830: 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
e840: 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
e850: 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
e860: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
e870: 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
e880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e890: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45   substExprList(E
e8a0: 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70  xprList*,int,Exp
e8b0: 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72  rList*);  /* For
e8c0: 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61  ward Decl */.sta
e8d0: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
e8e0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 2c 20 69  lect(Select *, i
e8f0: 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
e900: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63    /* Forward Dec
e910: 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l */.static void
e920: 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72 20   substExpr(Expr 
e930: 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62  *pExpr, int iTab
e940: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
e950: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78  List){.  if( pEx
e960: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
e970: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
e980: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
e990: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
e9a0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
e9b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
e9c0: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
e9d0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
e9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
e9f0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
ea00: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
ea10: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
ea20: 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
ea30: 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
ea40: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
ea50: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
ea60: 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72  ight==0 && pExpr
ea70: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
ea80: 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73      pNew = pELis
ea90: 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
eaa0: 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
eab0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
eac0: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
ead0: 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b  ->op = pNew->op;
eae0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
eaf0: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
eb00: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
eb10: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
eb20: 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66  prDup(pNew->pLef
eb30: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
eb40: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
eb50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
eb60: 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
eb70: 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d  te3ExprDup(pNew-
eb80: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
eb90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
eba0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
ebb0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20   pExpr->pList = 
ebc0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ebd0: 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  up(pNew->pList);
ebe0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
ebf0: 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
ec00: 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ble;.      pExpr
ec10: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77  ->iColumn = pNew
ec20: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
ec30: 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
ec40: 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20  New->iAgg;.     
ec50: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
ec60: 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  y(&pExpr->token,
ec70: 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a   &pNew->token);.
ec80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
ec90: 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73  enCopy(&pExpr->s
eca0: 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e  pan, &pNew->span
ecb0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
ecc0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
ecd0: 33 53 65 6c 65 63 74 44 75 70 28 70 4e 65 77 2d  3SelectDup(pNew-
ece0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
ecf0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20   pExpr->flags = 
ed00: 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  pNew->flags;.   
ed10: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ed20: 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d  substExpr(pExpr-
ed30: 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
ed40: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
ed50: 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52  stExpr(pExpr->pR
ed60: 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
ed70: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
ed80: 53 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53  Select(pExpr->pS
ed90: 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
eda0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
edb0: 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d  tExprList(pExpr-
edc0: 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  >pList, iTable, 
edd0: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73  pEList);.  }.}.s
ede0: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
edf0: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
ee00: 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54  t *pList, int iT
ee10: 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  able, ExprList *
ee20: 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  pEList){.  int i
ee30: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
ee40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
ee50: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
ee60: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ee70: 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d  substExpr(pList-
ee80: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
ee90: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
eea0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
eeb0: 73 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65  substSelect(Sele
eec0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ct *p, int iTabl
eed0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  e, ExprList *pEL
eee0: 69 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29  ist){.  if( !p )
eef0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74   return;.  subst
ef00: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
ef10: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
ef20: 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
ef30: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
ef40: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ef50: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
ef60: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
ef70: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ef80: 0a 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e  .  substExpr(p->
ef90: 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
efa0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
efb0: 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  tExpr(p->pWhere,
efc0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
efd0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
efe0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
eff0: 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
f000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f010: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _VIEW./*.** This
f020: 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
f030: 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
f040: 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72  queries in order
f050: 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65   to speed.** exe
f060: 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75  cution.  It retu
f070: 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
f080: 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
f090: 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
f0a0: 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  .** occurs..**.*
f0b0: 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
f0c0: 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
f0d0: 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
f0e0: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
f0f0: 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
f100: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
f110: 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
f120: 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
f130: 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
f140: 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
f150: 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
f160: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
f170: 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
f180: 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
f190: 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
f1a0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
f1b0: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
f1c0: 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
f1d0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f1e0: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
f1f0: 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
f200: 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
f210: 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
f220: 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
f230: 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
f240: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
f250: 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
f260: 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
f270: 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
f280: 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
f290: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
f2a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f2b0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
f2c0: 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
f2d0: 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
f2e0: 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
f2f0: 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
f300: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
f310: 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
f320: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
f330: 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
f340: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
f350: 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
f360: 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67   simpification g
f370: 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
f380: 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
f390: 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
f3a0: 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
f3b0: 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
f3c0: 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
f3d0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
f3e0: 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
f3f0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
f400: 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
f410: 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
f420: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
f430: 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
f440: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
f450: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
f460: 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
f470: 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
f480: 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
f490: 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
f4a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
f4b0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
f4c0: 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
f4d0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f4e0: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
f4f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ..**.**   (3)  T
f500: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
f510: 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
f520: 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
f530: 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a  uter join, or.**
f540: 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62 71          the subq
f550: 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65  uery is not itse
f560: 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63  lf a join.  (Tic
f570: 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20  ket #306).**.** 
f580: 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
f590: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
f5a0: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
f5b0: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f5c0: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35  join..**.**   (5
f5d0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f5e0: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
f5f0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f600: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
f610: 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
f620: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ates..**.**   (6
f630: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f640: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
f650: 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
f660: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
f670: 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
f680: 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
f690: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f6a0: 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
f6b0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  e..**.**   (8)  
f6c0: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
f6d0: 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
f6e0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f6f0: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
f700: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
f710: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
f720: 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
f730: 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
f740: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
f750: 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
f760: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
f770: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
f780: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
f790: 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
f7a0: 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
f7b0: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
f7c0: 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
f7d0: 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
f7e0: 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
f7f0: 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
f800: 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
f810: 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
f820: 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (12)  The subque
f830: 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
f840: 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
f850: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72  FT OUTER JOIN or
f860: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
f870: 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
f880: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61  HERE clause.  (a
f890: 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  dded by ticket #
f8a0: 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  350).**.** In th
f8b0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
f8c0: 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
f8d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f8e0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
f8f0: 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
f900: 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
f910: 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
f920: 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
f930: 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
f940: 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
f950: 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
f960: 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
f970: 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
f980: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
f990: 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
f9a0: 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
f9b0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
f9c0: 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
f9d0: 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
f9e0: 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
f9f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
fa00: 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
fa10: 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
fa20: 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
fa30: 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
fa40: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
fa50: 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
fa60: 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
fa70: 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
fa80: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
fa90: 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
faa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fab0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
fac0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
fad0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
fae0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
faf0: 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
fb00: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
fb10: 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
fb20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
fb30: 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
fb40: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
fb50: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
fb60: 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
fb70: 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
fb80: 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
fb90: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
fba0: 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
fbb0: 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
fbc0: 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
fbd0: 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
fbe0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
fbf0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
fc00: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
fc10: 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
fc20: 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72  ubquery" */.  Sr
fc30: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
fc40: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
fc50: 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
fc60: 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
fc70: 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
fc80: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
fc90: 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
fca0: 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
fcb0: 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
fcc0: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
fcd0: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
fce0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
fcf0: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
fd00: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
fd10: 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
fd20: 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
fd30: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fd50: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
fd60: 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
fd90: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
fda0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
fdb0: 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
fdc0: 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a  he subquery */..
fdd0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
fde0: 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
fdf0: 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
fe00: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
fe10: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
fe20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
fe30: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
fe40: 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
fe50: 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
fe60: 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
fe70: 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
fe80: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
fe90: 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
fea0: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
feb0: 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
fec0: 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
fed0: 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
fee0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75  turn 0;.  if( su
fef0: 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
ff00: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
ff10: 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72  turn 0;.  pSubSr
ff20: 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
ff30: 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
ff40: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 53 75 62  c );.  if( (pSub
ff50: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
ff60: 4c 69 6d 69 74 29 20 7c 7c 20 70 53 75 62 2d 3e  Limit) || pSub->
ff70: 70 4f 66 66 73 65 74 20 7c 7c 20 0a 20 20 20 20  pOffset || .    
ff80: 20 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20    (pSub->pLimit 
ff90: 26 26 20 69 73 41 67 67 29 20 29 20 72 65 74 75  && isAgg) ) retu
ffa0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62  rn 0;.  if( pSub
ffb0: 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
ffc0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
ffd0: 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  Sub->isDistinct 
ffe0: 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
fff0: 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
10000 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10010 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74  .  if( p->isDist
10020 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79  inct && subquery
10030 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
10040 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
10050 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
10060 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
10070 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  ;..  /* Restrict
10080 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
10090 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
100a0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
100b0 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
100c0 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
100d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
100e0 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
100f0 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
10100 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
10110 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
10120 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
10130 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
10140 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
10150 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
10160 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
10170 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
10180 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
10190 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
101a0 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
101b0 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
101c0 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
101d0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
101e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53    */.  if( pSubS
101f0 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69 46  rc->nSrc>1 && iF
10200 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e  rom>0 && (pSrc->
10210 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74  a[iFrom-1].joint
10220 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
10230 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10240 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
10250 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
10260 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
10270 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
10280 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
10290 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
102a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
102b0 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
102c0 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
102d0 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
102e0 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
102f0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
10300 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
10310 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
10320 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
10330 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
10340 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
10350 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
10360 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
10370 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
10380 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
10390 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
103a0 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
103b0 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
103c0 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
103d0 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
103e0 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
103f0 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
10400 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
10410 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
10420 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a  NNER JOIN..  */.
10430 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26    if( iFrom>0 &&
10440 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d   (pSrc->a[iFrom-
10450 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
10460 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
10470 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72    && pSub->pWher
10480 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e!=0 ){.    retu
10490 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
104a0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
104b0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
104c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
104d0 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65  ermitted for the
104e0 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65  .  ** iFrom-th e
104f0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
10500 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f   clause in the o
10510 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
10520 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20  ..  /* Move all 
10530 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
10540 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
10550 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
10560 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
10570 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
10580 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
10590 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
105a0 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
105b0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
105c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
105d0 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
105e0 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
105f0 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
10600 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
10610 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
10620 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
10630 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
10640 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
10650 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
10660 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
10670 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
10680 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
10690 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
106a0 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
106b0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
106c0 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
106d0 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
106e0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e  n..  */.  iParen
106f0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
10700 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69  ursor;.  {.    i
10710 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75  nt nSubSrc = pSu
10720 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20  bSrc->nSrc;.    
10730 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70  int jointype = p
10740 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
10750 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  e;.    Table *pT
10760 61 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ab = pSubitem->p
10770 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  Tab;..    if( pT
10780 61 62 20 26 26 20 70 54 61 62 2d 3e 69 73 54 72  ab && pTab->isTr
10790 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
107a0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
107b0 62 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d  ble(0, pSubitem-
107c0 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >pTab);.    }.  
107d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
107e0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
107f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
10800 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  e(pSubitem->zNam
10810 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
10820 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  ee(pSubitem->zAl
10830 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ias);.    if( nS
10840 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
10850 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
10860 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
10870 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53  for(i=1; i<nSubS
10880 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
10890 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
108a0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53  SrcListAppend(pS
108b0 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
108c0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63   }.      p->pSrc
108d0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
108e0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
108f0 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
10900 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
10910 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
10920 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
10930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
10950 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
10960 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
10970 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
10980 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
10990 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
109a0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
109b0 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
109c0 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
109d0 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a  rom+nSubSrc-1].j
109e0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
109f0 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
10a00 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
10a10 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
10a20 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
10a30 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
10a40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
10a50 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
10a60 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
10a70 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
10a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
10a90 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
10aa0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
10ab0 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
10ac0 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
10ad0 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
10b00 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
10b10 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
10b20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
10b30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
10b40 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
10b50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10b60 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
10b70 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
10b80 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
10b90 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
10ba0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
10bb0 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
10bc0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
10bd0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
10be0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
10bf0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
10c00 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73  "y+10"..  */.  s
10c10 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
10c20 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
10c30 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
10c40 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
10c50 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
10c60 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
10c70 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
10c80 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
10c90 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10ca0 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
10cb0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
10cc0 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
10cd0 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
10ce0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
10cf0 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e  eStrNDup(pExpr->
10d00 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73  span.z, pExpr->s
10d10 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pan.n);.    }.  
10d20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  }.  if( isAgg ){
10d30 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
10d40 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
10d50 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
10d60 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
10d70 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
10d80 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10d90 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
10da0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
10db0 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
10dc0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
10dd0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
10de0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
10df0 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
10e00 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
10e10 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
10e20 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
10e30 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  stExprList(p->pO
10e40 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
10e50 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
10e60 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
10e70 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57  pWhere ){.    pW
10e80 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
10e90 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65  prDup(pSub->pWhe
10ea0 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  re);.  }else{.  
10eb0 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
10ec0 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  }.  if( subquery
10ed0 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73  IsAgg ){.    ass
10ee0 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d  ert( p->pHaving=
10ef0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  =0 );.    p->pHa
10f00 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65  ving = p->pWhere
10f10 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
10f20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75  = pWhere;.    su
10f30 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
10f40 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
10f50 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
10f60 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  p->pHaving = sql
10f70 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
10f80 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45  Having, sqlite3E
10f90 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61  xprDup(pSub->pHa
10fa0 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65  ving));.    asse
10fb0 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
10fc0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72  =0 );.    p->pGr
10fd0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
10fe0 78 70 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d  xprListDup(pSub-
10ff0 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65  >pGroupBy);.  }e
11000 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
11010 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50  pr(p->pWhere, iP
11020 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
11030 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ist);.    p->pWh
11040 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
11050 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20  rAnd(p->pWhere, 
11060 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20  pWhere);.  }..  
11070 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
11080 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
11090 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
110a0 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
110b0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
110c0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a  s distinct. .  *
110d0 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  /.  p->isDistinc
110e0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
110f0 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73  t || pSub->isDis
11100 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  tinct;..  /*.  *
11110 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
11120 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
11130 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
11140 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
11150 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ;.  */.  if( pSu
11160 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
11170 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75   p->pLimit = pSu
11180 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70  b->pLimit;.    p
11190 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
111a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
111b0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
111c0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
111d0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
111e0 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
111f0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
11200 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
11210 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
11220 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11230 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
11240 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
11250 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11260 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20 61 73  ent passed in as
11270 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
11280 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  see if it.** is 
11290 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
112a0 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
112b0 49 66 20 69 74 20 69 73 20 61 6e 64 20 74 68 69  If it is and thi
112c0 73 20 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a  s query can be.*
112d0 2a 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e  * satisfied usin
112e0 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20  g a single seek 
112f0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
11300 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e   or end of an in
11310 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e  dex,.** then gen
11320 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 66  erate the code f
11330 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 61  or this SELECT a
11340 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  nd return 1.  If
11350 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a   this is not a .
11360 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20  ** simple min() 
11370 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20  or max() query, 
11380 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a  then return 0;.*
11390 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69  *.** A simply mi
113a0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
113b0 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  ry looks like th
113c0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
113d0 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20  ECT min(a) FROM 
113e0 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c  table;.**    SEL
113f0 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20  ECT max(a) FROM 
11400 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  table;.**.** The
11410 20 71 75 65 72 79 20 6d 61 79 20 68 61 76 65 20   query may have 
11420 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
11430 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ble in its FROM 
11440 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65  argument.  There
11450 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52  .** can be no GR
11460 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
11470 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65   or WHERE clause
11480 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 73  s.  The result s
11490 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  et must.** be th
114a0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
114b0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
114c0 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
114d0 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  .  The column.**
114e0 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   in the min() or
114f0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20   max() function 
11500 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e  must be indexed.
11510 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d  .**.** The param
11520 65 74 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f  eters to this ro
11530 75 74 69 6e 65 20 61 72 65 20 74 68 65 20 73 61  utine are the sa
11540 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65  me as for sqlite
11550 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65  3Select()..** Se
11560 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
11570 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
11580 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
11590 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
115a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
115b0 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
115c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
115d0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65  Select *p, int e
115e0 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
115f0 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
11600 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54  .  int iCol;.  T
11610 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
11620 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
11630 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76   base;.  Vdbe *v
11640 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a  ;.  int seekOp;.
11650 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20 45 78    int cont;.  Ex
11660 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
11670 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
11680 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11690 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
116a0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
116b0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
116c0 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75 65   see if this que
116d0 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d  ry is a simple m
116e0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
116f0 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a  ery.  Return.  *
11700 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20  * zero if it is 
11710 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
11720 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20   p->pGroupBy || 
11730 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d  p->pHaving || p-
11740 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
11750 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
11760 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
11770 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
11780 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  rn 0;.  pEList =
11790 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
117a0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
117b0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
117c0 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
117d0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
117e0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
117f0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
11800 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73  return 0;.  pLis
11810 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
11820 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
11830 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
11840 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11850 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
11860 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e  en.n!=3 ) return
11870 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
11880 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d  3StrNICmp(pExpr-
11890 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33  >token.z,"min",3
118a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b  )==0 ){.    seek
118b0 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a  Op = OP_Rewind;.
118c0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
118d0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
118e0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
118f0 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
11900 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  ekOp = OP_Last;.
11910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
11920 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78  urn 0;.  }.  pEx
11930 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  pr = pList->a[0]
11940 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
11950 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
11960 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
11970 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
11980 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d  Column;.  pTab =
11990 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
119a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
119b0 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65  t to here, it me
119c0 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73  ans the query is
119d0 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
119e0 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b  form..  ** Check
119f0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
11a00 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61   have an index a
11a10 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69  nd make pIdx poi
11a20 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61  nt to the.  ** a
11a30 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
11a40 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20  .  If the min() 
11a50 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61  or max() is on a
11a60 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
11a70 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d  Y.  ** key colum
11a80 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e  n, no index is n
11a90 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20  ecessary so set 
11aa0 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49  pIdx to NULL.  I
11ab0 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65  f no.  ** usable
11ac0 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c   index is found,
11ad0 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
11ae0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
11af0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
11b00 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53  }else{.    CollS
11b10 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
11b20 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
11b30 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
11b40 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
11b50 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
11b60 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
11b70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11b80 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
11b90 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
11ba0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
11bb0 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64 78 2d 3e  ==iCol && pIdx->
11bc0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
11bd0 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b  ==pColl ) break;
11be0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11bf0 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Idx==0 ) return 
11c00 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65  0;.  }..  /* Ide
11c10 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70  ntify column typ
11c20 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
11c30 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62   using the callb
11c40 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ack.  This.  ** 
11c50 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20  step is skipped 
11c60 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
11c70 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c   going to a tabl
11c80 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65  e or a memory ce
11c90 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c  ll..  ** The col
11ca0 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61  umn names have a
11cb0 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
11cc0 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c  rated in the cal
11cd0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ling function.. 
11ce0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11cf0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11d00 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
11d10 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49  eturn 0;..  /* I
11d20 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
11d30 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
11d40 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
11d50 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
11d60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
11d70 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
11d80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11d90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
11da0 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
11db0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11dc0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
11dd0 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
11de0 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
11df0 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
11e00 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
11e10 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
11e20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
11e30 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
11e40 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
11e50 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
11e60 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
11e70 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
11e80 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
11e90 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
11ea0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11eb0 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
11ec0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
11ed0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
11ee0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
11ef0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
11f00 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
11f10 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29  arse, pTab->iDb)
11f20 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d  ;.  base = pSrc-
11f30 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
11f40 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11f50 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11f60 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  );.  if( pSrc->a
11f70 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [0].pSelect==0 )
11f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  {.    sqlite3Ope
11f90 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67  nTableForReading
11fa0 28 76 2c 20 62 61 73 65 2c 20 70 54 61 62 29 3b  (v, base, pTab);
11fb0 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71  .  }.  cont = sq
11fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11fd0 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64  el(v);.  if( pId
11fe0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
11ff0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12000 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
12010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
12020 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
12030 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
12040 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
12050 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
12060 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
12070 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
12080 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
12090 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
120a0 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
120b0 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
120c0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
120d0 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
120e0 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
120f0 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
12100 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
12110 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
12120 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
12130 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
12140 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
12150 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
12160 64 78 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70  dx;.    iIdx = p
12170 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12190 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
121a0 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
121b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
121c0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
121d0 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
121e0 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
121f0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
12200 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c  )&pIdx->keyInfo,
12210 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
12220 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50    if( seekOp==OP
12230 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20  _Rewind ){.     
12240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12250 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
12260 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
12270 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12280 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
12290 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65  1, 0);.      see
122a0 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b  kOp = OP_MoveGt;
122b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
122c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73  e3VdbeAddOp(v, s
122d0 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b  eekOp, iIdx, 0);
122e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
122f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52  AddOp(v, OP_IdxR
12300 65 63 6e 6f 2c 20 69 49 64 78 2c 20 30 29 3b 0a  ecno, iIdx, 0);.
12310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12320 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
12330 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
12340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12350 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62  (v, OP_MoveGe, b
12360 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  ase, 0);.  }.  e
12370 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a  List.nExpr = 1;.
12380 20 20 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49    memset(&eListI
12390 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65  tem, 0, sizeof(e
123a0 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c  ListItem));.  eL
123b0 69 73 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74  ist.a = &eListIt
123c0 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d  em;.  eList.a[0]
123d0 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
123e0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
123f0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c  p(pParse, p, &eL
12400 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
12410 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
12420 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a  cont, cont, 0);.
12430 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12440 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e  olveLabel(v, con
12450 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
12460 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
12470 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  se, base, 0);.  
12480 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
12490 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e  /*.** Analyze an
124a0 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  d ORDER BY or GR
124b0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
124c0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
124d0 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
124e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
124f0 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a  rors seen..**.**
12500 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   An ORDER BY or 
12510 47 52 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69  GROUP BY is a li
12520 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
12530 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72 65  s.  If any expre
12540 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69  ssion.** is an i
12550 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c  nteger constant,
12560 20 74 68 65 6e 20 74 68 61 74 20 65 78 70 72 65   then that expre
12570 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65  ssion is replace
12580 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72  d by the.** corr
12590 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20  esponding entry 
125a0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
125b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
125c0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
125d0 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  upBy(.  NameCont
125e0 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a  ext *pNC,     /*
125f0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   Name context of
12600 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12610 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72  ement. */.  Expr
12620 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
12630 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
12640 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
12650 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
12660 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
12670 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
12680 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52  /* Either "ORDER
12690 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73  " or "GROUP", as
126a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
126b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
126c0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
126d0 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20   pNC->pEList;   
126e0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
126f0 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
12700 54 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  T */.  Parse *pP
12710 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
12720 73 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  se;     /* The r
12730 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
12740 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73   SELECT */.  ass
12750 65 72 74 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a  ert( pEList );..
12760 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
12770 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12780 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
12790 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
127a0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  {.    int iCol;.
127b0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
127c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
127d0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
127e0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
127f0 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
12800 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30        if( iCol>0
12810 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74   && iCol<=pEList
12820 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
12830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
12840 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
12850 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d    pE = pOrderBy-
12860 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
12870 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c  lite3ExprDup(pEL
12880 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70  ist->a[iCol-1].p
12890 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
128a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
128b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
128c0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
128d0 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75  "%s BY column nu
128e0 6d 62 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72  mber %d out of r
128f0 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65  ange - should be
12900 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
12910 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
12920 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70  , zType, iCol, p
12930 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
12940 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
12950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12960 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12970 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70  prResolveNames(p
12980 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  NC, pE) ){.     
12990 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
129a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
129b0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
129c0 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  E) ){.      sqli
129d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
129e0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  se,.          "%
129f0 73 20 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20  s BY terms must 
12a00 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67  not be non-integ
12a10 65 72 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a  er constants", z
12a20 54 79 70 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Type);.      ret
12a30 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
12a40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12a50 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12a60 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20  ne resolves any 
12a70 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68  names used in th
12a80 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
12a90 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20  the.** supplied 
12aa0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12ab0 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  . If the SELECT 
12ac0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
12ad0 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61  resolved.** is a
12ae0 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65   sub-select, the
12af0 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20  n pOuterNC is a 
12b00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e  pointer to the N
12b10 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f  ameContext .** o
12b20 66 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c  f the parent SEL
12b30 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ECT..*/.int sqli
12b40 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
12b50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12b60 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
12b70 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
12b80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ba0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
12bb0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
12bc0 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
12bd0 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
12be0 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20   The outer name 
12bf0 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20  context. May be 
12c00 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78  NULL. */.){.  Ex
12c10 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
12c20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12c30 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74  lt set. */.  int
12c40 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
12c50 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c          /* For-l
12c60 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65  oop variable use
12c70 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  d in multiple pl
12c80 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  aces */.  NameCo
12c90 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
12ca0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61       /* Local na
12cb0 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20  me-context */.. 
12cc0 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74   /* If this rout
12cd0 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f  ine has run befo
12ce0 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  re, return immed
12cf0 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28  iately. */.  if(
12d00 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29   p->isResolved )
12d10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
12d20 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72  OuterNC );.    r
12d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12d40 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f  .  }.  p->isReso
12d50 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  lved = 1;..  /* 
12d60 49 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c  If there have al
12d70 72 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72  ready been error
12d80 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  s, do nothing. *
12d90 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
12da0 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65  nErr>0 ){.    re
12db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12dc0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65  R;.  }..  /* Pre
12dd0 70 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20  pare the select 
12de0 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
12df0 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61  call will alloca
12e00 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20  te all cursors. 
12e10 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20   ** required to 
12e20 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65  handle the table
12e30 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
12e40 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12e50 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
12e60 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
12e70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
12e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12e90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
12ea0 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  Resolve the expr
12eb0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  essions in the L
12ec0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
12ed0 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20  clauses. These. 
12ee0 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f   ** are not allo
12ef0 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  wed to refer to 
12f00 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61  any names, so pa
12f10 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65  ss an empty Name
12f20 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  Context..  */.  
12f30 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
12f40 72 73 65 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67  rse;.  sNC.hasAg
12f50 67 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72  g = 0;.  sNC.nEr
12f60 72 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65  r = 0;.  sNC.nRe
12f70 66 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c  f = 0;.  sNC.pEL
12f80 69 73 74 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 61  ist = 0;.  sNC.a
12f90 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 73  llowAgg = 0;.  s
12fa0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 30 3b  NC.pSrcList = 0;
12fb0 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30  .  sNC.pNext = 0
12fc0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
12fd0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
12fe0 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  &sNC, p->pLimit)
12ff0 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ||.      sqlite
13000 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
13010 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
13020 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
13030 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13040 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70    }..  /* Set up
13050 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
13060 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
13070 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  to ExprResolveNa
13080 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65  mes() to.  ** re
13090 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
130a0 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  sion-list..  */.
130b0 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d    sNC.allowAgg =
130c0 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69   1;.  sNC.pSrcLi
130d0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
130e0 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
130f0 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 4e 61 6d 65  erNC;..  /* Name
13100 43 6f 6e 74 65 78 74 2e 6e 44 65 70 74 68 20 73  Context.nDepth s
13110 74 6f 72 65 73 20 74 68 65 20 64 65 70 74 68 20  tores the depth 
13120 6f 66 20 72 65 63 75 72 73 69 6f 6e 20 66 6f 72  of recursion for
13130 20 74 68 69 73 20 71 75 65 72 79 2e 20 46 6f 72   this query. For
13140 0a 20 20 2a 2a 20 61 6e 20 6f 75 74 65 72 20 71  .  ** an outer q
13150 75 65 72 79 20 28 65 2e 67 2e 20 53 45 4c 45 43  uery (e.g. SELEC
13160 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
13170 6d 61 73 74 65 72 29 20 74 68 69 73 20 69 73 20  master) this is 
13180 31 2e 20 46 6f 72 0a 20 20 2a 2a 20 61 20 73 75  1. For.  ** a su
13190 62 71 75 65 72 79 20 69 74 20 69 73 20 32 2e 20  bquery it is 2. 
131a0 46 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 6f  For a subquery o
131b0 66 20 61 20 73 75 62 71 75 65 72 79 2c 20 33 2e  f a subquery, 3.
131c0 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 0a 20 20 2a   And so on. .  *
131d0 2a 20 50 61 72 73 65 2e 6e 4d 61 78 44 65 70 74  * Parse.nMaxDept
131e0 68 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  h is the maximum
131f0 20 64 65 70 74 68 20 66 6f 72 20 61 6e 79 20 73   depth for any s
13200 75 62 71 75 65 72 79 20 72 65 73 6f 6c 76 65 64  ubquery resolved
13210 20 73 6f 0a 20 20 2a 2a 20 66 61 72 2e 20 54 68   so.  ** far. Th
13220 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  is is used to de
13230 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62  termine the numb
13240 65 72 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  er of aggregate 
13250 63 6f 6e 74 65 78 74 73 0a 20 20 2a 2a 20 72 65  contexts.  ** re
13260 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d  quired at runtim
13270 65 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 6e 44  e..  */.  sNC.nD
13280 65 70 74 68 20 3d 20 28 70 4f 75 74 65 72 4e 43  epth = (pOuterNC
13290 3f 70 4f 75 74 65 72 4e 43 2d 3e 6e 44 65 70 74  ?pOuterNC->nDept
132a0 68 2b 31 3a 31 29 3b 0a 20 20 69 66 28 20 73 4e  h+1:1);.  if( sN
132b0 43 2e 6e 44 65 70 74 68 3e 70 50 61 72 73 65 2d  C.nDepth>pParse-
132c0 3e 6e 4d 61 78 44 65 70 74 68 20 29 7b 0a 20 20  >nMaxDepth ){.  
132d0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65    pParse->nMaxDe
132e0 70 74 68 20 3d 20 73 4e 43 2e 6e 44 65 70 74 68  pth = sNC.nDepth
132f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
13300 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  lve names in the
13310 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a   result set. */.
13320 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
13330 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c  List;.  if( !pEL
13340 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
13350 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  ITE_ERROR;.  for
13360 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
13370 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13380 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
13390 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
133a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
133b0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
133c0 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
133d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
133e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
133f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
13400 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
13410 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
13420 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
13430 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
13440 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
13450 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67   do not allow ag
13460 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20  gregates in any 
13470 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  of the other exp
13480 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
13490 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41   assert( !p->isA
134a0 67 67 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  gg );.  if( p->p
134b0 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
134c0 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
134d0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
134e0 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
134f0 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
13500 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
13510 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
13520 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
13530 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
13540 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
13550 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
13560 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  & !p->pGroupBy )
13570 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13580 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
13590 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
135a0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
135b0 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
135c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
135d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
135e0 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73   Add the express
135f0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ion list to the 
13600 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
13610 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
13620 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65    ** other expre
13630 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45  ssions in the SE
13640 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
13650 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a  This is so that.
13660 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
13670 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
13680 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
13690 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
136a0 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69  ions by.  ** ali
136b0 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
136c0 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  lt set..  **.  *
136d0 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
136e0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
136f0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
13700 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
13710 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
13720 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
13730 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  ence to it..  */
13740 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20  .  sNC.pEList = 
13750 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
13760 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
13770 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
13780 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20  ->pWhere) ||.   
13790 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
137a0 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
137b0 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c 7c 0a   p->pHaving) ||.
137c0 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64        processOrd
137d0 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20  erGroupBy(&sNC, 
137e0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
137f0 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 70  DER") ||.      p
13800 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
13810 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 47 72 6f  By(&sNC, p->pGro
13820 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a 20  upBy, "GROUP"). 
13830 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13840 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
13850 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
13860 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
13870 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13880 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
13890 63 74 20 69 73 20 75 73 65 64 20 62 79 20 73 71  ct is used by sq
138a0 6c 69 74 65 33 53 65 6c 65 63 74 28 29 0a 2a 2a  lite3Select().**
138b0 20 74 6f 20 73 61 76 65 20 61 67 67 72 65 67 61   to save aggrega
138c0 74 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72  te related infor
138d0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
138e0 50 61 72 73 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  Parse object.** 
138f0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
13900 65 61 63 68 20 63 61 6c 6c 20 61 6e 64 20 74 6f  each call and to
13910 20 72 65 73 74 6f 72 65 20 69 74 20 61 74 20 74   restore it at t
13920 68 65 20 65 6e 64 2e 20 53 65 65 0a 2a 2a 20 73  he end. See.** s
13930 61 76 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  aveAggregateInfo
13940 28 29 20 61 6e 64 20 72 65 73 74 6f 72 65 41 67  () and restoreAg
13950 67 72 65 67 61 74 65 49 6e 66 6f 28 29 2e 0a 2a  gregateInfo()..*
13960 2f 20 0a 73 74 72 75 63 74 20 41 67 67 72 65 67  / .struct Aggreg
13970 61 74 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  ateInfo {.  int 
13980 6e 41 67 67 3b 0a 20 20 41 67 67 45 78 70 72 20  nAgg;.  AggExpr 
13990 2a 61 41 67 67 3b 0a 7d 3b 0a 74 79 70 65 64 65  *aAgg;.};.typede
139a0 66 20 73 74 72 75 63 74 20 41 67 67 72 65 67 61  f struct Aggrega
139b0 74 65 49 6e 66 6f 20 41 67 67 72 65 67 61 74 65  teInfo Aggregate
139c0 49 6e 66 6f 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 6f  Info;../* .** Co
139d0 70 79 20 61 67 67 72 65 67 61 74 65 20 72 65 6c  py aggregate rel
139e0 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ated information
139f0 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20   from the Parse 
13a00 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 6e 74  structure.** int
13a10 6f 20 74 68 65 20 41 67 67 72 65 67 61 74 65 49  o the AggregateI
13a20 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 5a  nfo structure. Z
13a30 65 72 6f 20 74 68 65 20 61 67 67 72 65 67 61 74  ero the aggregat
13a40 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 76 61 6c  e related.** val
13a50 75 65 73 20 69 6e 20 74 68 65 20 50 61 72 73 65  ues in the Parse
13a60 20 73 74 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74   struct..*/.stat
13a70 69 63 20 76 6f 69 64 20 73 61 76 65 41 67 67 72  ic void saveAggr
13a80 65 67 61 74 65 49 6e 66 6f 28 50 61 72 73 65 20  egateInfo(Parse 
13a90 2a 70 50 61 72 73 65 2c 20 41 67 67 72 65 67 61  *pParse, Aggrega
13aa0 74 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  teInfo *pInfo){.
13ab0 20 20 70 49 6e 66 6f 2d 3e 61 41 67 67 20 3d 20    pInfo->aAgg = 
13ac0 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20  pParse->aAgg;.  
13ad0 70 49 6e 66 6f 2d 3e 6e 41 67 67 20 3d 20 70 50  pInfo->nAgg = pP
13ae0 61 72 73 65 2d 3e 6e 41 67 67 3b 0a 20 20 70 50  arse->nAgg;.  pP
13af0 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a  arse->aAgg = 0;.
13b00 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
13b10 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70   0;.}../*.** Cop
13b20 79 20 61 67 67 72 65 67 61 74 65 20 72 65 6c 61  y aggregate rela
13b30 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
13b40 66 72 6f 6d 20 74 68 65 20 41 67 67 72 65 67 61  from the Aggrega
13b50 74 65 49 6e 66 6f 20 73 74 72 75 63 74 0a 2a 2a  teInfo struct.**
13b60 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 50   back into the P
13b70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  arse structure. 
13b80 54 68 65 20 61 67 67 72 65 67 61 74 65 20 72 65  The aggregate re
13b90 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  lated informatio
13ba0 6e 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 73  n.** currently s
13bb0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 72  tored in the Par
13bc0 73 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  se structure is 
13bd0 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
13be0 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65 41  ic void restoreA
13bf0 67 67 72 65 67 61 74 65 49 6e 66 6f 28 50 61 72  ggregateInfo(Par
13c00 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 72  se *pParse, Aggr
13c10 65 67 61 74 65 49 6e 66 6f 20 2a 70 49 6e 66 6f  egateInfo *pInfo
13c20 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
13c30 70 50 61 72 73 65 2d 3e 61 41 67 67 29 3b 0a 20  pParse->aAgg);. 
13c40 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20   pParse->aAgg = 
13c50 70 49 6e 66 6f 2d 3e 61 41 67 67 3b 0a 20 20 70  pInfo->aAgg;.  p
13c60 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 70 49  Parse->nAgg = pI
13c70 6e 66 6f 2d 3e 6e 41 67 67 3b 0a 7d 0a 20 20 0a  nfo->nAgg;.}.  .
13c80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13c90 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
13ca0 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
13cb0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
13cc0 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
13cd0 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
13ce0 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
13cf0 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
13d00 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
13d10 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
13d20 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
13d30 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
13d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
13d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
13d80 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
13d90 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
13da0 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
13db0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
13dc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
13dd0 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
13de0 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
13df0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
13e00 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
13e10 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
13e20 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
13e30 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72  ys of table iPar
13e40 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
13e50 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
13e60 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
13e70 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
13e80 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
13e90 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
13ea0 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
13eb0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
13ec0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13ed0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
13ee0 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
13ef0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
13f00 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
13f10 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54  le iParm.**.** T
13f20 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69  he table above i
13f30 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41  s incomplete.  A
13f40 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20  dditional eDist 
13f50 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64  value have be ad
13f60 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69  ded.** since thi
13f70 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72  s comment was wr
13f80 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20  itten.  See the 
13f90 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
13fa0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a  ) function for.*
13fb0 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73  * a complete lis
13fc0 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ting of the allo
13fd0 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
13fe0 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
13ff0 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
14000 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
14010 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
14020 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
14030 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
14040 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
14050 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
14060 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
14070 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
14080 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
14090 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
140a0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
140b0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
140c0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
140d0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
140e0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
140f0 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
14100 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
14110 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
14120 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
14130 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
14140 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
14150 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
14160 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
14170 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
14180 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
14190 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
141a0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
141b0 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
141c0 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
141d0 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
141e0 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
141f0 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
14200 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
14210 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
14220 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
14230 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
14240 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
14250 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
14260 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
14270 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
14280 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
14290 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
142a0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
142b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
142c0 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
142d0 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
142e0 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
142f0 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
14300 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
14310 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
14320 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
14330 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
14370 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
14380 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
14390 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
143a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
143b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
143c0 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
143d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
143e0 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
143f0 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
14400 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
14410 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
14420 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
14430 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
14440 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
14450 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
14460 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
14470 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
14480 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
14490 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
144a0 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
144b0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
144c0 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
144d0 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
144e0 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
144f0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
14500 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
14510 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
14520 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
14530 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
14540 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
14550 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
14560 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
14570 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
14580 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
14590 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
145a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
145b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
145c0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
145d0 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
145e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
145f0 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
14600 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
14610 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
14620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
14630 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
14640 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
14650 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
14660 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
14670 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
14680 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
14690 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
146a0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
146b0 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
146c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
146d0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
146e0 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
146f0 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
14700 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
14710 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
14720 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
14730 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
14740 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
14750 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
14760 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
14770 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
14780 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
14790 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
147a0 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  o;.  Vdbe *v;.  
147b0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
147c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
147d0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
147e0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
147f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14800 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
14810 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
14820 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
14830 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
14840 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
14850 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
14860 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
14870 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
14880 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
14890 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
148a0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
148b0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
148c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
148d0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
148e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
148f0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
14900 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
14910 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
14920 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
14930 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
14940 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
14950 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
14960 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
14970 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  isDistinct;     
14980 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
14990 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
149a0 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
149b0 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b  .  int distinct;
149c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
149d0 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  le to use for th
149e0 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a  e distinct set *
149f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
14a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
14a10 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
14a20 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
14a30 20 2a 2f 0a 20 20 41 67 67 72 65 67 61 74 65 49   */.  AggregateI
14a40 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 0a 0a 20  nfo sAggInfo;.. 
14a50 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
14a60 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50  loc_failed || pP
14a70 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d  arse->nErr || p=
14a80 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
14a90 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14aa0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
14ab0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
14ac0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
14ad0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
14ae0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
14af0 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
14b00 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
14b10 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
14b20 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
14b30 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
14b40 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
14b50 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
14b60 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
14b70 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
14b80 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Parm, aff);.  }.
14b90 23 65 6e 64 69 66 0a 0a 20 20 73 61 76 65 41 67  #endif..  saveAg
14ba0 67 72 65 67 61 74 65 49 6e 66 6f 28 70 50 61 72  gregateInfo(pPar
14bb0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
14bc0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
14bd0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
14be0 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
14bf0 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 45   || eDest==SRT_E
14c00 78 63 65 70 74 20 7c 7c 20 65 44 65 73 74 3d 3d  xcept || eDest==
14c10 53 52 54 5f 44 69 73 63 61 72 64 20 29 7b 0a 20  SRT_Discard ){. 
14c20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
14c30 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
14c40 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
14c50 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ve(pParse, p, 0)
14c60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
14c70 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
14c80 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
14c90 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  derBy;..  /* Mak
14ca0 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f  e local copies o
14cb0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
14cc0 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
14cd0 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  .  */.  pTabList
14ce0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57   = p->pSrc;.  pW
14cf0 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
14d00 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
14d10 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
14d20 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
14d30 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70 2d  ng;.  isAgg = p-
14d40 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73 74  >isAgg;.  isDist
14d50 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
14d60 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d  inct;.  pEList =
14d70 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
14d80 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f  ( pEList==0 ) go
14d90 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
14da0 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
14db0 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
14dc0 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
14dd0 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
14de0 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
14df0 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
14e00 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
14e10 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
14e20 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
14e30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
14e40 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
14e50 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
14e60 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
14e70 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
14e80 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
14e90 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
14ea0 61 73 73 65 72 74 28 20 65 44 65 73 74 21 3d 53  assert( eDest!=S
14eb0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 45 4c  RT_Exists || pEL
14ec0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ist->nExpr==1 );
14ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14ee0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
14ef0 69 66 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f  if( (eDest==SRT_
14f00 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Mem || eDest==SR
14f10 54 5f 53 65 74 29 20 26 26 20 70 45 4c 69 73 74  T_Set) && pEList
14f20 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20  ->nExpr>1 ){.   
14f30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14f40 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
14f50 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
14f60 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
14f70 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
14f80 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
14f90 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
14fa0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
14fb0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
14fc0 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
14fd0 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d   ignored for som
14fe0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a  e destinations..
14ff0 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 65    */.  switch( e
15000 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
15010 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20   SRT_Union:.    
15020 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
15030 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
15040 73 63 61 72 64 3a 0a 20 20 20 20 20 20 70 4f 72  scard:.      pOr
15050 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
15060 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
15070 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ult:.      break
15080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
15090 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
150a0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
150b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
150c0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
150d0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
150e0 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd;..  /* Identi
150f0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
15100 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
15110 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
15120 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
15130 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
15140 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
15150 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
15160 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
15170 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
15180 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
15190 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
151a0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
151b0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
151c0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
151d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
151e0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
151f0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
15200 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
15210 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
15220 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
15230 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
15240 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
15250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
15260 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
15270 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
15280 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
15290 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
152a0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
152b0 65 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  ext;..    if( pT
152c0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  abList->a[i].pSe
152d0 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
152e0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ue;.    if( pTab
152f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
15300 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61  !=0 ){.      zSa
15310 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
15320 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
15330 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61  ntext;.      pPa
15340 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
15350 74 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  t = pTabList->a[
15360 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
15370 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
15380 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  xt = 1;.    }els
15390 65 7b 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73  e{.      needRes
153a0 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b  toreContext = 0;
153b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
153c0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
153d0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
153e0 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 65 6d  pSelect, SRT_Tem
153f0 70 54 61 62 6c 65 2c 20 0a 20 20 20 20 20 20 20  pTable, .       
15400 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69            pTabLi
15410 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
15420 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20  , p, i, &isAgg, 
15430 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  0);.    if( need
15440 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29  RestoreContext )
15450 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
15460 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
15470 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
15480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
15490 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
154a0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
154b0 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20  pWhere;.    if( 
154c0 65 44 65 73 74 21 3d 53 52 54 5f 55 6e 69 6f 6e  eDest!=SRT_Union
154d0 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45   && eDest!=SRT_E
154e0 78 63 65 70 74 20 26 26 20 65 44 65 73 74 21 3d  xcept && eDest!=
154f0 53 52 54 5f 44 69 73 63 61 72 64 20 29 7b 0a 20  SRT_Discard ){. 
15500 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
15510 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
15520 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20   }.    pGroupBy 
15530 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
15540 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e     pHaving = p->
15550 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44  pHaving;.    isD
15560 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
15570 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e  istinct;.  }.#en
15580 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  dif..  /* Check 
15590 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20  for the special 
155a0 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20  case of a min() 
155b0 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
155c0 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a  n by itself.  **
155d0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
155e0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  et..  */.  if( s
155f0 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79  impleMinMaxQuery
15600 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
15610 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20  t, iParm) ){.   
15620 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74   rc = 0;.    got
15630 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
15640 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
15650 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
15660 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  a subquery that 
15670 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65  can be "flattene
15680 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  d" into its pare
15690 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74  nt..  ** If flat
156a0 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73  tening is a poss
156b0 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e  iblity, do so an
156c0 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
156d0 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66  tely.  .  */.#if
156e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
156f0 5f 56 49 45 57 0a 20 20 69 66 28 20 70 50 61 72  _VIEW.  if( pPar
15700 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67  ent && pParentAg
15710 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74  g &&.      flatt
15720 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
15730 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  e, pParent, pare
15740 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41  ntTab, *pParentA
15750 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20  gg, isAgg) ){.  
15760 20 20 69 66 28 20 69 73 41 67 67 20 29 20 2a 70    if( isAgg ) *p
15770 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20  ParentAgg = 1;. 
15780 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
15790 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
157a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
157b0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
157c0 75 73 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79  use, resolve any
157d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
157e0 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20  nces.  ** names 
157f0 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 65  that have been e
15800 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
15810 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ied..  */.  if( 
15820 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
15830 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
15840 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
15850 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
15860 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  erBy->a[i].zName
15870 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64   ){.        pOrd
15880 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
15890 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20 20 20 20  ->pColl = .     
158a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
158b0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
158c0 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
158d0 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  i].zName, -1);. 
158e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
158f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
15900 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r ){.      goto 
15910 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15920 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
15930 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
15940 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
15950 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15960 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  , p);..  /* If t
15970 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
15980 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
15990 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
159a0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
159b0 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
159c0 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
159d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
159e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
159f0 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20 30 29 3b  Temp, iParm, 0);
15a00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15a10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
15a20 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d  umColumns, iParm
15a30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
15a40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61  ;.  }..  /* Do a
15a50 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67  n analysis of ag
15a60 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69  gregate expressi
15a70 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
15a80 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42  isAgg || pGroupB
15a90 79 20 29 7b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  y ){.    NameCon
15aa0 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d 65  text sNC;.    me
15ab0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
15ac0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
15ad0 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
15ae0 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
15af0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
15b00 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
15b10 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29  Parse->nAgg==0 )
15b20 3b 0a 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b  ;.    isAgg = 1;
15b30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15b40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
15b50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
15b60 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
15b70 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
15b80 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
15b90 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
15ba0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15bc0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
15bd0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
15be0 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
15bf0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15c00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
15c10 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
15c20 61 74 65 73 28 26 73 4e 43 2c 20 70 47 72 6f 75  ates(&sNC, pGrou
15c30 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  pBy->a[i].pExpr)
15c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
15c50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
15c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15c80 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
15c90 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
15ca0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
15cb0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
15cc0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15cd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
15ce0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
15cf0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
15d00 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
15d10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
15d20 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
15d30 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
15d40 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
15d50 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
15d60 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
15d70 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
15d80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15d90 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65  ..  /* Reset the
15da0 20 61 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f   aggregator.  */
15db0 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a  .  if( isAgg ){.
15dc0 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
15dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15de0 76 2c 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20  v, OP_AggReset, 
15df0 28 70 47 72 6f 75 70 42 79 3f 30 3a 31 29 2c 20  (pGroupBy?0:1), 
15e00 70 50 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20  pParse->nAgg);. 
15e10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
15e20 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
15e30 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
15e40 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66  *pFunc;.      if
15e50 28 20 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73  ( (pFunc = pPars
15e60 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63  e->aAgg[i].pFunc
15e70 29 21 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78  )!=0 && pFunc->x
15e80 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
15e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15ea0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 49  beOp3(v, OP_AggI
15eb0 6e 69 74 2c 20 30 2c 20 69 2c 20 28 63 68 61 72  nit, 0, i, (char
15ec0 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  *)pFunc, P3_FUNC
15ed0 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DEF);.      }.  
15ee0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
15ef0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
15f00 74 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 4b 65  t sz = sizeof(Ke
15f10 79 49 6e 66 6f 29 20 2b 20 70 47 72 6f 75 70 42  yInfo) + pGroupB
15f20 79 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  y->nExpr*sizeof(
15f30 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 20 20 20  CollSeq*);.     
15f40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
15f50 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69   (KeyInfo *)sqli
15f60 74 65 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20  teMalloc(sz);.  
15f70 20 20 20 20 69 66 28 20 30 3d 3d 70 4b 65 79 20      if( 0==pKey 
15f80 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15f90 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15fa0 20 20 7d 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e    }.      pKey->
15fb0 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
15fc0 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 70 4b 65  ->enc;.      pKe
15fd0 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 47 72 6f  y->nField = pGro
15fe0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
15ff0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
16000 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
16010 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
16020 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
16030 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
16040 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
16050 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
16060 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4b 65          if( !pKe
16070 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  y->aColl[i] ){. 
16080 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61           pKey->a
16090 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65  Coll[i] = pParse
160a0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
160b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
160c0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
160d0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
160e0 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29 70 4b  addr, (char *)pK
160f0 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
16100 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20  ANDOFF);.    }. 
16110 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
16120 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ize the memory c
16130 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20  ell to NULL for 
16140 53 52 54 5f 4d 65 6d 20 6f 72 20 30 20 66 6f 72  SRT_Mem or 0 for
16150 20 53 52 54 5f 45 78 69 73 74 73 0a 20 20 2a 2f   SRT_Exists.  */
16160 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
16170 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
16180 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
16190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
161a0 4f 70 28 76 2c 20 65 44 65 73 74 3d 3d 53 52 54  Op(v, eDest==SRT
161b0 5f 4d 65 6d 20 3f 20 4f 50 5f 53 74 72 69 6e 67  _Mem ? OP_String
161c0 38 20 3a 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  8 : OP_Integer, 
161d0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
161e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
161f0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
16200 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
16210 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
16220 79 20 74 61 62 6c 65 20 74 6f 20 75 73 65 20 66  y table to use f
16230 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
16240 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
16250 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
16260 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
16270 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
16280 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78 28 70   openTempIndex(p
16290 50 61 72 73 65 2c 20 70 2c 20 64 69 73 74 69 6e  Parse, p, distin
162a0 63 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ct, 0);.  }else{
162b0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
162c0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  -1;.  }..  /* Be
162d0 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
162e0 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49   scan.  */.  pWI
162f0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
16300 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
16310 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
16320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16340 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20 26 70  GroupBy ? 0 : &p
16350 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 46 65 74  OrderBy, p->pFet
16360 63 68 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  ch);.  if( pWInf
16370 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
16380 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73  ct_end;..  /* Us
16390 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
163a0 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20  nner loop if we 
163b0 61 72 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20  are not dealing 
163c0 77 69 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67  with.  ** aggreg
163d0 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ates.  */.  if( 
163e0 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66  !isAgg ){.    if
163f0 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
16400 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
16410 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
16420 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
16430 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
16440 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
16450 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
16460 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
16470 61 6b 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20  ak, aff) ){.    
16480 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
16490 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
164a0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 65   /* If we are de
164b0 61 6c 69 6e 67 20 77 69 74 68 20 61 67 67 72 65  aling with aggre
164c0 67 61 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74  gates, then do t
164d0 68 65 20 73 70 65 63 69 61 6c 20 61 67 67 72 65  he special aggre
164e0 67 61 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73  gate.  ** proces
164f0 73 69 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65  sing.  .  */.  e
16500 6c 73 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72  lse{.    AggExpr
16510 20 2a 70 41 67 67 3b 0a 20 20 20 20 69 6e 74 20   *pAgg;.    int 
16520 6c 62 6c 31 20 3d 20 30 3b 0a 20 20 20 20 70 50  lbl1 = 0;.    pP
16530 61 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 3d 20  arse->fillAgg = 
16540 31 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  1;.    if( pGrou
16550 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  pBy ){.      for
16560 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
16570 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
16580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16590 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
165a0 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
165b0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
165c0 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e 69      /* No affini
165d0 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 74 74  ty string is att
165e0 61 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f 6c  ached to the fol
165f0 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 52 65  lowing OP_MakeRe
16600 63 6f 72 64 20 0a 20 20 20 20 20 20 2a 2a 20 62  cord .      ** b
16610 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e 6f 74  ecause we do not
16620 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79 20   need to do any 
16630 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61 74 61  coercion of data
16640 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  types. */.      
16650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16660 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
16670 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  d, pGroupBy->nEx
16680 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62  pr, 0);.      lb
16690 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  l1 = sqlite3Vdbe
166a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
166b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
166c0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46 6f  ddOp(v, OP_AggFo
166d0 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20  cus, 0, lbl1);. 
166e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
166f0 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61  , pAgg=pParse->a
16700 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  Agg; i<pParse->n
16710 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b  Agg; i++, pAgg++
16720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 67  ){.      if( pAg
16730 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  g->isAgg ) conti
16740 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nue;.      sqlit
16750 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
16760 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72 29 3b  e, pAgg->pExpr);
16770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16780 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
16790 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20 20  gSet, 0, i);.   
167a0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 66   }.    pParse->f
167b0 69 6c 6c 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  illAgg = 0;.    
167c0 69 66 28 20 6c 62 6c 31 3c 30 20 29 7b 0a 20 20  if( lbl1<0 ){.  
167d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
167e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
167f0 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bl1);.    }.    
16800 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50  for(i=0, pAgg=pP
16810 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50  arse->aAgg; i<pP
16820 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c  arse->nAgg; i++,
16830 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20   pAgg++){.      
16840 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
16850 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
16860 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
16870 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 2d        if( !pAgg-
16880 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  >isAgg ) continu
16890 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
168a0 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30 20   pAgg->pFunc!=0 
168b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
168c0 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78 53   pAgg->pFunc->xS
168d0 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tep!=0 );.      
168e0 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46 75  pDef = pAgg->pFu
168f0 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  nc;.      pE = p
16900 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  Agg->pExpr;.    
16910 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
16920 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16930 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f   pE->op==TK_AGG_
16940 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
16950 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65    nExpr = sqlite
16960 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
16970 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
16980 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ist);.      sqli
16990 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
169a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
169b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
169c0 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
169d0 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
169e0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
169f0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
16a00 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21 70       for(j=0; !p
16a10 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72 3b  Coll && j<nExpr;
16a20 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
16a30 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
16a40 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
16a50 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 61  se, pE->pList->a
16a60 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
16a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16a80 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
16a90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
16aa0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
16ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
16ac0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
16ad0 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
16ae0 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  oll, P3_COLLSEQ)
16af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16b00 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
16b10 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30 2c  , OP_AggFunc, 0,
16b20 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70   nExpr, (char*)p
16b30 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  Def, P3_POINTER)
16b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16b50 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
16b60 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
16b70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
16b80 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
16b90 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70 72   /* If we are pr
16ba0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
16bb0 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  tes, we need to 
16bc0 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64 20  set up a second 
16bd0 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20 61  loop.  ** over a
16be0 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  ll of the aggreg
16bf0 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20 70  ate values and p
16c00 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20 2a  rocess them..  *
16c10 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29 7b  /.  if( isAgg ){
16c20 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67 20  .    int endagg 
16c30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16c40 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
16c50 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20 20  nt startagg;.   
16c60 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c 69   startagg = sqli
16c70 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16c80 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20 65  OP_AggNext, 0, e
16c90 6e 64 61 67 67 29 3b 0a 20 20 20 20 69 66 28 20  ndagg);.    if( 
16ca0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
16cb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
16cc0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
16cd0 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20 31  ing, startagg, 1
16ce0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16cf0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
16d00 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
16d10 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
16d20 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44  By, distinct, eD
16d30 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
16d40 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20           iParm, 
16d50 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67 67  startagg, endagg
16d60 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
16d70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
16d80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16d90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16da0 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72 74  P_Goto, 0, start
16db0 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
16dc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16dd0 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20  l(v, endagg);.  
16de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16df0 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  Op(v, OP_Noop, 0
16e00 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
16e10 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
16e20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
16e30 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
16e40 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
16e50 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
16e60 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
16e70 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
16e80 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
16e90 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  rBy ){.    gener
16ea0 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
16eb0 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
16ec0 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20  ->nExpr, eDest, 
16ed0 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66  iParm);.  }..#if
16ee0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16ef0 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49  _SUBQUERY.  /* I
16f00 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62  f this was a sub
16f10 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e  query, we have n
16f20 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65  ow converted the
16f30 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61   subquery into a
16f40 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
16f50 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74  table.  So delet
16f60 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 73  e the subquery s
16f70 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
16f80 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f  e parent.  ** to
16f90 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73 75   prevent this su
16fa0 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e  bquery from bein
16fb0 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61 69  g evaluated agai
16fc0 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74  n and to force t
16fd0 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20  he.  ** the use 
16fe0 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
16ff0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
17000 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  f( pParent ){.  
17010 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
17020 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61  t->pSrc->nSrc>pa
17030 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61  rentTab );.    a
17040 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
17050 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
17060 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b  b].pSelect==p );
17070 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
17080 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20  ctDelete(p);.   
17090 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e   pParent->pSrc->
170a0 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65  a[parentTab].pSe
170b0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  lect = 0;.  }.#e
170c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20 53  ndif..  /* The S
170d0 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
170e0 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
170f0 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
17100 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
17110 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
17120 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
17130 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
17140 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
17150 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
17160 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
17170 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
17180 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
17190 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
171a0 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
171b0 0a 20 20 72 65 73 74 6f 72 65 41 67 67 72 65 67  .  restoreAggreg
171c0 61 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ateInfo(pParse, 
171d0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 72 65  &sAggInfo);.  re
171e0 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.