/ Hex Artifact Content
Login

Artifact f441648eb191dcf1e67ae61475ea3b40a0eeb787:


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 35 34  select.c,v 1.254
0200: 20 32 30 30 35 2f 30 38 2f 31 34 20 32 30 3a 34   2005/08/14 20:4
0210: 37 3a 31 36 20 64 72 68 20 45 78 70 20 24 0a 2a  7:16 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 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0ab0: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0ac0: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0ad0: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0ae0: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0af0: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b00: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b10: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b20: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0b30: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0b40: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0b50: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0b60: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0b70: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0b80: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0b90: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0ba0: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0bb0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0bc0: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0bd0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0be0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
0bf0: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
0c00: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
0c10: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
0c20: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
0c30: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
0c40: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
0c50: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
0c60: 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65  j=0; j<sizeof(ke
0c70: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0c80: 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b  eywords[0]); j++
0c90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
0ca0: 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e  n==keywords[j].n
0cb0: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
0cc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
0cd0: 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  mp(p->z, keyword
0ce0: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
0cf0: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
0d00: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
0d10: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
0d20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
0d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0d40: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
0d50: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0d60: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
0d70: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
0d80: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
0d90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0da0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
0db0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
0dc0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
0dd0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
0de0: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
0df0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
0e00: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
0e10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
0e20: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
0e30: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
0e40: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0e50: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
0e60: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
0e70: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
0e80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0e90: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
0ea0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0eb0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
0ec0: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
0ed0: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
0ee0: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
0ef0: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
0f10: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
0f20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0f30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0f40: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
0f50: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
0f60: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
0f70: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
0f80: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0f90: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
0fa0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
0fb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0fc0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
0fd0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
0fe0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
0ff0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1000: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1010: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1020: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1030: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1040: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1050: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1060: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1070: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
1080: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1090: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
10a0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
10b0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
10c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
10d0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
10e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
10f0: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
1100: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1110: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
1120: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
1130: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
1140: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a   *z){.  p->z = z
1150: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65  ;.  p->n = strle
1160: 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d  n(z);.  p->dyn =
1170: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
1180: 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1190: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64  n node for an id
11a0: 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 68  entifier with th
11b0: 65 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a  e name of zName.
11c0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
11d0: 63 72 65 61 74 65 49 64 45 78 70 72 28 63 6f 6e  createIdExpr(con
11e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
11f0: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1200: 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d    setToken(&dumm
1210: 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  y, zName);.  ret
1220: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
1230: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
1240: 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  mmy);.}.../*.** 
1250: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
1260: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
1270: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
1280: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
1290: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
12a0: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
12b0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
12c0: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
12d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
12e0: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e  WhereTerm(.  con
12f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1300: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1310: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1320: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1330: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
1340: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
1350: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
1360: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
1370: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
1380: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1390: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
13a0: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
13b0: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
13c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
13d0: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
13e0: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
13f0: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1400: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  L */.  Expr **pp
1410: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1420: 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c  /* Add the equal
1430: 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73  ity term to this
1440: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
1450: 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20  {.  Expr *pE1a, 
1460: 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20  *pE1b, *pE1c;.  
1470: 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32  Expr *pE2a, *pE2
1480: 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72  b, *pE2c;.  Expr
1490: 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20   *pE;..  pE1a = 
14a0: 63 72 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f  createIdExpr(zCo
14b0: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 63 72 65  l);.  pE2a = cre
14c0: 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b  ateIdExpr(zCol);
14d0: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d  .  if( zAlias1==
14e0: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31  0 ){.    zAlias1
14f0: 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b   = pTab1->zName;
1500: 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 63 72  .  }.  pE1b = cr
1510: 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61  eateIdExpr(zAlia
1520: 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  s1);.  if( zAlia
1530: 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s2==0 ){.    zAl
1540: 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e  ias2 = pTab2->zN
1550: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20  ame;.  }.  pE2b 
1560: 3d 20 63 72 65 61 74 65 49 64 45 78 70 72 28 7a  = createIdExpr(z
1570: 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20  Alias2);.  pE1c 
1580: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1590: 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61  _DOT, pE1b, pE1a
15a0: 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73  , 0);.  pE2c = s
15b0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
15c0: 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30  T, pE2b, pE2a, 0
15d0: 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65  );.  pE = sqlite
15e0: 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70 45 31  3Expr(TK_EQ, pE1
15f0: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 45  c, pE2c, 0);.  E
1600: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1610: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  E, EP_FromJoin);
1620: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c  .  *ppExpr = sql
1630: 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70 45  ite3ExprAnd(*ppE
1640: 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, pE);.}../*.
1650: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1660: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1670: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1680: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1690: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
16a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
16b0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
16c0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
16d0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
16e0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
16f0: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
1700: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1710: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1720: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1730: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
1740: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
1750: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
1760: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
1770: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
1780: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
1790: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
17a0: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
17b0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
17c0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
17d0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
17e0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
17f0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
1800: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1810: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1820: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
1830: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
1840: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69  (Expr *p){.  whi
1850: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
1860: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
1870: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1880: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
1890: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d  >pLeft);.    p =
18a0: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
18b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18c0: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
18d0: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
18e0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
18f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1900: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1910: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1920: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1930: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1940: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
1950: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
1960: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
1970: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
1980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
1990: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
19a0: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
19b0: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
19c0: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
19d0: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
19e0: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
19f0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
1a00: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
1a10: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
1a20: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
1a30: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
1a40: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
1a50: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
1a60: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
1a70: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
1a80: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
1a90: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
1aa0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
1ab0: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
1ac0: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
1ad0: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
1ae0: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
1af0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
1b00: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1b10: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
1b20: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b30: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1b40: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
1b50: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1b60: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
1b70: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
1b80: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
1b90: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
1bc0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1bd0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
1be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c00: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
1c10: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c20: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
1c30: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
1c40: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
1c50: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c60: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
1c70: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
1c80: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
1c90: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1ca0: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
1cb0: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
1cc0: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
1cd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
1ce0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
1cf0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
1d00: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
1d10: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
1d20: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
1d30: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
1d40: 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  t->pTab;..    if
1d50: 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c  ( pLeftTab==0 ||
1d60: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20   pRightTab==0 ) 
1d70: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
1d80: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
1d90: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
1da0: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
1db0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
1dc0: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
1dd0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
1de0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
1df0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
1e00: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
1e10: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
1e20: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
1e30: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c  f( pLeft->pOn ||
1e40: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
1e50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1e70: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
1e80: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
1e90: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
1ea0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1eb0: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
1ec0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1ed0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
1ee0: 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43  ; j<pLeftTab->nC
1ef0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1f00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1f10: 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pLeftTab->aCol[j
1f20: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1f30: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
1f40: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
1f50: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1f60: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
1f70: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
1f80: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
1f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1fb0: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
1fc0: 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57  ->zAlias, &p->pW
1fd0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
1fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ff0: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
2000: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2010: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
2020: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
2030: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2040: 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70  >pOn && pLeft->p
2050: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
2060: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2070: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
2080: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
2090: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
20a0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
20b0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
20c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
20e0: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
20f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2100: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
2110: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
2120: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
2130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2140: 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20   pLeft->pOn ){. 
2150: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
2160: 28 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20  (pLeft->pOn);.  
2170: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
2180: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
2190: 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66 74 2d  ->pWhere, pLeft-
21a0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65  >pOn);.      pLe
21b0: 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ft->pOn = 0;.   
21c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
21d0: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
21e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
21f0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
2200: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
2210: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2220: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
2230: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
2240: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
2250: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
2260: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
2270: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
2280: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
2290: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
22a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
22b0: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
22c0: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
22d0: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
22e0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
22f0: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
2300: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
2310: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
2320: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
2330: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
2340: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
2350: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
2360: 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ft->pUsing ){.  
2370: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
2380: 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e  t = pLeft->pUsin
2390: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
23a0: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
23b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
23c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73  ar *zName = pLis
23d0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
23e0: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
23f0: 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c  nIndex(pLeftTab,
2400: 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c   zName)<0 || col
2410: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2420: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  ab, zName)<0 ){.
2430: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2440: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2450: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
2460: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
2470: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
2480: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
2490: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
24a0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
24b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
24c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24d0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a    addWhereTerm(z
24e0: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
24f0: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2520: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2530: 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65 72  Alias, &p->pWher
2540: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2550: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2570: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
2580: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
2590: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
25a0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
25b0: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
25c0: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
25d0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
25e0: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
25f0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2600: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
2610: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2620: 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73  te(p->pSrc);.  s
2630: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2640: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 73  (p->pWhere);.  s
2650: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2660: 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  lete(p->pGroupBy
2670: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2680: 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69 6e  Delete(p->pHavin
2690: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
26a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
26b0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
26c0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
26d0: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73 71  p->pPrior);.  sq
26e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
26f0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
2700: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2710: 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 73  p->pOffset);.  s
2720: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2730: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
2740: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
2750: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
2760: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
2770: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
2780: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
2790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27a0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
27b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 56  Parse *pParse, V
27c0: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
27d0: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 73   *pOrderBy){.  s
27e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
27f0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2800: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2810: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2820: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
2830: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20  OrderBy->nExpr, 
2840: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2860: 74 49 6e 73 65 72 74 2c 20 30 2c 20 30 29 3b 0a  tInsert, 0, 0);.
2870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
2880: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2890: 68 65 20 4f 46 46 53 45 54 20 61 6e 64 20 4c 49  he OFFSET and LI
28a0: 4d 49 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  MIT.*/.static vo
28b0: 69 64 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a  id codeLimiter(.
28c0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
28d0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
28e0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
28f0: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
2900: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2910: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2920: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
2930: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
2940: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
2950: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
2960: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rent record */. 
2970: 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20   int iBreak,    
2980: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2990: 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20  to end the loop 
29a0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20  */.  int nPop   
29b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29c0: 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70   of times to pop
29d0: 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70   stack when jump
29e0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
29f0: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b  p->iOffset>=0 ){
2a00: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20  .    int addr = 
2a10: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2a20: 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
2a30: 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20     if( nPop>0 ) 
2a40: 61 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  addr++;.    sqli
2a50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2a60: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
2a70: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
2a80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a90: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
2aa0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
2ab0: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70  r);.    if( nPop
2ac0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
2ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2ae0: 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29  OP_Pop, nPop, 0)
2af0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2b00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2b10: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2b20: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
2b30: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
2b40: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
2b50: 64 73 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ds"));.  }.  if(
2b60: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
2b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
2b90: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
2ba0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  iBreak);.    Vdb
2bb0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
2bc0: 65 78 69 74 20 77 68 65 6e 20 4c 49 4d 49 54 20  exit when LIMIT 
2bd0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a  reached"));.  }.
2be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2bf0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
2c00: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
2c10: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
2c20: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
2c30: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
2c40: 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43  If srcTab and nC
2c50: 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a  olumn are both z
2c60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ero, then the pE
2c70: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
2c80: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
2c90: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
2ca0: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
2cb0: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f  his row.  If nCo
2cc0: 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64  lumn>0.** then d
2cd0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
2ce0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
2cf0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
2d00: 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20  y to get the.** 
2d10: 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61  datatypes for ea
2d20: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
2d30: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49  atic int selectI
2d40: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
2d50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2d60: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2d70: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2d80: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2da0: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
2db0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2dc0: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
2dd0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
2de0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
2df0: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
2e00: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
2e10: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
2e20: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
2e30: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
2e40: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e60: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
2e70: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
2e80: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
2e90: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
2ea0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
2eb0: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
2ec0: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
2ed0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
2ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
2ef0: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
2f00: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
2f10: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ct */.  int eDes
2f20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2f30: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
2f40: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
2f50: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f70: 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   An argument to 
2f80: 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  the disposal met
2f90: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  hod */.  int iCo
2fa0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
2fb0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2fc0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
2fd0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
2fe0: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20   iBreak,        
2ff0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3000: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
3010: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
3020: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3040: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
3050: 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54   if eDest is SRT
3060: 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  _Union */.){.  V
3070: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
3080: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
3090: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
30a0: 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
30b0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
30c0: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
30d0: 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20  esent */..  if( 
30e0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
30f0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
3100: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  t!=0 );..  /* If
3110: 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d   there was a LIM
3120: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  IT clause on the
3130: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3140: 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63  t, then do the c
3150: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
3160: 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f   if this row sho
3170: 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  uld be output.. 
3180: 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63   */.  hasDistinc
3190: 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20  t = distinct>=0 
31a0: 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  && pEList && pEL
31b0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20  ist->nExpr>0;.  
31c0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
31d0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
31e0: 29 7b 0a 20 20 20 20 63 6f 64 65 4c 69 6d 69 74  ){.    codeLimit
31f0: 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  er(v, p, iContin
3200: 75 65 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  ue, iBreak, 0);.
3210: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
3220: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
3230: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  umns..  */.  if(
3240: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
3250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
3260: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
3270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3280: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
3290: 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20   srcTab, i);.   
32a0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
32b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74  nColumn = pEList
32c0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c  ->nExpr;.    sql
32d0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
32e0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
32f0: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
3300: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
3310: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
3320: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
3330: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
3340: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
3350: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
3360: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
3370: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
3380: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
3390: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
33a0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
33b0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 4c  .    int n = pEL
33c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 23 69 66 20  ist->nExpr;.#if 
33d0: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
33e0: 49 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 33  INCT.    sqlite3
33f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3400: 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d  IsNull, -pEList-
3410: 3e 6e 45 78 70 72 2c 20 73 71 6c 69 74 65 33 56  >nExpr, sqlite3V
3420: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3430: 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  )+7);.#endif.   
3440: 20 2f 2a 20 44 65 6c 69 62 65 72 61 74 65 6c 79   /* Deliberately
3450: 20 6c 65 61 76 65 20 74 68 65 20 61 66 66 69 6e   leave the affin
3460: 69 74 79 20 73 74 72 69 6e 67 20 6f 66 66 20 6f  ity string off o
3470: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
3480: 20 20 20 20 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65      ** OP_MakeRe
3490: 63 6f 72 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cord */.    sqli
34a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
34b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d  OP_MakeRecord, -
34c0: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
34d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
34e0: 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74  P_Distinct, dist
34f0: 69 6e 63 74 2c 20 73 71 6c 69 74 65 33 56 64 62  inct, sqlite3Vdb
3500: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
3510: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
3520: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3530: 6f 70 2c 20 6e 2b 31 2c 20 30 29 3b 0a 20 20 20  op, n+1, 0);.   
3540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3550: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3560: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
3570: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
3580: 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69   "# skip indisti
3590: 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  nct records"));.
35a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
35c0: 73 65 72 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  sert, distinct, 
35d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  0);.    if( pOrd
35e0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
35f0: 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20   codeLimiter(v, 
3600: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42  p, iContinue, iB
3610: 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  reak, nColumn);.
3620: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
3630: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 23 69  tch( eDest ){.#i
3640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3650: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
3660: 54 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  T.    /* In this
3670: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
3680: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
3690: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
36a0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
36b0: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
36c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
36d0: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
36e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36f0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3700: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
3710: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3720: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3730: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
3740: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54  , -1, aff, P3_ST
3750: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
3760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3770: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
3780: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
37a0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
37b0: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
37c0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
37d0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
37e0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
37f0: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
3800: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
3810: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
3820: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
3830: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
3840: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
3850: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
3860: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
3870: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
3880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3890: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
38a0: 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41   nColumn, NULL_A
38b0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b  LWAYS_DISTINCT);
38c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
38d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
38e0: 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43  , aff, P3_STATIC
38f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3910: 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c  NotFound, iParm,
3920: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
3930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3940: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
3950: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3960: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3970: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72  dif..    /* Stor
3980: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
3990: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
39a0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
39b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
39c0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
39d0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
39e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
39f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3a00: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3a10: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3a20: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3a30: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3a40: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3a50: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3a60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3a70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3a80: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
3a90: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3aa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ab0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
3ac0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ae0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
3af0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3b10: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3b20: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3b30: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
3b40: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
3b50: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
3b60: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
3b70: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
3b80: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
3b90: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
3ba0: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
3bb0: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
3bc0: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
3bd0: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
3be0: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
3bf0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3c00: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
3c10: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
3c20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
3c30: 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  v);.      int ad
3c40: 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  dr2;..      asse
3c50: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3c60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3c70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
3c80: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
3c90: 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  1+3);.      sqli
3ca0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3cb0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
3cc0: 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c       addr2 = sql
3cd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ce0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
3cf0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3d00: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
3d10: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
3d20: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
3d30: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
3d40: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
3d50: 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26  f = (iParm>>16)&
3d60: 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66  0xFF;.        af
3d70: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
3d80: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
3d90: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
3da0: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ff);.        sql
3db0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
3dc0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
3dd0: 20 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20 20   0, &aff, 1);.  
3de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3df0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
3e00: 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30  Insert, (iParm&0
3e10: 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a  x0000FFFF), 0);.
3e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
3e30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3e40: 32 28 76 2c 20 61 64 64 72 32 2c 20 73 71 6c 69  2(v, addr2, sqli
3e50: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3e60: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 62 72  dr(v));.      br
3e70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3e80: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
3e90: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
3ea0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
3eb0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
3ec0: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
3ed0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
3ee0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
3ef0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
3f00: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
3f10: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
3f20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3f30: 20 53 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20   SRT_Exists:.   
3f40: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
3f50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
3f60: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
3f70: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3f80: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
3f90: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3fa0: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3fb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3fd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
3fe0: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
3ff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4000: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4010: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
4020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4030: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4040: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
4050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4060: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
4070: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
4080: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
4090: 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75  ction or to a su
40a0: 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68  broutine.  In th
40b0: 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66  e.    ** case of
40c0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74   a subroutine, t
40d0: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
40e0: 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69  self is responsi
40f0: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  ble for.    ** p
4100: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20  opping the data 
4110: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a  from the stack..
4120: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4130: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a  SRT_Subroutine:.
4140: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c      case SRT_Cal
4150: 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20  lback:.    case 
4160: 53 52 54 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20  SRT_Sorter: {.  
4170: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4180: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4190: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
41a0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
41b0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
41c0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
41d0: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
41e0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
41f0: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
4200: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
4210: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4220: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4230: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
4240: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4250: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4260: 65 44 65 73 74 21 3d 53 52 54 5f 53 6f 72 74 65  eDest!=SRT_Sorte
4270: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
4280: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4290: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43   OP_Callback, nC
42a0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
42b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
42c0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
42d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
42e0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
42f0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
4300: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
4310: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
4320: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
4330: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
4340: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
4350: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
4360: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
4370: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
4380: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
4390: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
43a0: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
43b0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
43c0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
43d0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
43e0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
43f0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
4400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
4410: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
4420: 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
4430: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4440: 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  P_Pop, nColumn, 
4450: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4460: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4470: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4480: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
4490: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
44a0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
44b0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
44c0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
44d0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
44e0: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
44f0: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
4500: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
4510: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
4520: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
4530: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
4540: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
4550: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
4560: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
4570: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
4580: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
4590: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
45a0: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
45b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
45c0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
45d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
45e0: 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  t *p,       /* T
45f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4600: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
4610: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e  ,         /* Gen
4620: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
4630: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
4640: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
4650: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
4660: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
4670: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
4680: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
4690: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
46a0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ere */.  int iPa
46b0: 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74  rm        /* Opt
46c0: 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  ional parameter 
46d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
46e0: 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eDest */.){.  in
46f0: 74 20 65 6e 64 31 20 3d 20 73 71 6c 69 74 65 33  t end1 = sqlite3
4700: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4710: 3b 0a 20 20 69 6e 74 20 65 6e 64 32 20 3d 20 73  ;.  int end2 = s
4720: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4730: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
4740: 64 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  dr;.  KeyInfo *p
4750: 49 6e 66 6f 3b 0a 20 20 45 78 70 72 4c 69 73 74  Info;.  ExprList
4760: 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e   *pOrderBy;.  in
4770: 74 20 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73 71 6c  t nCol, i;.  sql
4780: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4790: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65 44  e->db;..  if( eD
47a0: 65 73 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20  est==SRT_Sorter 
47b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72 64  ) return;.  pOrd
47c0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
47d0: 42 79 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f 72  By;.  nCol = pOr
47e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
47f0: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  pInfo = sqliteMa
4800: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
4810: 6e 66 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69 7a  nfo) + nCol*(siz
4820: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
4830: 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d   );.  if( pInfo=
4840: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
4850: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
4860: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 66 6f   = (char*)&pInfo
4870: 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20  ->aColl[nCol];. 
4880: 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d   pInfo->nField =
4890: 20 6e 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30   nCol;.  for(i=0
48a0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
48b0: 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 6c      /* If a coll
48c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
48d0: 61 73 20 73 70 65 63 69 66 69 65 64 20 65 78 70  as specified exp
48e0: 6c 69 63 69 74 79 2c 20 74 68 65 6e 20 69 74 0a  licity, then it.
48f0: 20 20 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64      ** is stored
4900: 20 69 6e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b   in pOrderBy->a[
4910: 69 5d 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65 72 77  i].zName. Otherw
4920: 69 73 65 2c 20 75 73 65 20 74 68 65 20 64 65 66  ise, use the def
4930: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c  ault.    ** coll
4940: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 74  ation type for t
4950: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  he expression.. 
4960: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
4970: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  >aColl[i] = sqli
4980: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
4990: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
49a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
49b0: 20 20 69 66 28 20 21 70 49 6e 66 6f 2d 3e 61 43    if( !pInfo->aC
49c0: 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
49d0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
49e0: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
49f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
4a00: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
4a10: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
4a20: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
4a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
4a40: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20  (v, OP_Sort, 0, 
4a50: 30 2c 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c  0, (char*)pInfo,
4a60: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
4a70: 4f 46 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  OFF);.  addr = s
4a80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4a90: 76 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20  v, OP_SortNext, 
4aa0: 30 2c 20 65 6e 64 31 29 3b 0a 20 20 63 6f 64 65  0, end1);.  code
4ab0: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 61 64  Limiter(v, p, ad
4ac0: 64 72 2c 20 65 6e 64 32 2c 20 31 29 3b 0a 20 20  dr, end2, 1);.  
4ad0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
4ae0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
4af0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
4b00: 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20  T_TempTable: {. 
4b10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4b20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
4b30: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b  owid, iParm, 0);
4b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4b50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4b60: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
4b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b80: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
4b90: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4ba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
4bb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4bc0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
4bd0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
4be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4bf0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c10: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
4c20: 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65   -1, sqlite3Vdbe
4c30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
4c40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4c50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4c60: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
4c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4c80: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4c90: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
4ca0: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
4cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4cc0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
4cd0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e 22  ecord, 1, 0, "n"
4ce0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
4cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d00: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
4d10: 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30  sert, (iParm&0x0
4d20: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
4d30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4d40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
4d50: 69 73 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53  ists:.    case S
4d60: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
4d70: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4d80: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
4d90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4da0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
4db0: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  rm, 1);.      sq
4dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4dd0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e  , OP_Goto, 0, en
4de0: 64 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d1);.      break
4df0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4e00: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
4e10: 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53  back:.    case S
4e20: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
4e30: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
4e40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4e50: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4e60: 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  er, p->pEList->n
4e70: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
4e80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e90: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
4ea0: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
4eb0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4ec0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
4ed0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4ee0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
4ef0: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
4f00: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
4f10: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
4f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4f30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
4f40: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
4f50: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
4f60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4f70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4f80: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
4f90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4fb0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
4fc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4fd0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
4fe0: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
4ff0: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
5000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5010: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
5020: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
5030: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  , 0, addr);.  sq
5040: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
5050: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a  Label(v, end2);.
5060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5070: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
5080: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
5090: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
50a0: 2c 20 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74  , end1);.  sqlit
50b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
50c0: 50 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20  P_SortReset, 0, 
50d0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  0);.}../*.** Ret
50e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
50f0: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
5100: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
5110: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
5120: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
5130: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
5140: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
5150: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
5160: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
5170: 20 49 66 20 74 68 65 20 64 65 63 6c 61 72 61 74   If the declarat
5180: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
5190: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
51a0: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
51b0: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
51c0: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
51d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
51e0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
51f0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a  n is a column..*
5200: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
5210: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
5220: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5230: 65 69 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d  either TEXT, NUM
5240: 45 52 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20  ERIC or ANY..** 
5250: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
5260: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
5270: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
5280: 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  R..*/.static con
5290: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
52a0: 79 70 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ype(NameContext 
52b0: 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
52c0: 72 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  r){.  char const
52d0: 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a   *zType;.  int j
52e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
52f0: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
5300: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
5310: 0a 0a 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53  ..  /* The TK_AS
5320: 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e   operator can on
5330: 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45  ly occur in ORDE
5340: 52 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20  R BY, GROUP BY, 
5350: 48 41 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64  HAVING,.  ** and
5360: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20   LIMIT clauses. 
5370: 20 42 75 74 20 70 45 78 70 72 20 6f 72 69 67 69   But pExpr origi
5380: 6e 61 74 65 73 20 69 6e 20 74 68 65 20 72 65 73  nates in the res
5390: 75 6c 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a  ult set of a.  *
53a0: 2a 20 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45  * SELECT.  So pE
53b0: 78 70 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f  xpr can never co
53c0: 6e 74 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72  ntain an AS oper
53d0: 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ator..  */.  ass
53e0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
53f0: 54 4b 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74  TK_AS );..  swit
5400: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
5410: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
5420: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62  UMN: {.      Tab
5430: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
5440: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
5450: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
5460: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
5470: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
5480: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
5490: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
54a0: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
54b0: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
54c0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
54d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
54e0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
54f0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
5500: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
5510: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
5520: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
5530: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
5540: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5550: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
5560: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
5570: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5580: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
5590: 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45         /* FIX ME
55a0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  :.        ** Thi
55b0: 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20  s can occurs if 
55c0: 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69  you have somethi
55d0: 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20  ng like "SELECT 
55e0: 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20  new.x;" inside. 
55f0: 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
5600: 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ger.  In other w
5610: 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66  ords, if you ref
5620: 65 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69  erence the speci
5630: 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20  al "new".       
5640: 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65   ** table in the
5650: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5660: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20   select.  We do 
5670: 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20  not have a good 
5680: 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  way.        ** t
5690: 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61  o find the actua
56a0: 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f  l table type, so
56b0: 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e   call it "TEXT".
56c0: 20 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79    This is really
56d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65  .        ** some
56e0: 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20  thing of a bug, 
56f0: 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f  but I do not kno
5700: 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e  w how to fix it.
5710: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
5720: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
5730: 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63   does not produc
5740: 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
5750: 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70  swer - it just p
5760: 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20  revents.        
5770: 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20  ** a segfault.  
5780: 53 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39  See ticket #1229
5790: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
57a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45       zType = "TE
57b0: 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65  XT";.        bre
57c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
57d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29    assert( pTab )
57e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
57f0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
5800: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
5810: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
5820: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
5830: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
5840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
5850: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
5860: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
5870: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5880: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
5890: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
58a0: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zType;.      }. 
58b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58c0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
58d0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
58e0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
58f0: 54 3a 20 7b 0a 20 20 20 20 20 20 4e 61 6d 65 43  T: {.      NameC
5900: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
5910: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
5920: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
5930: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
5940: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
5950: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
5960: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
5970: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
5980: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
5990: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
59a0: 2e 70 45 78 70 72 29 3b 20 0a 20 20 20 20 20 20  .pExpr); .      
59b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
59c0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
59d0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30  .      zType = 0
59e0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
59f0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
5a00: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5a10: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
5a20: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
5a30: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
5a40: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
5a50: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
5a60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
5a70: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
5a80: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
5a90: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
5aa0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
5ab0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
5ac0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
5ad0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
5ae0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
5af0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
5b00: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
5b10: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
5b20: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
5b30: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
5b40: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
5b50: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
5b60: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
5b70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
5b80: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5b90: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45      Expr *p = pE
5ba0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5bb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
5bc0: 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e   *zType = column
5bd0: 54 79 70 65 28 26 73 4e 43 2c 20 70 29 3b 0a 20  Type(&sNC, p);. 
5be0: 20 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20     if( zType==0 
5bf0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5c00: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
5c10: 20 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63   make it's own c
5c20: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
5c30: 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20  n-type, in case 
5c40: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65  the .    ** sche
5c50: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
5c60: 72 65 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  re this virtual 
5c70: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
5c80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
5c90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
5ca0: 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74  Name(v, i+pEList
5cb0: 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20  ->nExpr, zType, 
5cc0: 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a  strlen(zType));.
5cd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
5ce0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
5cf0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
5d00: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
5d10: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
5d20: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
5d30: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
5d40: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
5d50: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
5d60: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
5d70: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
5d80: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
5d90: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
5da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5db0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
5dc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
5dd0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
5de0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
5df0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5e00: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
5e10: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
5e20: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
5e30: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5e40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5e50: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
5e60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5e70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
5e80: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
5e90: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
5ea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
5eb0: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
5ec0: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
5ed0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
5ee0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
5ef0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
5f00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
5f10: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  f..  assert( v!=
5f20: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  0 );.  if( pPars
5f30: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
5f40: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
5f50: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
5f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
5f70: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
5f80: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
5f90: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
5fa0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
5fb0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
5fc0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
5fd0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
5fe0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
5ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
6000: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
6010: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
6020: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
6030: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
6040: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
6050: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
6060: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xpr;.    if( p==
6070: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6080: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
6090: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
60a0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
60b0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
60c0: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
60d0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
60e0: 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  v, i, zName, str
60f0: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
6100: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6110: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
6120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
6130: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
6140: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
6150: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
6160: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6170: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
6180: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
6190: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
61a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
61b0: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
61c0: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
61d0: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
61e0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
61f0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
6200: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
6210: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
6220: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
6230: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
6240: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
6250: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
6260: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
6270: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
6280: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
6290: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
62a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
62b0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
62c0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
62d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
62e0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
62f0: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
6300: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
6310: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
6320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
6330: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70  tColName(v, i, p
6340: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
6350: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n.n);.      }els
6360: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
6370: 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20  || (!shortNames 
6380: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
6390: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
63a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
63b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
63c0: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
63d0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
63e0: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
63f0: 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
6400: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
6410: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
6420: 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  me;.        sqli
6430: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
6440: 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ame, zTab, ".", 
6450: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zCol, 0);.      
6460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6470: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e  ColName(v, i, zN
6480: 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  ame, P3_DYNAMIC)
6490: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
64a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
64b0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
64c0: 69 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28  i, zCol, strlen(
64d0: 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a  zCol));.      }.
64e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
64f0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
6500: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
6510: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
6520: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e  olName(v, i, p->
6530: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
6540: 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  n);.      /* sql
6550: 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73  ite3VdbeCompress
6560: 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20  Space(v, addr); 
6570: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
6580: 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33      char zName[3
6590: 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0];.      assert
65a0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
65b0: 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  MN || pTabList==
65c0: 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e  0 );.      sprin
65d0: 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d  tf(zName, "colum
65e0: 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  n%d", i+1);.    
65f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6600: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e  ColName(v, i, zN
6610: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
6620: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
6630: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
6640: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
6650: 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t);.}..#ifndef S
6660: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6670: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
6680: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   Name of the con
6690: 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  nection operator
66a0: 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72  , used for error
66b0: 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74   messages..*/.st
66c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
66d0: 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e  *selectOpName(in
66e0: 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t id){.  char *z
66f0: 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29  ;.  switch( id )
6700: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
6710: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e  L:       z = "UN
6720: 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61  ION ALL";   brea
6730: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
6740: 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49  NTERSECT: z = "I
6750: 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65  NTERSECT";   bre
6760: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6770: 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22  EXCEPT:    z = "
6780: 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72  EXCEPT";      br
6790: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
67a0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20  :           z = 
67b0: 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62  "UNION";       b
67c0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
67d0: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
67e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
67f0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
6800: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
6810: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
6820: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
6830: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c  lectStmt(Parse*,
6840: 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a   Select*);../*.*
6850: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
6860: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
6870: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
6880: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
6890: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
68a0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
68b0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
68c0: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
68d0: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
68e0: 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a   *pParse, char *
68f0: 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74  zTabName, Select
6900: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
6910: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
6920: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
6930: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c  t *pEList;.  Col
6940: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
6950: 3b 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  ;..  if( prepSel
6960: 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
6970: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
6980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6990: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
69a0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
69b0: 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a   pSelect, 0) ){.
69c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
69d0: 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  }.  pTab = sqlit
69e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
69f0: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
6a00: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
6a10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
6a20: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
6a30: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pTab->zName = z
6a40: 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  TabName ? sqlite
6a50: 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29  StrDup(zTabName)
6a60: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
6a70: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
6a80: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
6a90: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
6aa0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
6ab0: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
6ac0: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
6ad0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
6ae0: 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  zeof(pTab->aCol[
6af0: 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  0])*pTab->nCol )
6b00: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
6b10: 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  l=aCol; i<pTab->
6b20: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
6b30: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c  +){.    Expr *p,
6b40: 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a   *pR;.    char *
6b50: 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20  zType;.    char 
6b60: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72  *zName;.    char
6b70: 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20 20   *zBasename;.   
6b80: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
6b90: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
6ba0: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
6bb0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
6bc0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
6bd0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
6be0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
6bf0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
6c00: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
6c10: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
6c20: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
6c30: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
6c40: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
6c50: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
6c60: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
6c70: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
6c80: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
6c90: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
6ca0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
6cb0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
6cc0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
6cd0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61  sqliteStrDup(zNa
6ce0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
6cf0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
6d00: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6d10: 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74  && (pR=p->pRight
6d20: 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65  )!=0 && pR->toke
6d30: 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  n.z && pR->token
6d40: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
6d50: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66  * For columns of
6d60: 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73   the from A.B us
6d70: 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20  e B as the name 
6d80: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
6d90: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
6da0: 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e  "%T", &pR->token
6db0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6dc0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
6dd0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
6de0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
6df0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
6e00: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
6e10: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
6e20: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
6e30: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
6e40: 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e  f("%T", &p->span
6e50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6e60: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c      /* If all el
6e70: 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75  se fails, make u
6e80: 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  p a name */.    
6e90: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6ea0: 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e  3MPrintf("column
6eb0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
6ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
6ed0: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
6ee0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  if( sqlite3_mall
6ef0: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
6f00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
6f10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
6f20: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
6f30: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72  , pTab);.      r
6f40: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
6f50: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
6f60: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6f70: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
6f80: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
6f90: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
6fa0: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
6fb0: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
6fc0: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
6fd0: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
6fe0: 20 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e    zBasename = zN
6ff0: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  ame;.    for(j=c
7000: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
7010: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
7020: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
7030: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
7040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
7050: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
7060: 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42  intf("%s:%d", zB
7070: 61 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  asename, ++cnt);
7080: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
7090: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
70a0: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
70b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
70c0: 20 69 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d   if( zBasename!=
70d0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  zName ){.      s
70e0: 71 6c 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e  qliteFree(zBasen
70f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
7100: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
7110: 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  ame;..    /* Get
7120: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74   the typename, t
7130: 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e  ype affinity, an
7140: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
7150: 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20  ence for the.   
7160: 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20   ** column..    
7170: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
7180: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
7190: 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  C));.    sNC.pSr
71a0: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
71b0: 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65  >pSrc;.    zType
71c0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
71d0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
71e0: 20 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e   p));.    pCol->
71f0: 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20  zType = zType;. 
7200: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
7210: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
7220: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
7230: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  pCol->pColl = sq
7240: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
7250: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
7260: 20 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c   if( !pCol->pCol
7270: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  l ){.      pCol-
7280: 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d  >pColl = pParse-
7290: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
72a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
72b0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
72c0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
72d0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
72e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
72f0: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
7300: 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c  by doing the fol
7310: 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73  lowing.** things
7320: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
7330: 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
7340: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
7350: 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
7360: 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
7370: 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
7380: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
7390: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
73a0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
73b0: 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
73c0: 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
73d0: 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
73e0: 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
73f0: 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
7400: 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
7410: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
7420: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
7430: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
7440: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
7450: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
7460: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
7470: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
7480: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
7490: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
74a0: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
74b0: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
74c0: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
74d0: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
74e0: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
74f0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
7500: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
7510: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
7520: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
7530: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
7540: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
7550: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
7560: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
7570: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
7580: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
7590: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
75a0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
75b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
75c0: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
75d0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
75e0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
75f0: 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
7600: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
7610: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
7620: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
7630: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
7640: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
7650: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
7660: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
7670: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
7680: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
7690: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
76a0: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
76b0: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
76c0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
76d0: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
76e0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
76f0: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
7700: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
7710: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
7720: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
7730: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
7740: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
7750: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
7760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7770: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
7780: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
7790: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
77a0: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
77b0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
77c0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
77d0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
77e0: 54 61 62 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Tab;.  struct Sr
77f0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
7800: 6d 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  m;..  if( p==0 |
7810: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  | p->pSrc==0 || 
7820: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
7830: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
7840: 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
7850: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
7860: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
7870: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
7880: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
7890: 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
78a0: 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
78b0: 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
78c0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
78d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
78e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
78f0: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
7900: 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  rs(pParse, p->pS
7910: 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  rc);..  /* Look 
7920: 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
7930: 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
7940: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
7950: 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
7960: 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
7970: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
7980: 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
7990: 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
79a0: 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
79b0: 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
79c0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
79d0: 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
79e0: 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
79f0: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
7a00: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
7a10: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
7a20: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
7a30: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
7a40: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
7a50: 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
7a60: 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
7a70: 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
7a80: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
7a90: 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
7aa0: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
7ab0: 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
7ac0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
7ad0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
7ae0: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
7af0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
7b00: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
7b10: 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
7b20: 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
7b30: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
7b40: 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
7b50: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
7b60: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
7b70: 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  f( pFrom->zAlias
7b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
7b90: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20  From->zAlias =. 
7ba0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7bb0: 4d 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f  MPrintf("sqlite_
7bc0: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28  subquery_%p_", (
7bd0: 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65  void*)pFrom->pSe
7be0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
7bf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
7c00: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
7c10: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
7c20: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
7c30: 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74     sqlite3Result
7c40: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
7c50: 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  se, pFrom->zAlia
7c60: 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  s, pFrom->pSelec
7c70: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
7c80: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
7c90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7ca0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
7cb0: 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67  isTransient flag
7cc0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
7cd0: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
7ce0: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
7cf0: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
7d00: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
7d10: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
7d20: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
7d30: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
7d40: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
7d50: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
7d60: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
7d70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
7d80: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
7d90: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
7da0: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
7db0: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20  ->isTransient = 
7dc0: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  1;.#endif.    }e
7dd0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
7de0: 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
7df0: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
7e00: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7e10: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
7e20: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
7e30: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
7e40: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
7e50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
7e60: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
7e70: 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
7e80: 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
7e90: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
7ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
7eb0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
7ec0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
7ed0: 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
7ee0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
7ef0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
7f00: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
7f10: 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
7f20: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
7f30: 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
7f40: 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
7f50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
7f60: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
7f70: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
7f80: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
7f90: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
7fa0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72         /* If pFr
7fb0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69  om->pSelect!=0 i
7fc0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
7fd0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20  ealing with a.  
7fe0: 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69        ** view wi
7ff0: 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68  thin a view.  Th
8000: 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75  e SELECT structu
8010: 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
8020: 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  een.        ** c
8030: 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74  opied by the out
8040: 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61  er view so we ca
8050: 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20  n skip the copy 
8060: 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20  step here.      
8070: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65    ** in the inne
8080: 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20  r view..        
8090: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
80a0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
80b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
80c0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
80d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
80e0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
80f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8100: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
8110: 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
8120: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
8130: 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
8140: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
8150: 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
8160: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
8170: 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20  in(pParse, p) ) 
8180: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
8190: 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
81a0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
81b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
81c0: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
81d0: 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
81e0: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
81f0: 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
8200: 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
8210: 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
8220: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
8230: 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
8240: 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
8250: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
8260: 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
8270: 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
8280: 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
8290: 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
82a0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
82b0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
82c0: 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
82d0: 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
82e0: 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
82f0: 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
8300: 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
8310: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
8320: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
8330: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
8340: 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
8350: 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
8360: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
8370: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
8380: 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
8390: 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
83a0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
83b0: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
83c0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
83d0: 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
83e0: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
83f0: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
8400: 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  k;.    if( pE->o
8410: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
8420: 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70  >pRight && pE->p
8430: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
8440: 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45  L.         && pE
8450: 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70  ->pLeft && pE->p
8460: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Left->op==TK_ID 
8470: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
8480: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70  c = 0;.  if( k<p
8490: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
84a0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
84b0: 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
84c0: 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
84d0: 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
84e0: 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
84f0: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
8500: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
8510: 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
8520: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
8530: 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
8540: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8550: 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
8560: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
8570: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
8580: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
8590: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
85a0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
85b0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
85c0: 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
85d0: 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
85e0: 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
85f0: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
8600: 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20  olNames)!=0 &&. 
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51       (flags & SQ
8630: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
8640: 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72  es)==0;..    for
8650: 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
8660: 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
8670: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b     Expr *pE = a[
8680: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
8690: 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
86a0: 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  LL &&.          
86b0: 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
86c0: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d   || pE->pRight==
86d0: 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d  0 || pE->pRight-
86e0: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a  >op!=TK_ALL) ){.
86f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8700: 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
8710: 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
8720: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
8730: 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
8740: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
8750: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8760: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
8770: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
8780: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
8790: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
87a0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
87b0: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
87c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
87d0: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
87e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
87f0: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
8800: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
8810: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
8820: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
8830: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
8840: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
8850: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
8860: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
8870: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
8880: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
8890: 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
88a0: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
88b0: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
88c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
88d0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
88e0: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
88f0: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
8900: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
8910: 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66  mToken(&pE->pLef
8920: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
8930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8940: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
8950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8960: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
8970: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
8980: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
8990: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
89a0: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
89b0: 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
89c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
89d0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
89e0: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
89f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
8a00: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
8a10: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
8a20: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
8a30: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
8a40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8a50: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
8a60: 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d  me && (zTabName=
8a70: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
8a80: 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ]==0 || .       
8a90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8aa0: 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
8ab0: 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29   zTabName)!=0) )
8ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
8ad0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8ae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
8af0: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
8b00: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
8b10: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
8b20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
8b30: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c  Expr *pExpr, *pL
8b40: 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  eft, *pRight;.  
8b50: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
8b60: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
8b70: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
8b80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
8b90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8ba0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
8bb0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20  t_item *pLeft = 
8bc0: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  &pTabList->a[i-1
8bd0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
8be0: 20 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69   if( (pLeft->joi
8bf0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
8c00: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c    columnIndex(pL
8c30: 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65  eft->pTab, zName
8c40: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
8c50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
8c60: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
8c70: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
8c80: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
8ca0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
8cb0: 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
8cc0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8cf0: 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
8d00: 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73  Index(pLeft->pUs
8d10: 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
8d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8d30: 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
8d40: 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
8d50: 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
8d60: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
8d70: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
8d80: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
8d90: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
8da0: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
8db0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8dd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
8df0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
8e00: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
8e10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8e20: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72  ( pRight==0 ) br
8e30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8e40: 20 73 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68   setToken(&pRigh
8e50: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29  t->token, zName)
8e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8e70: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 28 6c  ( zTabName && (l
8e80: 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
8e90: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
8ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8eb0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
8ec0: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
8ed0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
8ee0: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
8ef0: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c  3Expr(TK_DOT, pL
8f00: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
8f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8f20: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72  f( pExpr==0 ) br
8f30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8f40: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65     setToken(&pLe
8f50: 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e  ft->token, zTabN
8f60: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
8f70: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45      setToken(&pE
8f80: 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74  xpr->span, sqlit
8f90: 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73  e3MPrintf("%s.%s
8fa0: 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
8fb0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
8fc0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
8fd0: 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  dyn = 1;.       
8fe0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
8ff0: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20  ken.z = 0;.     
9000: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
9010: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20  token.n = 0;.   
9020: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
9030: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b  ->token.dyn = 0;
9040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
9050: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
9060: 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
9070: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9080: 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45  pExpr->span = pE
9090: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  xpr->token;.    
90a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
90b0: 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
90c0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
90d0: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
90e0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
90f0: 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  d(pNew, pExpr, &
9100: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
9110: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9130: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
9140: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
9150: 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74  , pExpr, &pRight
9160: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
9170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9180: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9190: 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
91a0: 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
91b0: 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
91d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
91e0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
91f0: 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
9200: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9210: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
9220: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9230: 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
9240: 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
9250: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9260: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
9270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9280: 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65  qliteFree(zTName
9290: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
92a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
92b0: 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73  ListDelete(pELis
92c0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
92d0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
92e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
92f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9300: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9310: 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
9320: 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20  tine associates 
9330: 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52  entries in an OR
9340: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
9350: 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63  n list with.** c
9360: 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75  olumns in a resu
9370: 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52  lt.  For each OR
9380: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
9390: 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66  n, the opcode of
93a0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
93b0: 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l node is change
93c0: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61  d to TK_COLUMN a
93d0: 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76  nd the iColumn v
93e0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  alue of.** the t
93f0: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
9400: 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
9410: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e  column number an
9420: 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20  d the iTable.** 
9430: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70  value of the top
9440: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
9450: 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c  illed with iTabl
9460: 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  e parameter..**.
9470: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
9480: 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61  prior SELECT cla
9490: 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70  uses, they are p
94a0: 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20  rocessed first. 
94b0: 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61   A match.** in a
94c0: 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54  n earlier SELECT
94d0: 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63   takes precedenc
94e0: 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53  e over a later S
94f0: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ELECT..**.** Any
9500: 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73   entry that does
9510: 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c   not match is fl
9520: 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f  agged as an erro
9530: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  r.  The number.*
9540: 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72  * of errors is r
9550: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
9560: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
9570: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50  rbyToColumn(.  P
9580: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9590: 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63         /* A plac
95a0: 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72  e to leave error
95b0: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
95c0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
95d0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20         /* Match 
95e0: 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  to result column
95f0: 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54  s of this SELECT
9600: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9610: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
9620: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61   The ORDER BY va
9630: 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67  lues to match ag
9640: 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ainst columns */
9650: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
9660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9670: 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20  sert this value 
9680: 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69  in iTable */.  i
9690: 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  nt mustComplete 
96a0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55         /* If TRU
96b0: 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20  E all ORDER BYs 
96c0: 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  must match */.){
96d0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
96e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
96f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
9700: 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
9710: 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d  =0 || pOrderBy==
9720: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
9730: 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  if( mustComplete
9740: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
9750: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
9760: 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72  pr; i++){ pOrder
9770: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
9780: 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70  0; }.  }.  if( p
9790: 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
97a0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
97b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
97c0: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
97d0: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
97e0: 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62   if( matchOrderb
97f0: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
9800: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  , pSelect->pPrio
9810: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61  r, pOrderBy, iTa
9820: 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ble, 0) ){.     
9830: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
9840: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
9850: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
9860: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
9870: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9880: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
9890: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
98a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  i].pExpr;.    in
98b0: 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  t iCol = -1;.   
98c0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
98d0: 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  [i].done ) conti
98e0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
98f0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9900: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
9910: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d        if( iCol<=
9920: 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74  0 || iCol>pEList
9930: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
9940: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9950: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
9960: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 70       "ORDER BY p
9970: 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c  osition %d shoul
9980: 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  d be between 1 a
9990: 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
99a0: 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e    iCol, pEList->
99b0: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
99c0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
99d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
99e0: 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f       if( !mustCo
99f0: 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75  mplete ) continu
9a00: 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b  e;.      iCol--;
9a10: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
9a20: 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c  =0; iCol<0 && j<
9a30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
9a40: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
9a50: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
9a60: 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b  e && (pE->op==TK
9a70: 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54  _ID || pE->op==T
9a80: 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20  K_STRING) ){.   
9a90: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
9aa0: 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20  , *zLabel;.     
9ab0: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73     zName = pELis
9ac0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
9ad0: 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20         zLabel = 
9ae0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
9af0: 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29  oken(&pE->token)
9b00: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9b10: 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20  ( zLabel!=0 );. 
9b20: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9b30: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
9b40: 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a   zLabel)==0 ){ .
9b50: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d            iCol =
9b60: 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   j;.        }.  
9b70: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
9b80: 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  (zLabel);.      
9b90: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
9ba0: 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  <0 && sqlite3Exp
9bb0: 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c  rCompare(pE, pEL
9bc0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
9bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
9be0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
9bf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
9c00: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d  >=0 ){.      pE-
9c10: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
9c20: 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75  .      pE->iColu
9c30: 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
9c40: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
9c50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e  able;.      pE->
9c60: 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iAgg = -1;.     
9c70: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
9c80: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  done = 1;.    }.
9c90: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
9ca0: 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  & mustComplete )
9cb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9cc0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
9cd0: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
9ce0: 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64  Y term number %d
9cf0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
9d00: 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
9d10: 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  n", i+1);.      
9d20: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72  nErr++;.      br
9d30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9d40: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
9d50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
9d60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9d70: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
9d80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  */../*.** Get a 
9d90: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
9da0: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
9db0: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
9dc0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
9dd0: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
9de0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9df0: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
9e00: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
9e10: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
9e20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
9e30: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
9e40: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9e50: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
9e60: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
9e70: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
9e80: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
9e90: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d  pParse->db);.  }
9ea0: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
9eb0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
9ec0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
9ed0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
9ee0: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
9ef0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
9f00: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
9f10: 72 65 73 73 69 6f 6e 73 2e 20 20 6e 4c 69 6d 69  ressions.  nLimi
9f20: 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f  t and nOffset ho
9f30: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
9f40: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
9f50: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
9f60: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
9f70: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
9f80: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
9f90: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
9fa0: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
9fb0: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
9fc0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
9fd0: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
9fe0: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
9ff0: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
a000: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
a010: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
a020: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
a030: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
a040: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
a050: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
a060: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
a070: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
a080: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
a090: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
a0a0: 74 68 65 20 76 61 6c 75 65 73 20 69 66 20 69 4c  the values if iL
a0b0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
a0c0: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
a0d0: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
a0e0: 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c 69 6d   defined by nLim
a0f0: 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e 20  it and nOffset. 
a100: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
a110: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
a120: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
a130: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
a140: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
a150: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
a160: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
a170: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
a180: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
a190: 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30 20  ly if nLimit>=0 
a1a0: 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f 20  or nOffset>0 do 
a1b0: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
a1c0: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
a1d0: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
a1e0: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
a1f0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
a200: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
a210: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
a220: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
a230: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
a240: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
a250: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a260: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
a270: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
a280: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
a290: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
a2a0: 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  p){.  /* .  ** "
a2b0: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
a2c0: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
a2d0: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
a2e0: 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79    ** contraversy
a2f0: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
a300: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
a310: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
a320: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
a330: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
a340: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
a350: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
a360: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   rows..  */.  if
a370: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
a380: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
a390: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
a3a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
a3b0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
a3c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
a3d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
a3e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a3f0: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
a400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a410: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
a420: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
a430: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a440: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74  ddOp(v, OP_Negat
a450: 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ive, 0, 0);.    
a460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a470: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
a480: 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56   iMem, 1);.    V
a490: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
a4a0: 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22  # LIMIT counter"
a4b0: 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ));.    p->iLimi
a4c0: 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20  t = iMem;.  }.  
a4d0: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
a4e0: 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  {.    int iMem =
a4f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
a500: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
a510: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
a520: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
a530: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a540: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a550: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
a560: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
a570: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a580: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
a590: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
a5a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
a5b0: 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a  egative, 0, 0);.
a5c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a5d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
a5e0: 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20  ore, iMem, 1);. 
a5f0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
a600: 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75  v, "# OFFSET cou
a610: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e  nter"));.    p->
a620: 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a  iOffset = iMem;.
a630: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
a640: 65 72 61 74 65 20 56 44 42 45 20 69 6e 73 74 72  erate VDBE instr
a650: 75 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c  uctions that wil
a660: 6c 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65  l open a transie
a670: 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a  nt table that.**
a680: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
a690: 72 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f  r an index or to
a6a0: 20 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73   store keyed res
a6b0: 75 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ults for a compo
a6c0: 75 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20  und.** select.  
a6d0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
a6e0: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
a6f0: 20 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64   table that need
a700: 73 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  s a.** KeyInfo s
a710: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e  tructure.  The n
a720: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a730: 20 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   in the KeyInfo 
a740: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
a750: 20 62 79 20 74 68 65 20 72 65 73 75 6c 74 20 73   by the result s
a760: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
a770: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
a780: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
a790: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69  t..**.** Specifi
a7a0: 63 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74  cally, this rout
a7b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
a7c0: 20 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74   open an index t
a7d0: 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54  able for.** DIST
a7e0: 49 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54  INCT, UNION, INT
a7f0: 45 52 53 45 43 54 20 61 6e 64 20 45 58 43 45 50  ERSECT and EXCEP
a800: 54 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  T select stateme
a810: 6e 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a  nts (but not .**
a820: 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a   UNION ALL)..**.
a830: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
a840: 75 72 6e 65 64 20 69 73 20 74 68 65 20 61 64 64  urned is the add
a850: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f  ress of the OP_O
a860: 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72  penVirtual instr
a870: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
a880: 63 20 69 6e 74 20 6f 70 65 6e 56 69 72 74 75 61  c int openVirtua
a890: 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
a8a0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
a8b0: 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 4b 65   int iTab){.  Ke
a8c0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
a8d0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a  .  int nColumn;.
a8e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a8f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
a900: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  t i;.  Vdbe *v =
a910: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a920: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69    int addr;..  i
a930: 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
a940: 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  t(pParse, p) ){.
a950: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a960: 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d  }.  nColumn = p-
a970: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
a980: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
a990: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
a9a0: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f  f(*pKeyInfo)+nCo
a9b0: 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  lumn*sizeof(Coll
a9c0: 53 65 71 2a 29 20 29 3b 0a 20 20 69 66 28 20 70  Seq*) );.  if( p
a9d0: 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  KeyInfo==0 ) ret
a9e0: 75 72 6e 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66  urn 0;.  pKeyInf
a9f0: 6f 2d 3e 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63  o->enc = db->enc
aa00: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ;.  pKeyInfo->nF
aa10: 69 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  ield = nColumn;.
aa20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
aa30: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
aa40: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
aa50: 69 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  i] = sqlite3Expr
aa60: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
aa70: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
aa80: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
aa90: 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  !pKeyInfo->aColl
aaa0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  [i] ){.      pKe
aab0: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
aac0: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
aad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 64 64  .    }.  }.  add
aae0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f  r = sqlite3VdbeO
aaf0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  p3(v, OP_OpenVir
ab00: 74 75 61 6c 2c 20 69 54 61 62 2c 20 30 2c 20 0a  tual, iTab, 0, .
ab10: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
ab20: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
ab30: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 72 65  O_HANDOFF);.  re
ab40: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69  turn addr;.}..#i
ab50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ab60: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
ab70: 54 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  T./*.** Add the 
ab80: 61 64 64 72 65 73 73 20 22 61 64 64 72 22 20 74  address "addr" t
ab90: 6f 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  o the set of all
aba0: 20 4f 70 65 6e 56 69 72 74 75 61 6c 20 6f 70 63   OpenVirtual opc
abb0: 6f 64 65 20 61 64 64 72 65 73 73 65 73 0a 2a 2a  ode addresses.**
abc0: 20 74 68 61 74 20 61 72 65 20 62 65 69 6e 67 20   that are being 
abd0: 61 63 63 75 6d 75 6c 61 74 65 64 20 69 6e 20 70  accumulated in p
abe0: 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 2e  ->ppOpenVirtual.
abf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
ac00: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 56 69  ultiSelectOpenVi
ac10: 72 74 75 61 6c 41 64 64 72 28 53 65 6c 65 63 74  rtualAddr(Select
ac20: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
ac30: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
ac40: 3d 20 2a 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74  = *p->ppOpenVirt
ac50: 75 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ual = sqlite3IdL
ac60: 69 73 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70 70  istAppend(*p->pp
ac70: 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 30 29 3b  OpenVirtual, 0);
ac80: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
ac90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
aca0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
acb0: 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74    pList->a[pList
acc0: 2d 3e 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61  ->nId-1].idx = a
acd0: 64 64 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ddr;.  return SQ
ace0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
acf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ad00: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
ad10: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
ad20: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
ad30: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
ad40: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
ad50: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
ad60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
ad70: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
ad80: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
ad90: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
ada0: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
adb0: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
adc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
add0: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
ade0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
adf0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
ae00: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
ae10: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
ae20: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
ae30: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
ae40: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
ae50: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
ae60: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
ae70: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ae80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
ae90: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
aea0: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
aeb0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
aec0: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
aed0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
aee0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
aef0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
af00: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
af10: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
af20: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
af30: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
af40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
af50: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
af60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
af70: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
af80: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
af90: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
afa0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
afb0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
afc0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
afd0: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
afe0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
aff0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
b000: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b010: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
b020: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69  s a query that i
b030: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69  s really the uni
b040: 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65  on.** or interse
b050: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20  ction of two or 
b060: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
b070: 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22  eries..**.** "p"
b080: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
b090: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
b0a0: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
b0b0: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
b0c0: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
b0d0: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
b0e0: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
b0f0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
b100: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
b110: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
b120: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
b130: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
b140: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
b150: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
b160: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
b170: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
b180: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
b190: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
b1a0: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
b1b0: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
b1c0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
b1d0: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
b1e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
b1f0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b200: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
b210: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b220: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
b230: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
b240: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
b250: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
b260: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
b270: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
b280: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
b290: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
b2a0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
b2d0: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
b2e0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
b2f0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
b300: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
b310: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
b320: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
b330: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
b340: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
b350: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
b360: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
b370: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
b380: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
b390: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
b3a0: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
b3b0: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
b3c0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
b3d0: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
b3e0: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
b3f0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
b400: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
b410: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
b420: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
b430: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
b440: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b450: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
b460: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b470: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b480: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
b490: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
b4a0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
b4b0: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
b4c0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
b4d0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
b4e0: 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20          /* \___ 
b4f0: 20 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73   Store query res
b500: 75 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65  ults as specifie
b510: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  d */.  int iParm
b520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b530: 2f 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74  /     by these t
b540: 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  wo parameters.  
b550: 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72         */.  char
b560: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
b570: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
b580: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
b590: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
b5a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
b5b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
b5c0: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
b5d0: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
b5e0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
b5f0: 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
b600: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
b610: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
b620: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
b630: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
b640: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
b650: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
b660: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e  .  IdList *pOpen
b670: 56 69 72 74 75 61 6c 20 3d 20 30 3b 2f 2a 20 4f  Virtual = 0;/* O
b680: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 6f 70  P_OpenVirtual op
b690: 63 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 20  codes that need 
b6a0: 61 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69  a KeyInfo */.  i
b6b0: 6e 74 20 61 41 64 64 72 5b 35 5d 3b 20 20 20 20  nt aAddr[5];    
b6c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65       /* Addresse
b6d0: 73 20 6f 66 20 53 65 74 4e 75 6d 43 6f 6c 75 6d  s of SetNumColum
b6e0: 6e 73 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ns operators */.
b6f0: 20 20 69 6e 74 20 6e 41 64 64 72 20 3d 20 30 3b    int nAddr = 0;
b700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b710: 72 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  r used */.  int 
b720: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
b730: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b740: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
b750: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 2f  sult set */..  /
b760: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
b770: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
b780: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
b790: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
b7a0: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
b7b0: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
b7c0: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
b7d0: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
b7e0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
b7f0: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69   LIMIT..  */.  i
b800: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50  f( p==0 || p->pP
b810: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rior==0 ){.    r
b820: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
b830: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
b840: 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d  ;.  }.  pPrior =
b850: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66   p->pPrior;.  if
b860: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
b870: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
b880: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b890: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
b8a0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
b8b0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
b8c0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
b8d0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
b8e0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
b8f0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
b900: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
b910: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
b920: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b930: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
b940: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
b950: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
b960: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
b970: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
b980: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
b990: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
b9a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
b9b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
b9c0: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
b9d0: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
b9e0: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
b9f0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
ba00: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
ba10: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
ba20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
ba30: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
ba40: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
ba50: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
ba60: 49 66 20 2a 70 20 74 68 69 73 20 69 73 20 74 68  If *p this is th
ba70: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c  e right-most sel
ba80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ect statement, t
ba90: 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20  hen initialize. 
baa0: 20 2a 2a 20 70 2d 3e 70 70 4f 70 65 6e 56 69 72   ** p->ppOpenVir
bab0: 74 75 61 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f  tual to point to
bac0: 20 70 4f 70 65 6e 56 69 72 74 75 61 6c 2e 20 20   pOpenVirtual.  
bad0: 49 66 20 2a 70 20 69 73 20 6e 6f 74 20 74 68 65  If *p is not the
bae0: 20 72 69 67 68 74 20 6d 6f 73 74 0a 20 20 2a 2a   right most.  **
baf0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 65 6e 20   statement then 
bb00: 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61 6c  p->ppOpenVirtual
bb10: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
bb20: 64 79 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  dy been initiali
bb30: 7a 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 70 72  zed.  ** by a pr
bb40: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ior call to this
bb50: 20 73 61 6d 65 20 70 72 6f 63 65 64 75 72 65 2e   same procedure.
bb60: 20 20 50 61 73 73 20 61 6c 6f 6e 67 20 74 68 65    Pass along the
bb70: 20 70 4f 70 65 6e 56 69 72 74 75 61 6c 0a 20 20   pOpenVirtual.  
bb80: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 50  ** pointer to pP
bb90: 72 69 6f 72 2c 20 74 68 65 20 6e 65 78 74 20 73  rior, the next s
bba0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 6f 75 72 20  tatement to our 
bbb0: 6c 65 66 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  left..  */.  if(
bbc0: 20 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61   p->ppOpenVirtua
bbd0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  l==0 ){.    p->p
bbe0: 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 3d 20 26  pOpenVirtual = &
bbf0: 70 4f 70 65 6e 56 69 72 74 75 61 6c 3b 0a 20 20  pOpenVirtual;.  
bc00: 7d 0a 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70  }.  pPrior->ppOp
bc10: 65 6e 56 69 72 74 75 61 6c 20 3d 20 70 2d 3e 70  enVirtual = p->p
bc20: 70 4f 70 65 6e 56 69 72 74 75 61 6c 3b 0a 0a 20  pOpenVirtual;.. 
bc30: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
bc40: 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
bc50: 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
bc60: 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
bc70: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65  f( eDest==SRT_Te
bc80: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61  mpTable ){.    a
bc90: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
bca0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
bcb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
bcc0: 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72  penVirtual, iPar
bcd0: 6d 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  m, 0);.    asser
bce0: 74 28 20 6e 41 64 64 72 3d 3d 30 20 29 3b 0a 20  t( nAddr==0 );. 
bcf0: 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b     aAddr[nAddr++
bd00: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
bd10: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
bd20: 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c  mColumns, iParm,
bd30: 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d   0);.    eDest =
bd40: 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
bd50: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
bd60: 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
bd70: 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
bd80: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
bd90: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
bda0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
bdb0: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
bdc0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
bdd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
bde0: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
bdf0: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
be00: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
be10: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
be20: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
be30: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
be40: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
be50: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
be60: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65  rse, pPrior, eDe
be70: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
be80: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
be90: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
bea0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
beb0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
bec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
bed0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
bee0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
bef0: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
bf00: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
bf10: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
bf20: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
bf30: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
bf40: 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65         p->pOffse
bf50: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
bf60: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
bf70: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
bf80: 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  st, iParm, 0, 0,
bf90: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
bfa0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
bfb0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
bfc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
bfd0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
bfe0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
bff0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
c000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c010: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
c020: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
c030: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
c040: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
c050: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c060: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
c070: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
c080: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
c090: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
c0a0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
c0b0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
c0c0: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
c0d0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
c0e0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
c0f0: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
c100: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
c110: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
c120: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
c130: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
c140: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
c150: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
c160: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
c170: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
c180: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
c190: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
c1a0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
c1b0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
c1c0: 4f 72 64 65 72 42 79 3b 20 20 20 20 20 2f 2a 20  OrderBy;     /* 
c1d0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
c1e0: 75 73 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  use for the righ
c1f0: 74 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  t SELECT */.    
c200: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
c210: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e     priorOp = p->
c220: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54  op==TK_ALL ? SRT
c230: 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69  _Table : SRT_Uni
c240: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  on;.      if( eD
c250: 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
c260: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  p->pOrderBy==0 &
c270: 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20  & !p->pLimit && 
c280: 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20  !p->pOffset ){. 
c290: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
c2a0: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
c2b0: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
c2c0: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
c2d0: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
c2e0: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
c2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
c300: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
c310: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c320: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
c330: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
c340: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
c350: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
c360: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
c370: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
c380: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c390: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
c3a0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
c3b0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
c3c0: 72 64 65 72 42 79 20 0a 20 20 20 20 20 20 20 20  rderBy .        
c3d0: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
c3e0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
c3f0: 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
c400: 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a  unionTab, 1) ){.
c410: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
c420: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
c430: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c440: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
c450: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
c460: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c470: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
c480: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
c490: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21        if( p->op!
c4a0: 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20  =TK_ALL ){.     
c4b0: 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53       rc = multiS
c4c0: 65 6c 65 63 74 4f 70 65 6e 56 69 72 74 75 61 6c  electOpenVirtual
c4d0: 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20  Addr(p, addr);. 
c4e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
c4f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c500: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
c510: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c520: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c530: 20 20 20 20 20 7d 0a 09 61 73 73 65 72 74 28 20       }..assert( 
c540: 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64  nAddr<sizeof(aAd
c550: 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72  dr)/sizeof(aAddr
c560: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  [0]) );.        
c570: 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d  aAddr[nAddr++] =
c580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c590: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
c5a0: 6c 75 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c  lumns, unionTab,
c5b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
c5c0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
c5d0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c5e0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
c5f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
c600: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
c610: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
c620: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
c630: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20  rBy );.      rc 
c640: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
c650: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
c660: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
c670: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
c680: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c690: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c6a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c6b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c6c0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
c6d0: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
c6e0: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
c6f0: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
c700: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
c710: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
c720: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
c730: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
c740: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
c750: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
c760: 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
c770: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
c780: 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
c790: 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
c7a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c7b0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
c7c0: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
c7d0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
c7e0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
c7f0: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
c800: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
c810: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
c820: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
c830: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
c840: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
c850: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
c860: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c870: 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f  rse, p, op, unio
c880: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61  nTab, 0, 0, 0, a
c890: 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
c8a0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
c8b0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
c8c0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
c8d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
c8e0: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
c8f0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
c900: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
c910: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
c920: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
c930: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  iLimit = -1;.   
c940: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
c950: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  -1;.      if( rc
c960: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
c970: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c980: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  d;.      }...   
c990: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
c9a0: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
c9b0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
c9c0: 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
c9d0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
c9e0: 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
c9f0: 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
ca00: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
ca10: 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20   eDest!=priorOp 
ca20: 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61  || unionTab!=iPa
ca30: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
ca40: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
ca50: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
ca60: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ca70: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
ca80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
ca90: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
caa0: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
cab0: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
cac0: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
cad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cae0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
caf0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
cb00: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
cb10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
cb20: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
cb30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cb40: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
cb50: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
cb60: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  ak);.        com
cb70: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
cb80: 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  rs(pParse, p);. 
cb90: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
cba0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
cbb0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
cbc0: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
cbd0: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
cbe0: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
cbf0: 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73  ionTab, p->pELis
cc00: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
cc30: 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69  By, -1, eDest, i
cc40: 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61      iCont, iBrea
cc70: 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  k, 0);.        i
cc80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
cc90: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
cca0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
ccb0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
ccc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
ccd0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
cce0: 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
ccf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cd00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cd10: 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
cd20: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
cd30: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
cd40: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
cd50: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
cd60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cd70: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
cd80: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
cd90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cda0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
cdb0: 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20  INTERSECT: {.   
cdc0: 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
cdd0: 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  2;.      int iCo
cde0: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
cdf0: 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  rt;.      Expr *
ce00: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
ce10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
ce20: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
ce30: 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
ce40: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
ce50: 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
ce60: 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
ce70: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
ce80: 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
ce90: 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
cea0: 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
ceb0: 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
cec0: 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
ced0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
cee0: 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
cef0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
cf00: 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
cf10: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
cf20: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
cf30: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
cf40: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70  oColumn(pParse,p
cf50: 2c 70 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62  ,p->pOrderBy,tab
cf60: 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  1,1) ){.        
cf70: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
cf80: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cf90: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
cfa0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
cfb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cfc0: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
cfd0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
cfe0: 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
cff0: 74 4f 70 65 6e 56 69 72 74 75 61 6c 41 64 64 72  tOpenVirtualAddr
d000: 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (p, addr);.     
d010: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d020: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
d030: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d040: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
d050: 20 20 20 61 73 73 65 72 74 28 20 6e 41 64 64 72     assert( nAddr
d060: 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73  <sizeof(aAddr)/s
d070: 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20  izeof(aAddr[0]) 
d080: 29 3b 0a 20 20 20 20 20 20 61 41 64 64 72 5b 6e  );.      aAddr[n
d090: 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  Addr++] = sqlite
d0a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d0b0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
d0c0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
d0d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d0e0: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
d0f0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
d100: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
d110: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d120: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
d130: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
d140: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d150: 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55  e, pPrior, SRT_U
d160: 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30  nion, tab1, 0, 0
d170: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d180: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d190: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d1a0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d1b0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
d1c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
d1d0: 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
d1e0: 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
d1f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
d200: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d210: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
d220: 6e 56 69 72 74 75 61 6c 2c 20 74 61 62 32 2c 20  nVirtual, tab2, 
d230: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  0);.      rc = m
d240: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 56 69  ultiSelectOpenVi
d250: 72 74 75 61 6c 41 64 64 72 28 70 2c 20 61 64 64  rtualAddr(p, add
d260: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
d270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d280: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d290: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d2a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
d2b0: 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66  rt( nAddr<sizeof
d2c0: 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61  (aAddr)/sizeof(a
d2d0: 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Addr[0]) );.    
d2e0: 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d    aAddr[nAddr++]
d2f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d300: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
d310: 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 32 2c 20 30  Columns, tab2, 0
d320: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
d330: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
d340: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
d350: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
d360: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
d370: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
d380: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d390: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
d3a0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d3b0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
d3c0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
d3d0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d3e0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
d3f0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
d400: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
d410: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
d420: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
d430: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
d440: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
d450: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d460: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d470: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d480: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d490: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d4a0: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
d4b0: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
d4c0: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
d4d0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
d4e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
d4f0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
d510: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
d520: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
d530: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
d540: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
d550: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
d560: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
d570: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d580: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
d590: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
d5a0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d5c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
d5d0: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
d5e0: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
d5f0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
d600: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
d610: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
d620: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d630: 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29  RowKey, tab1, 0)
d640: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d660: 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
d670: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Cont);.      rc 
d680: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
d690: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
d6a0: 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d  pEList, tab1, p-
d6b0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
d6e0: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
d6f0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d710: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
d720: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
d730: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d740: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
d750: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d760: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d770: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d780: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d790: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
d7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d7b0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
d7c0: 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
d7d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d7e0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
d7f0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
d800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d810: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
d820: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
d830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d840: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
d850: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
d860: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d870: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
d880: 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
d890: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
d8a0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
d8b0: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
d8c0: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
d8d0: 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
d8e0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
d8f0: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
d900: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
d910: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
d920: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
d930: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d940: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d950: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
d960: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
d970: 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
d980: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
d990: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
d9a0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
d9b0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
d9c0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
d9d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d9e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
d9f0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
da00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
da10: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
da20: 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  es.  */.  nCol =
da30: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
da40: 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 41 64 64  r;.  while( nAdd
da50: 72 3e 30 20 29 7b 0a 20 20 20 20 6e 41 64 64 72  r>0 ){.    nAddr
da60: 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  --;.    sqlite3V
da70: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
da80: 41 64 64 72 5b 6e 41 64 64 72 5d 2c 20 6e 43 6f  Addr[nAddr], nCo
da90: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  l);.  }..  /* Co
daa0: 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
dab0: 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
dac0: 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52 44  y either the ORD
dad0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a  ER BY clause or.
dae0: 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70    ** by any temp
daf0: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
db00: 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
db10: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
db20: 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
db30: 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
db40: 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
db50: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
db60: 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a    Invoke the.  *
db70: 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65  * ORDER BY proce
db80: 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20 69  ssing if there i
db90: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
dba0: 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
dbb0: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
dbc0: 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
dbd0: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
dbe0: 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
dbf0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
dc00: 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
dc10: 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
dc20: 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
dc30: 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
dc40: 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
dc50: 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
dc60: 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
dc70: 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
dc80: 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
dc90: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
dca0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
dcb0: 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65 6e  rderBy || (pOpen
dcc0: 56 69 72 74 75 61 6c 20 26 26 20 70 4f 70 65 6e  Virtual && pOpen
dcd0: 56 69 72 74 75 61 6c 2d 3e 6e 49 64 3e 30 29 20  Virtual->nId>0) 
dce0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
dd10: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
dd20: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
dd30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
dd40: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
dd50: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
dd60: 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
dd70: 74 28 20 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74  t( p->ppOpenVirt
dd80: 75 61 6c 20 3d 3d 20 26 70 4f 70 65 6e 56 69 72  ual == &pOpenVir
dd90: 74 75 61 6c 20 29 3b 0a 20 20 20 20 70 4b 65 79  tual );.    pKey
dda0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Info = sqliteMal
ddb0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79  loc(sizeof(*pKey
ddc0: 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f  Info)+nCol*sizeo
ddd0: 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20  f(CollSeq*));.  
dde0: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
ddf0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
de00: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
de10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
de20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
de30: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
de40: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
de50: 65 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  enc;.    pKeyInf
de60: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
de70: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
de80: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
de90: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
dea0: 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
deb0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
dec0: 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
ded0: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e   if( !pKeyInfo->
dee0: 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
def0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
df00: 6f 6c 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  oll[i] = pParse-
df10: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
df20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
df30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 4f 70 65     for(i=0; pOpe
df40: 6e 56 69 72 74 75 61 6c 20 26 26 20 69 3c 70 4f  nVirtual && i<pO
df50: 70 65 6e 56 69 72 74 75 61 6c 2d 3e 6e 49 64 3b  penVirtual->nId;
df60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
df70: 20 70 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f   p3type = (i==0?
df80: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
df90: 46 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  FF:P3_KEYINFO);.
dfa0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
dfb0: 20 70 4f 70 65 6e 56 69 72 74 75 61 6c 2d 3e 61   pOpenVirtual->a
dfc0: 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 73  [i].idx;.      s
dfd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
dfe0: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
dff0: 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 33  r *)pKeyInfo, p3
e000: 74 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  type);.    }..  
e010: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
e020: 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  y ){.      struc
e030: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e040: 2a 70 4f 72 64 65 72 42 79 54 65 72 6d 20 3d 20  *pOrderByTerm = 
e050: 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
e060: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e070: 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
e080: 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 72 64 65 72  xpr; i++, pOrder
e090: 42 79 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  ByTerm++){.     
e0a0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
e0b0: 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e 70   pOrderByTerm->p
e0c0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68  Expr;.        ch
e0d0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72 64  ar *zName = pOrd
e0e0: 65 72 42 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b  erByTerm->zName;
e0f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e100: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
e110: 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
e120: 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a  iColumn<nCol );.
e130: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72          /* asser
e140: 74 28 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  t( !pExpr->pColl
e150: 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   ); */.        i
e160: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
e170: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
e180: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
e190: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
e1a0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  , zName, -1);.  
e1b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e1c0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
e1d0: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
e1e0: 61 43 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  aColl[pExpr->iCo
e1f0: 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d  lumn];.        }
e200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
e210: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
e220: 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d  pParse, p, v, p-
e230: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
e240: 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20  eDest, iParm);. 
e250: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
e260: 4f 70 65 6e 56 69 72 74 75 61 6c 20 29 7b 0a 20  OpenVirtual ){. 
e270: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70       /* This hap
e280: 70 65 6e 73 20 66 6f 72 20 55 4e 49 4f 4e 20 41  pens for UNION A
e290: 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  LL ... ORDER BY 
e2a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
e2b0: 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
e2c0: 20 20 20 7d 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f     }.  }..multi_
e2d0: 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 69 66  select_end:.  if
e2e0: 28 20 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 29  ( pOpenVirtual )
e2f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
e300: 69 73 74 44 65 6c 65 74 65 28 70 4f 70 65 6e 56  istDelete(pOpenV
e310: 69 72 74 75 61 6c 29 3b 0a 20 20 7d 0a 20 20 70  irtual);.  }.  p
e320: 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 20  ->ppOpenVirtual 
e330: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
e340: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
e350: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e360: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
e370: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e380: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61  T_VIEW./*.** Sca
e390: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
e3a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
e3b0: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
e3c0: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
e3d0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
e3e0: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
e3f0: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
e400: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
e410: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
e420: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
e430: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
e440: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
e450: 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
e460: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e470: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
e480: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
e490: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
e4a0: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
e4b0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
e4c0: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
e4d0: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
e4e0: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
e4f0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
e500: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
e510: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
e520: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
e530: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
e540: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
e550: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
e560: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
e570: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
e580: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
e590: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
e5a0: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
e5b0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
e5c0: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
e5d0: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
e5e0: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
e5f0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
e600: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
e610: 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a  ,ExprList*);  /*
e620: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
e630: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
e640: 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  stSelect(Select 
e650: 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
e660: 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64   *);  /* Forward
e670: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
e680: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
e690: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
e6a0: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
e6b0: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
e6c0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
e6d0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
e6e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e6f0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
e700: 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
e710: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
e720: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
e730: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
e740: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e750: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
e760: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
e770: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
e780: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
e790: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
e7a0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e7b0: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
e7c0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
e7d0: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
e7e0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
e7f0: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
e800: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
e810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
e820: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
e830: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
e840: 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
e850: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
e860: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
e870: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
e880: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
e890: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
e8a0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
e8b0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
e8c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
e8d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
e8e0: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
e8f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e900: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
e910: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
e920: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
e930: 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69  istDup(pNew->pLi
e940: 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  st);.      pExpr
e950: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
e960: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
e970: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
e980: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
e990: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
e9a0: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
e9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
e9c0: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f  nCopy(&pExpr->to
e9d0: 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
e9e0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
e9f0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
ea00: 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
ea10: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78  span);.      pEx
ea20: 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  pr->pSelect = sq
ea30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
ea40: 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
ea50: 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
ea60: 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
ea70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
ea80: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
ea90: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
eaa0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
eab0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
eac0: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
ead0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
eae0: 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70 72  ubstSelect(pExpr
eaf0: 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
eb00: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
eb10: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45  substExprList(pE
eb20: 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
eb30: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
eb40: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
eb50: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
eb60: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
eb70: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
eb80: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
eb90: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
eba0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
ebb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
ebc0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
ebd0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
ebe0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
ebf0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ec00: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ec10: 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
ec20: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
ec30: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
ec40: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20  *pEList){.  if( 
ec50: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
ec60: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
ec70: 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
ec80: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
ec90: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
eca0: 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
ecb0: 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
ecc0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
ecd0: 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
ece0: 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
ecf0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61  (p->pHaving, iTa
ed00: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
ed10: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68  substExpr(p->pWh
ed20: 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
ed30: 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ist);.}.#endif /
ed40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
ed50: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
ed60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ed70: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
ed80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
ed90: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
eda0: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
edb0: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
edc0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
edd0: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
ede0: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
edf0: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
ee00: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
ee10: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
ee20: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
ee30: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
ee40: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
ee50: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
ee60: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ee70: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
ee80: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
ee90: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
eea0: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
eeb0: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
eec0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
eed0: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
eee0: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
eef0: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
ef00: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
ef10: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
ef20: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
ef30: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
ef40: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
ef50: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
ef60: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
ef70: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
ef80: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
ef90: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
efa0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
efb0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
efc0: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
efd0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
efe0: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
eff0: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
f000: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
f010: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
f020: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
f030: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
f040: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
f050: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
f060: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
f070: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
f080: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
f090: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
f0a0: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
f0b0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
f0c0: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
f0d0: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
f0e0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
f0f0: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
f100: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
f110: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
f120: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
f130: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
f140: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
f150: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
f160: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
f170: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
f180: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
f190: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
f1a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f1b0: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
f1c0: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
f1d0: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
f1e0: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
f1f0: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
f200: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
f210: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f220: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
f230: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
f240: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f250: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
f260: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f270: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
f280: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
f290: 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
f2a0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
f2b0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
f2c0: 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
f2d0: 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
f2e0: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
f2f0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
f300: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
f310: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
f320: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
f330: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
f340: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
f350: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
f360: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
f370: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
f380: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
f390: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
f3a0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
f3b0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
f3c0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
f3d0: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
f3e0: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
f3f0: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
f400: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
f410: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
f420: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
f430: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
f440: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
f450: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f460: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
f470: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f480: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
f490: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
f4a0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
f4b0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
f4c0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
f4d0: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
f4e0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
f4f0: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
f500: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
f510: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
f520: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
f530: 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
f540: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
f550: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
f560: 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
f570: 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
f580: 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
f590: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
f5a0: 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
f5b0: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
f5c0: 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
f5d0: 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
f5e0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
f5f0: 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
f600: 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49  et #350).**.** I
f610: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
f620: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
f630: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
f640: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
f650: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
f660: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
f670: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
f680: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
f690: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
f6a0: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
f6b0: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
f6c0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
f6d0: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
f6e0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
f6f0: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
f700: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
f710: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
f720: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
f730: 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
f740: 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
f750: 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
f760: 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
f770: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
f780: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
f790: 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
f7a0: 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
f7b0: 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
f7c0: 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
f7d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
f7e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f7f0: 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
f800: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f810: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
f820: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
f830: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
f840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f850: 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
f860: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f870: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
f880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
f890: 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
f8a0: 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
f8b0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
f8c0: 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
f8d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
f8e0: 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
f8f0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
f900: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
f910: 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
f920: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
f930: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
f940: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
f950: 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
f960: 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
f970: 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
f980: 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
f990: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
f9a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
f9b0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
f9c0: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
f9d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
f9e0: 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
f9f0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
fa00: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
fa10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
fa20: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
fa30: 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
fa40: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
fa50: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
fa60: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
fa70: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
fa80: 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
fa90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
faa0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
fab0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
fac0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
fad0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
faf0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
fb00: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
fb10: 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
fb20: 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
fb30: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
fb40: 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
fb50: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
fb60: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
fb70: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
fb80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fb90: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
fba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
fbb0: 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
fbc0: 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
fbd0: 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
fbe0: 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
fbf0: 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
fc00: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
fc10: 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
fc20: 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
fc30: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
fc40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
fc50: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
fc60: 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
fc70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
fc80: 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
fc90: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
fca0: 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 28  ubSrc );.  if( (
fcb0: 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
fcc0: 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 20 70 53  p->pLimit) || pS
fcd0: 75 62 2d 3e 70 4f 66 66 73 65 74 20 7c 7c 20 0a  ub->pOffset || .
fce0: 20 20 20 20 20 20 28 70 53 75 62 2d 3e 70 4c 69        (pSub->pLi
fcf0: 6d 69 74 20 26 26 20 69 73 41 67 67 29 20 29 20  mit && isAgg) ) 
fd00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
fd10: 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
fd20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
fd30: 66 28 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  f( pSub->isDisti
fd40: 6e 63 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  nct && (pSrc->nS
fd50: 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
fd60: 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
fd70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
fd80: 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
fd90: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
fda0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
fdb0: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
fdc0: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
fdd0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
fde0: 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
fdf0: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
fe00: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
fe10: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
fe20: 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
fe30: 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
fe40: 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
fe50: 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
fe60: 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
fe70: 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
fe80: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
fe90: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
fea0: 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
feb0: 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
fec0: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
fed0: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
fee0: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
fef0: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
ff00: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
ff10: 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
ff20: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
ff30: 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
ff40: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
ff50: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
ff60: 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
ff70: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
ff80: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
ff90: 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
ffa0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
ffb0: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
ffc0: 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
ffd0: 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
ffe0: 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
fff0: 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
10000 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
10010 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
10020 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
10030 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
10040 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
10050 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
10060 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
10070 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
10080 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
10090 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
100a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
100b0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
100c0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
100d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
100e0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
100f0 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
10100 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
10110 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
10120 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
10130 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
10140 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
10150 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
10160 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
10170 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
10180 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
10190 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
101a0 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
101b0 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
101c0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
101d0 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
101e0 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
101f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
10200 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
10210 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
10220 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
10230 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
10240 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
10250 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
10260 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
10270 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
10280 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
10290 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
102a0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
102b0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
102c0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
102d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
102e0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
102f0 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
10300 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
10310 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
10320 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
10330 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
10340 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
10350 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
10360 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
10370 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
10380 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
10390 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
103a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
103b0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
103c0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
103d0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
103e0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
103f0 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
10400 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
10410 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
10420 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
10430 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
10440 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
10450 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
10460 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ->iCursor;.  {. 
10470 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
10480 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
10490 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
104a0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
104b0 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69  ntype;..    sqli
104c0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
104d0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  , pSubitem->pTab
104e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
104f0 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  e(pSubitem->zDat
10500 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
10510 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
10520 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
10530 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
10540 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
10550 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
10560 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
10570 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20  = nSubSrc - 1;. 
10580 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
10590 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
105a0 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71         pSrc = sq
105b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
105c0 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  nd(pSrc, 0, 0);.
105d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
105e0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
105f0 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
10600 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e  nSrc-1; i-extra>
10610 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20  =iFrom; i--){.  
10620 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d        pSrc->a[i]
10630 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74   = pSrc->a[i-ext
10640 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra];.      }.   
10650 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
10660 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
10670 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
10680 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
10690 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
106a0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
106b0 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
106c0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
106d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
106e0 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63  >a[iFrom+nSubSrc
106f0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  -1].jointype = j
10700 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
10710 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
10720 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
10730 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
10740 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
10750 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
10760 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
10770 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10780 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
10790 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
107a0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
107b0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
107c0 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
107d0 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
107e0 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10810 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
10820 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
10830 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
10840 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10850 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
10860 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10870 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
10880 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
10890 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
108a0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
108b0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
108c0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
108d0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
108e0 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
108f0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
10900 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
10910 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
10920 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  /.  substExprLis
10930 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  t(p->pEList, iPa
10940 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10950 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  st);.  pList = p
10960 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
10970 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
10980 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
10990 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
109a0 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
109b0 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
109c0 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
109d0 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
109e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
109f0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
10a00 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45  sqliteStrNDup(pE
10a10 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78  xpr->span.z, pEx
10a20 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20  pr->span.n);.   
10a30 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41   }.  }.  if( isA
10a40 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  gg ){.    substE
10a50 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
10a60 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
10a70 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
10a80 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
10a90 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
10aa0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10ab0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
10ac0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
10ad0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
10ae0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
10af0 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
10b00 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70  >pOrderBy;.    p
10b10 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
10b20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
10b30 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
10b40 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
10b50 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
10b60 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10b70 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
10b80 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
10b90 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
10ba0 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
10bb0 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73  >pWhere);.  }els
10bc0 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  e{.    pWhere = 
10bd0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62  0;.  }.  if( sub
10be0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
10bf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
10c00 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ving==0 );.    p
10c10 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70  ->pHaving = p->p
10c20 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57  Where;.    p->pW
10c30 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
10c40 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
10c50 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
10c60 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10c70 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
10c80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
10c90 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c  (p->pHaving, sql
10ca0 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62  ite3ExprDup(pSub
10cb0 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20  ->pHaving));.   
10cc0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
10cd0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  upBy==0 );.    p
10ce0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
10cf0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
10d00 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b  pSub->pGroupBy);
10d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
10d20 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
10d30 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
10d40 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
10d50 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
10d60 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68  e3ExprAnd(p->pWh
10d70 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
10d80 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  }..  /* The flat
10d90 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
10da0 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
10db0 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
10dc0 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  he.  ** outer qu
10dd0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
10de0 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69   .  */.  p->isDi
10df0 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
10e00 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e  stinct || pSub->
10e10 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
10e20 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e  *.  ** SELECT ..
10e30 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
10e40 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
10e50 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
10e60 53 45 54 20 79 3b 0a 20 20 2a 2f 0a 20 20 69 66  SET y;.  */.  if
10e70 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
10e80 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  {.    p->pLimit 
10e90 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
10ea0 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
10eb0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
10ec0 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
10ed0 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
10ee0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
10ef0 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
10f00 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
10f10 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
10f20 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
10f30 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
10f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10f50 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  W */../*.** Anal
10f60 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
10f70 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
10f80 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
10f90 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
10fa0 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
10fb0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
10fc0 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
10fd0 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
10fe0 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
10ff0 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
11000 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
11010 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
11020 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
11030 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
11040 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
11050 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
11060 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
11070 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
11080 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
11090 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
110a0 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
110b0 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
110c0 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
110d0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
110e0 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
110f0 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
11100 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
11110 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
11120 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
11130 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
11140 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
11150 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
11160 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
11170 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
11180 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
11190 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
111a0 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
111b0 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
111c0 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
111d0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
111e0 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
111f0 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
11200 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
11210 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
11220 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
11230 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
11240 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
11250 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
11260 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a  qlite3Select()..
11270 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
11280 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
11290 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
112a0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
112b0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
112c0 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
112d0 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
112e0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
112f0 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
11300 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
11310 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
11320 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
11330 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
11340 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
11350 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
11360 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
11370 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
11380 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
11390 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
113a0 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
113b0 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
113c0 2a 70 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65  *pSrc;..  /* Che
113d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
113e0 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
113f0 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
11400 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
11410 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
11420 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
11430 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
11440 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
11450 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
11460 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
11470 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28  = p->pSrc;.  if(
11480 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
11490 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c   return 0;.  pEL
114a0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
114b0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
114c0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
114d0 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45   0;.  pExpr = pE
114e0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
114f0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
11500 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
11510 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
11520 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
11530 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
11540 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
11550 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
11560 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
11570 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
11580 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
11590 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
115a0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
115b0 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
115c0 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77   seekOp = OP_Rew
115d0 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ind;.  }else if(
115e0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
115f0 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
11600 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
11610 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
11620 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
11630 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11640 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    pExpr = pList-
11650 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
11660 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
11670 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
11680 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
11690 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
116a0 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
116b0 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
116c0 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20  we get to here, 
116d0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65  it means the que
116e0 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ry is of the cor
116f0 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20  rect form..  ** 
11700 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
11710 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e  re we have an in
11720 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64  dex and make pId
11730 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  x point to the. 
11740 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
11750 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d  index.  If the m
11760 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
11770 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50   on an INTEGER P
11780 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20  RIMARY.  ** key 
11790 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78  column, no index
117a0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
117b0 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c   set pIdx to NUL
117c0 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75  L.  If no.  ** u
117d0 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66  sable index is f
117e0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ound, return 0..
117f0 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c    */.  if( iCol<
11800 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20  0 ){.    pIdx = 
11810 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11820 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11830 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11840 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
11850 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  r);.    for(pIdx
11860 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
11870 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
11880 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
11890 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
118a0 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn>=1 );.      
118b0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
118c0 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70  mn[0]==iCol && p
118d0 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
118e0 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62  ll[0]==pColl ) b
118f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11900 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65  if( pIdx==0 ) re
11910 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
11920 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
11930 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
11940 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20  ll be using the 
11950 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
11960 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
11970 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
11980 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
11990 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
119a0 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68  ry cell..  ** Th
119b0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68  e column names h
119c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
119d0 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
119e0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
119f0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  on..  */.  v = s
11a00 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11a10 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
11a20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
11a30 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
11a40 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
11a50 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
11a60 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
11a70 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
11a80 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
11a90 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
11aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11ab0 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
11ac0 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
11ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11ae0 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
11af0 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b  umns, iParm, 1);
11b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
11b10 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
11b20 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
11b30 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
11b40 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
11b50 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
11b60 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
11b70 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
11b80 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
11b90 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
11ba0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
11bb0 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
11bc0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
11bd0 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
11be0 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
11bf0 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
11c00 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  table..  */.  sq
11c10 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
11c20 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54  chema(pParse, pT
11c30 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65  ab->iDb);.  base
11c40 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43   = pSrc->a[0].iC
11c50 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65  ursor;.  compute
11c60 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
11c70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
11c80 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
11c90 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
11ca0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f  lite3OpenTableFo
11cb0 72 52 65 61 64 69 6e 67 28 76 2c 20 62 61 73 65  rReading(v, base
11cc0 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63  , pTab);.  }.  c
11cd0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
11ce0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11cf0 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
11d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11d10 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
11d20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
11d30 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74  e{.    /* Even t
11d40 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72  hough the cursor
11d50 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
11d60 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20  e index here is 
11d70 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  closed.    ** as
11d80 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c   soon as a singl
11d90 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e  e value has been
11da0 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61   read from it, a
11db0 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a  llocate it.    *
11dc0 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d  * using (pParse-
11dd0 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76  >nTab++) to prev
11de0 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  ent the cursor i
11df0 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20  d from being .  
11e00 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69    ** reused. Thi
11e10 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  s is important f
11e20 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  or statements of
11e30 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a   the form .    *
11e40 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  * "INSERT INTO x
11e50 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52   SELECT max() FR
11e60 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  OM x"..    */.  
11e70 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20    int iIdx;.    
11e80 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
11e90 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
11ea0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11eb0 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
11ec0 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
11ed0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11ee0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
11ef0 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20  x, pIdx->tnum,. 
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d 3e    (char*)&pIdx->
11f20 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
11f30 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20 73 65  NFO);.    if( se
11f40 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ekOp==OP_Rewind 
11f50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11f60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11f70 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
11f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11f90 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
11fa0 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  cord, 1, 0);.   
11fb0 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
11fc0 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20  oveGt;.    }.   
11fd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11fe0 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
11ff0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
12000 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12010 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
12020 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12030 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12040 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
12050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12060 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
12070 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
12080 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
12090 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
120a0 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
120b0 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
120c0 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
120d0 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
120e0 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
120f0 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
12100 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
12110 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
12120 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
12130 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74  Parm, cont, cont
12140 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
12150 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12160 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
12170 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12180 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
12190 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
121a0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
121b0 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
121c0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
121d0 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
121e0 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
121f0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
12200 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
12210 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20  .**.** An ORDER 
12220 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69  BY or GROUP BY i
12230 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
12240 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79  essions.  If any
12250 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
12260 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
12270 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74  stant, then that
12280 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
12290 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a  eplaced by the.*
122a0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
122b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73  entry in the res
122c0 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
122d0 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72  ic int processOr
122e0 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61  derGroupBy(.  Na
122f0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
12300 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
12310 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ext of the SELEC
12320 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  T statement. */.
12330 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
12340 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f  erBy,   /* The O
12350 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
12360 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
12370 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
12380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
12390 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
123a0 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
123b0 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
123c0 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
123d0 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
123e0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
123f0 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  st;     /* The r
12400 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
12410 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72   SELECT */.  Par
12420 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
12430 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
12440 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
12450 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
12460 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
12470 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  t );..  if( pOrd
12480 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
12490 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
124a0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
124b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
124c0 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
124d0 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
124e0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
124f0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
12500 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
12510 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
12520 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
12530 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
12540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12550 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
12560 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
12570 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
12580 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
12590 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
125a0 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
125b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
125c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
125d0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
125e0 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c        "%s BY col
125f0 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
12600 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
12610 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
12620 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
12630 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69  nd %d", zType, i
12640 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
12650 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
12660 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
12670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12680 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
12690 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b  ames(pNC, pE) ){
126a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
126b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
126c0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
126d0 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
126e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
126f0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
12700 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d 73      "%s BY terms
12710 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
12720 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
12730 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20  ts", zType);.   
12740 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
12750 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12760 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12770 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
12780 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
12790 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
127a0 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
127b0 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
127c0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
127d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
127e0 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
127f0 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
12800 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
12810 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
12820 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
12830 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
12840 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
12850 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
12860 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
12870 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12880 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
12890 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
128a0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
128b0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
128c0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
128d0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
128e0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
128f0 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
12900 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
12910 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
12920 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
12930 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
12940 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
12950 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12970 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
12980 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
12990 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
129a0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
129b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
129c0 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
129d0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
129e0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
129f0 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  n before, return
12a00 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
12a10 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f  .  if( p->isReso
12a20 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  lved ){.    asse
12a30 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b  rt( !pOuterNC );
12a40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12a50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  TE_OK;.  }.  p->
12a60 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a  isResolved = 1;.
12a70 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68  .  /* If there h
12a80 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
12a90 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68   errors, do noth
12aa0 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ing. */.  if( pP
12ab0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
12ac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12ad0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
12ae0 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73  /* Prepare the s
12af0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e  elect statement.
12b00 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
12b10 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72  allocate all cur
12b20 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  sors.  ** requir
12b30 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
12b40 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71   tables and subq
12b50 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
12b60 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  OM clause..  */.
12b70 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
12b80 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
12b90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12ba0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
12bb0 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
12bc0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
12bd0 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
12be0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
12bf0 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  hese.  ** are no
12c00 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  t allowed to ref
12c10 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c  er to any names,
12c20 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74   so pass an empt
12c30 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20  y NameContext.. 
12c40 20 2a 2f 0a 20 20 73 4e 43 2e 70 50 61 72 73 65   */.  sNC.pParse
12c50 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43   = pParse;.  sNC
12c60 2e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 73  .hasAgg = 0;.  s
12c70 4e 43 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73  NC.nErr = 0;.  s
12c80 4e 43 2e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 73  NC.nRef = 0;.  s
12c90 4e 43 2e 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20  NC.pEList = 0;. 
12ca0 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
12cb0 30 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  0;.  sNC.pSrcLis
12cc0 74 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 4e 65  t = 0;.  sNC.pNe
12cd0 78 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  xt = 0;.  if( sq
12ce0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
12cf0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
12d00 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20  Limit) ||.      
12d10 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
12d20 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
12d30 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
12d40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12d50 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
12d60 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c  Set up the local
12d70 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f   name-context to
12d80 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73   pass to ExprRes
12d90 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20  olveNames() to. 
12da0 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20   ** resolve the 
12db0 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e  expression-list.
12dc0 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f  .  */.  sNC.allo
12dd0 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e  wAgg = 1;.  sNC.
12de0 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pSrcList = p->pS
12df0 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20  rc;.  sNC.pNext 
12e00 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f  = pOuterNC;..  /
12e10 2a 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 6e 44  * NameContext.nD
12e20 65 70 74 68 20 73 74 6f 72 65 73 20 74 68 65 20  epth stores the 
12e30 64 65 70 74 68 20 6f 66 20 72 65 63 75 72 73 69  depth of recursi
12e40 6f 6e 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  on for this quer
12e50 79 2e 20 46 6f 72 0a 20 20 2a 2a 20 61 6e 20 6f  y. For.  ** an o
12e60 75 74 65 72 20 71 75 65 72 79 20 28 65 2e 67 2e  uter query (e.g.
12e70 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
12e80 71 6c 69 74 65 5f 6d 61 73 74 65 72 29 20 74 68  qlite_master) th
12e90 69 73 20 69 73 20 31 2e 20 46 6f 72 0a 20 20 2a  is is 1. For.  *
12ea0 2a 20 61 20 73 75 62 71 75 65 72 79 20 69 74 20  * a subquery it 
12eb0 69 73 20 32 2e 20 46 6f 72 20 61 20 73 75 62 71  is 2. For a subq
12ec0 75 65 72 79 20 6f 66 20 61 20 73 75 62 71 75 65  uery of a subque
12ed0 72 79 2c 20 33 2e 20 41 6e 64 20 73 6f 20 6f 6e  ry, 3. And so on
12ee0 2e 20 0a 20 20 2a 2a 20 50 61 72 73 65 2e 6e 4d  . .  ** Parse.nM
12ef0 61 78 44 65 70 74 68 20 69 73 20 74 68 65 20 6d  axDepth is the m
12f00 61 78 69 6d 75 6d 20 64 65 70 74 68 20 66 6f 72  aximum depth for
12f10 20 61 6e 79 20 73 75 62 71 75 65 72 79 20 72 65   any subquery re
12f20 73 6f 6c 76 65 64 20 73 6f 0a 20 20 2a 2a 20 66  solved so.  ** f
12f30 61 72 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ar. This is used
12f40 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 67 67 72  e number of aggr
12f60 65 67 61 74 65 20 63 6f 6e 74 65 78 74 73 0a 20  egate contexts. 
12f70 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 74 20   ** required at 
12f80 72 75 6e 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  runtime..  */.  
12f90 73 4e 43 2e 6e 44 65 70 74 68 20 3d 20 28 70 4f  sNC.nDepth = (pO
12fa0 75 74 65 72 4e 43 3f 70 4f 75 74 65 72 4e 43 2d  uterNC?pOuterNC-
12fb0 3e 6e 44 65 70 74 68 2b 31 3a 31 29 3b 0a 20 20  >nDepth+1:1);.  
12fc0 69 66 28 20 73 4e 43 2e 6e 44 65 70 74 68 3e 70  if( sNC.nDepth>p
12fd0 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68  Parse->nMaxDepth
12fe0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
12ff0 6e 4d 61 78 44 65 70 74 68 20 3d 20 73 4e 43 2e  nMaxDepth = sNC.
13000 6e 44 65 70 74 68 3b 0a 20 20 7d 0a 0a 20 20 2f  nDepth;.  }..  /
13010 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
13020 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
13030 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  t. */.  pEList =
13040 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
13050 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75  ( !pEList ) retu
13060 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13070 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
13080 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13090 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  ){.    Expr *pX 
130a0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
130b0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71  Expr;.    if( sq
130c0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
130d0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20  Names(&sNC, pX) 
130e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
130f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13100 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
13110 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67   there are no ag
13120 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
13130 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  s in the result-
13140 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55  set, and no GROU
13150 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65  P BY .  ** expre
13160 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c  ssion, do not al
13170 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69  low aggregates i
13180 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68  n any of the oth
13190 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  er expressions..
131a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
131b0 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 69 66  p->isAgg );.  if
131c0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c  ( p->pGroupBy ||
131d0 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20   sNC.hasAgg ){. 
131e0 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b     p->isAgg = 1;
131f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e  .  }else{.    sN
13200 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a  C.allowAgg = 0;.
13210 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48    }..  /* If a H
13220 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
13230 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
13240 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52  ere must be a GR
13250 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
13260 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61   */.  if( p->pHa
13270 76 69 6e 67 20 26 26 20 21 70 2d 3e 70 47 72 6f  ving && !p->pGro
13280 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
13290 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
132a0 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
132b0 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
132c0 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
132d0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
132e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
132f0 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65  ..  /* Add the e
13300 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
13310 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
13320 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
13330 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  g the.  ** other
13340 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
13350 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
13360 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
13370 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65   that.  ** expre
13380 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
13390 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
133a0 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
133b0 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
133c0 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
133d0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
133e0 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  **.  ** Minor po
133f0 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
13400 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
13410 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
13420 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76  ll be.  ** re-ev
13430 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
13440 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
13450 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c  ..  */.  sNC.pEL
13460 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
13470 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
13480 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
13490 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
134a0 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ||.      sqlite3
134b0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
134c0 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
134d0 67 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63  g) ||.      proc
134e0 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
134f0 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42  &sNC, p->pOrderB
13500 79 2c 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20  y, "ORDER") ||. 
13510 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65       processOrde
13520 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
13530 2d 3e 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f  ->pGroupBy, "GRO
13540 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  UP").  ){.    re
13550 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13560 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
13570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13580 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
13590 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
135a0 67 20 73 74 72 75 63 74 20 69 73 20 75 73 65 64  g struct is used
135b0 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
135c0 74 28 29 0a 2a 2a 20 74 6f 20 73 61 76 65 20 61  t().** to save a
135d0 67 67 72 65 67 61 74 65 20 72 65 6c 61 74 65 64  ggregate related
135e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
135f0 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
13600 63 74 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  ct.** at the sta
13610 72 74 20 6f 66 20 65 61 63 68 20 63 61 6c 6c 20  rt of each call 
13620 61 6e 64 20 74 6f 20 72 65 73 74 6f 72 65 20 69  and to restore i
13630 74 20 61 74 20 74 68 65 20 65 6e 64 2e 20 53 65  t at the end. Se
13640 65 0a 2a 2a 20 73 61 76 65 41 67 67 72 65 67 61  e.** saveAggrega
13650 74 65 49 6e 66 6f 28 29 20 61 6e 64 20 72 65 73  teInfo() and res
13660 74 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e 66  toreAggregateInf
13670 6f 28 29 2e 0a 2a 2f 20 0a 73 74 72 75 63 74 20  o()..*/ .struct 
13680 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20 7b 0a  AggregateInfo {.
13690 20 20 69 6e 74 20 6e 41 67 67 3b 0a 20 20 41 67    int nAgg;.  Ag
136a0 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 7d 3b 0a  gExpr *aAgg;.};.
136b0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 41  typedef struct A
136c0 67 67 72 65 67 61 74 65 49 6e 66 6f 20 41 67 67  ggregateInfo Agg
136d0 72 65 67 61 74 65 49 6e 66 6f 3b 0a 0a 2f 2a 20  regateInfo;../* 
136e0 0a 2a 2a 20 43 6f 70 79 20 61 67 67 72 65 67 61  .** Copy aggrega
136f0 74 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72  te related infor
13700 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
13710 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 0a  Parse structure.
13720 2a 2a 20 69 6e 74 6f 20 74 68 65 20 41 67 67 72  ** into the Aggr
13730 65 67 61 74 65 49 6e 66 6f 20 73 74 72 75 63 74  egateInfo struct
13740 75 72 65 2e 20 5a 65 72 6f 20 74 68 65 20 61 67  ure. Zero the ag
13750 67 72 65 67 61 74 65 20 72 65 6c 61 74 65 64 0a  gregate related.
13760 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ** values in the
13770 20 50 61 72 73 65 20 73 74 72 75 63 74 2e 0a 2a   Parse struct..*
13780 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 61  /.static void sa
13790 76 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28  veAggregateInfo(
137a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
137b0 67 67 72 65 67 61 74 65 49 6e 66 6f 20 2a 70 49  ggregateInfo *pI
137c0 6e 66 6f 29 7b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nfo){.  pInfo->a
137d0 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  Agg = pParse->aA
137e0 67 67 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 41 67  gg;.  pInfo->nAg
137f0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  g = pParse->nAgg
13800 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67  ;.  pParse->aAgg
13810 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
13820 6e 41 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nAgg = 0;.}../*.
13830 2a 2a 20 43 6f 70 79 20 61 67 67 72 65 67 61 74  ** Copy aggregat
13840 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d  e related inform
13850 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 41  ation from the A
13860 67 67 72 65 67 61 74 65 49 6e 66 6f 20 73 74 72  ggregateInfo str
13870 75 63 74 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f  uct.** back into
13880 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
13890 74 75 72 65 2e 20 54 68 65 20 61 67 67 72 65 67  ture. The aggreg
138a0 61 74 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f  ate related info
138b0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 63 75 72 72 65  rmation.** curre
138c0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74  ntly stored in t
138d0 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
138e0 72 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  re is deleted..*
138f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
13900 73 74 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e  storeAggregateIn
13910 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
13920 2c 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20  , AggregateInfo 
13930 2a 70 49 6e 66 6f 29 7b 0a 20 20 73 71 6c 69 74  *pInfo){.  sqlit
13940 65 46 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41  eFree(pParse->aA
13950 67 67 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  gg);.  pParse->a
13960 41 67 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 41 67  Agg = pInfo->aAg
13970 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67  g;.  pParse->nAg
13980 67 20 3d 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 3b  g = pInfo->nAgg;
13990 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  .}.  ./*.** Gene
139a0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
139b0 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
139c0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
139d0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
139e0 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
139f0 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
13a00 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
13a10 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
13a20 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
13a30 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
13a40 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
13a50 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
13a60 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13a90 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
13aa0 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
13ab0 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
13ac0 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
13ad0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
13ae0 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
13af0 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
13b00 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
13b10 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
13b20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
13b30 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
13b40 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c   as keys of tabl
13b50 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
13b60 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
13b70 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
13b80 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
13b90 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
13ba0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
13bb0 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
13bc0 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
13bd0 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
13be0 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
13bf0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
13c00 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
13c10 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
13c20 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
13c30 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
13c40 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
13c50 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
13c60 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
13c70 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
13c80 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
13c90 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
13ca0 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
13cb0 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
13cc0 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
13cd0 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
13ce0 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
13cf0 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
13d00 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
13d10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13d20 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
13d30 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
13d40 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
13d50 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
13d60 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
13d70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
13d80 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
13d90 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
13da0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
13db0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
13dc0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
13dd0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
13de0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
13df0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
13e00 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
13e10 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
13e20 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
13e30 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
13e40 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
13e50 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
13e60 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
13e70 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
13e80 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
13e90 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
13ea0 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
13eb0 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
13ec0 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
13ed0 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
13ee0 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
13ef0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
13f00 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
13f10 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
13f20 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
13f30 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
13f40 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
13f50 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
13f60 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
13f70 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
13f80 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
13f90 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
13fa0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
13fb0 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
13fc0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
13fd0 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
13fe0 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
13ff0 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
14000 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
14030 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
14040 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
14090 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
140a0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
140b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
140c0 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
140d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
140e0 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
140f0 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
14100 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
14110 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
14120 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
14130 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
14140 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14150 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
14160 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
14170 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
14180 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
14190 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
141a0 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
141b0 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
141c0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
141d0 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
141e0 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
141f0 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
14200 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
14210 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
14220 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
14230 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
14240 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
14250 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
14260 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
14270 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
14280 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14290 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
142a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
142b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
142c0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
142d0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
142e0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
142f0 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
14300 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
14310 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
14320 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
14330 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
14340 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72    /* A parameter
14350 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65   used by the eDe
14360 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  st disposal meth
14370 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  od */.  Select *
14380 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
14390 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
143a0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
143b0 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
143c0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
143d0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
143e0 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
143f0 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
14400 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
14410 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f  rentAgg,       /
14420 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
14430 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
14440 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
14450 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
14460 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
14470 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
14480 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
14490 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
144a0 20 69 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   i;.  WhereInfo 
144b0 2a 70 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20  *pWInfo;.  Vdbe 
144c0 2a 76 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 3b  *v;.  int isAgg;
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
144e0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
144f0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
14500 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
14510 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
14520 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
14530 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
14540 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
14550 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
14560 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
14570 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
14580 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
14590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
145a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
145b0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
145c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
145d0 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
145e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
145f0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
14600 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
14610 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
14620 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
14630 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
14640 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
14650 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
14660 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
14670 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
14680 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
14690 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
146a0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
146b0 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
146c0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
146d0 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
146e0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
146f0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
14700 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
14710 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
14720 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
14730 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
14740 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 72  nction */.  Aggr
14750 65 67 61 74 65 49 6e 66 6f 20 73 41 67 67 49 6e  egateInfo sAggIn
14760 66 6f 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  fo;..  if( sqlit
14770 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
14780 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
14790 20 7c 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72   || p==0 ) retur
147a0 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
147b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
147c0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
147d0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
147e0 74 75 72 6e 20 31 3b 0a 0a 23 69 66 6e 64 65 66  turn 1;..#ifndef
147f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
14800 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
14810 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
14820 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
14830 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
14840 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
14850 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
14860 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
14870 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
14880 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
14890 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29  est, iParm, aff)
148a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
148b0 73 61 76 65 41 67 67 72 65 67 61 74 65 49 6e 66  saveAggregateInf
148c0 6f 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  o(pParse, &sAggI
148d0 6e 66 6f 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  nfo);.  pOrderBy
148e0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
148f0 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
14900 5f 55 6e 69 6f 6e 20 7c 7c 20 65 44 65 73 74 3d  _Union || eDest=
14910 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 65  =SRT_Except || e
14920 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
14930 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  d ){.    p->pOrd
14940 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  erBy = 0;.  }.  
14950 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
14960 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
14970 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f   p, 0) ){.    go
14980 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
14990 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79   }.  p->pOrderBy
149a0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
149b0 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
149c0 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
149d0 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
149e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
149f0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
14a00 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
14a10 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
14a20 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
14a30 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
14a40 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67  >pHaving;.  isAg
14a50 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
14a60 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
14a70 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45  isDistinct;.  pE
14a80 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
14a90 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
14aa0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
14ab0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
14ac0 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
14ad0 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
14ae0 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
14af0 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
14b00 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
14b10 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
14b20 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
14b30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14b40 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
14b50 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
14b60 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
14b70 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
14b80 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
14b90 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
14ba0 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
14bb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 44   */.  assert( eD
14bc0 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
14bd0 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
14be0 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==1 );.#ifndef S
14bf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
14c00 45 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74  ERY.  if( (eDest
14c10 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
14c20 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
14c30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
14c40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14c50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14c60 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
14c70 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
14c80 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
14c90 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
14ca0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
14cb0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  n");.    goto se
14cc0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
14cd0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
14ce0 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
14cf0 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
14d00 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69  ions..  */.  swi
14d10 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
14d20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
14d30 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
14d40 78 63 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20  xcept:.    case 
14d50 53 52 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20  SRT_Discard:.   
14d60 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
14d70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d80 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
14d90 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
14da0 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
14db0 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
14dc0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14dd0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
14de0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
14df0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
14e00 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
14e10 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
14e20 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
14e30 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
14e40 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
14e50 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
14e60 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
14e70 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
14e80 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
14e90 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
14ea0 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
14eb0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14ec0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
14ed0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
14ee0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
14ef0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
14f00 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
14f10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
14f20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
14f30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
14f40 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
14f50 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
14f60 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
14f70 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
14f80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
14f90 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
14fa0 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
14fb0 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
14fc0 72 65 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20  reContext;..    
14fd0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
14fe0 69 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  i].pSelect==0 ) 
14ff0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
15000 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
15010 2e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  .zName!=0 ){.   
15020 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e     zSavedAuthCon
15030 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
15040 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
15050 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
15060 43 6f 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69  Context = pTabLi
15070 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
15080 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
15090 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
150a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
150b0 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
150c0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
150d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
150e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d  Parse, pTabList-
150f0 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53  >a[i].pSelect, S
15100 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20  RT_TempTable, . 
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
15130 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69  Cursor, p, i, &i
15140 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  sAgg, 0);.    if
15150 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
15160 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
15170 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
15180 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
15190 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
151a0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
151b0 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
151c0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
151d0 20 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54    if( eDest!=SRT
151e0 5f 55 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21  _Union && eDest!
151f0 3d 53 52 54 5f 45 78 63 65 70 74 20 26 26 20 65  =SRT_Except && e
15200 44 65 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72  Dest!=SRT_Discar
15210 64 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  d ){.      pOrde
15220 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
15230 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
15240 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
15250 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
15260 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
15270 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
15280 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
15290 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
152a0 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
152b0 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
152c0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
152d0 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
152e0 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
152f0 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
15300 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
15310 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
15320 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
15330 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
15340 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
15350 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  nd;.  }..  /* Ch
15360 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
15370 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
15380 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
15390 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
153a0 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
153b0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
153c0 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
153d0 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
153e0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
153f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15400 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
15410 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
15420 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
15430 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
15440 28 70 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74  (pParse, pParent
15450 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50  , parentTab, *pP
15460 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29  arentAgg, isAgg)
15470 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67   ){.    if( isAg
15480 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20  g ) *pParentAgg 
15490 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 1;.    goto se
154a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
154b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
154c0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
154d0 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c  BY clause, resol
154e0 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e  ve any collation
154f0 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20   sequences.  ** 
15500 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76 65 20  names that have 
15510 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20  been explicitly 
15520 73 70 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a  specified..  */.
15530 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
15540 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
15550 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
15560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
15570 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
15580 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
15590 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
155a0 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20  .pExpr->pColl = 
155b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
155c0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
155d0 71 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  q(pParse, pOrder
155e0 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  By->a[i].zName, 
155f0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
15600 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
15610 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
15620 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15640 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
15650 72 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  r..  */.  comput
15660 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
15670 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f  pParse, p);..  /
15680 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
15690 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
156a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
156b0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
156c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
156d0 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
156e0 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
156f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
15700 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69  P_OpenVirtual, i
15710 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
15720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15730 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
15740 6e 73 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73  ns, iParm, pELis
15750 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
15760 20 20 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79    /* Do an analy
15770 73 69 73 20 6f 66 20 61 67 67 72 65 67 61 74 65  sis of aggregate
15780 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
15790 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c  */.  if( isAgg |
157a0 7c 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  | pGroupBy ){.  
157b0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
157c0 43 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  C;.    memset(&s
157d0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
157e0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
157f0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
15800 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
15810 20 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 20 20   pTabList;..    
15820 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
15830 6e 41 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  nAgg==0 );.    i
15840 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  sAgg = 1;.    fo
15850 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
15860 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
15870 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
15880 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
15890 61 74 65 73 28 26 73 4e 43 2c 20 70 45 4c 69 73  ates(&sNC, pELis
158a0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
158b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
158c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
158d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
158e0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
158f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47     for(i=0; i<pG
15900 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
15910 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
15920 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
15930 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
15940 4e 43 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  NC, pGroupBy->a[
15950 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
15960 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
15970 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
15980 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
15990 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
159a0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  && sqlite3ExprAn
159b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
159c0 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29  &sNC, pHaving) )
159d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
159e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
159f0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
15a00 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
15a10 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
15a20 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
15a30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
15a40 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
15a50 74 65 73 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  tes(&sNC, pOrder
15a60 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  By->a[i].pExpr) 
15a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
15a80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
15a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15aa0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15ab0 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
15ac0 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ator.  */.  if( 
15ad0 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74  isAgg ){.    int
15ae0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15af0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
15b00 67 67 52 65 73 65 74 2c 20 28 70 47 72 6f 75 70  ggReset, (pGroup
15b10 42 79 3f 30 3a 31 29 2c 20 70 50 61 72 73 65 2d  By?0:1), pParse-
15b20 3e 6e 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28  >nAgg);.    for(
15b30 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
15b40 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
15b50 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b   FuncDef *pFunc;
15b60 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e  .      if( (pFun
15b70 63 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  c = pParse->aAgg
15b80 5b 69 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26  [i].pFunc)!=0 &&
15b90 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a   pFunc->xFinaliz
15ba0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
15bb0 69 6e 74 20 6e 45 78 70 72 20 3d 20 30 3b 0a 23  int nExpr = 0;.#
15bc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45  ifdef SQLITE_SSE
15bd0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
15be0 41 67 67 45 78 70 72 20 3d 20 70 50 61 72 73 65  AggExpr = pParse
15bf0 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b  ->aAgg[i].pExpr;
15c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67  .        if( pAg
15c10 67 45 78 70 72 20 26 26 20 70 41 67 67 45 78 70  gExpr && pAggExp
15c20 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
15c30 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 41        nExpr = pA
15c40 67 67 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  ggExpr->pList->n
15c50 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
15c60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73  #endif.        s
15c70 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
15c80 20 4f 50 5f 41 67 67 49 6e 69 74 2c 20 6e 45 78   OP_AggInit, nEx
15c90 70 72 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46  pr, i, (char*)pF
15ca0 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
15cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15cc0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
15cd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
15ce0 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66   = sizeof(KeyInf
15cf0 6f 29 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e  o) + pGroupBy->n
15d00 45 78 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  Expr*sizeof(Coll
15d10 53 65 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79  Seq*);.      Key
15d20 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65  Info *pKey = (Ke
15d30 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61  yInfo *)sqliteMa
15d40 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
15d50 69 66 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20  if( 0==pKey ){. 
15d60 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
15d70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
15d80 20 20 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20        pKey->enc 
15d90 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
15da0 63 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e  c;.      pKey->n
15db0 46 69 65 6c 64 20 3d 20 70 47 72 6f 75 70 42 79  Field = pGroupBy
15dc0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 66  ->nExpr;.      f
15dd0 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70  or(i=0; i<pGroup
15de0 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
15df0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  .        pKey->a
15e00 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
15e10 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
15e20 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
15e30 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
15e40 20 20 20 20 69 66 28 20 21 70 4b 65 79 2d 3e 61      if( !pKey->a
15e50 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
15e60 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
15e70 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  [i] = pParse->db
15e80 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
15e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15eb0 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
15ec0 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20  , (char *)pKey, 
15ed0 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
15ee0 46 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  FF);.    }.  }..
15ef0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
15f00 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
15f10 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 53 52 54 5f  to NULL for SRT_
15f20 4d 65 6d 20 6f 72 20 30 20 66 6f 72 20 53 52 54  Mem or 0 for SRT
15f30 5f 45 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 69  _Exists.  */.  i
15f40 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  f( eDest==SRT_Me
15f50 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
15f60 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 73 71  Exists ){.    sq
15f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15f80 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  , eDest==SRT_Mem
15f90 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f   ? OP_Null : OP_
15fa0 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
15fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15fc0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
15fd0 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
15fe0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
15ff0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16000 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
16010 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
16020 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69  */.  if( isDisti
16030 6e 63 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69  nct ){.    disti
16040 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
16050 61 62 2b 2b 3b 0a 20 20 20 20 6f 70 65 6e 56 69  ab++;.    openVi
16060 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
16070 65 2c 20 70 2c 20 64 69 73 74 69 6e 63 74 29 3b  e, p, distinct);
16080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
16090 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
160a0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65  ..  /* Begin the
160b0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20   database scan. 
160c0 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
160d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
160e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
160f0 74 2c 20 70 57 68 65 72 65 2c 0a 20 20 20 20 20  t, pWhere,.     
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
16120 20 3f 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79   ? 0 : &pOrderBy
16130 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  );.  if( pWInfo=
16140 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
16150 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  _end;..  /* Use 
16160 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
16170 65 72 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72  er loop if we ar
16180 65 20 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69  e not dealing wi
16190 74 68 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74  th.  ** aggregat
161a0 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  es.  */.  if( !i
161b0 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
161c0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
161d0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
161e0 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
161f0 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
16200 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
16210 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
16220 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
16230 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
16240 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
16250 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
16260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16270 2a 20 49 66 20 77 65 20 61 72 65 20 64 65 61 6c  * If we are deal
16280 69 6e 67 20 77 69 74 68 20 61 67 67 72 65 67 61  ing with aggrega
16290 74 65 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  tes, then do the
162a0 20 73 70 65 63 69 61 6c 20 61 67 67 72 65 67 61   special aggrega
162b0 74 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  te.  ** processi
162c0 6e 67 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73  ng.  .  */.  els
162d0 65 7b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a  e{.    AggExpr *
162e0 70 41 67 67 3b 0a 20 20 20 20 69 6e 74 20 6c 62  pAgg;.    int lb
162f0 6c 31 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  l1 = 0;.    pPar
16300 73 65 2d 3e 66 69 6c 6c 41 67 67 20 3d 20 31 3b  se->fillAgg = 1;
16310 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
16320 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
16330 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
16340 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
16350 70 42 79 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e  pBy);.      /* N
16360 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  o affinity strin
16370 67 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  g is attached to
16380 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f   the following O
16390 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20  P_MakeRecord .  
163a0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77      ** because w
163b0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
163c0 20 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e   do any coercion
163d0 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a   of datatypes. *
163e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
163f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
16400 61 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75  akeRecord, pGrou
16410 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  pBy->nExpr, 0);.
16420 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c        lbl1 = sql
16430 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16440 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
16450 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16460 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20  OP_AggFocus, 0, 
16470 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lbl1);.    }.   
16480 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
16490 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
164a0 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
164b0 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
164c0 20 69 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67   if( pAgg->isAgg
164d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
164e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
164f0 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d  de(pParse, pAgg-
16500 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >pExpr);.      s
16510 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16520 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c  v, OP_AggSet, 0,
16530 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   i);.    }.    p
16540 50 61 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 3d  Parse->fillAgg =
16550 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 62 6c 31   0;.    if( lbl1
16560 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
16570 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16580 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20  bel(v, lbl1);.  
16590 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
165a0 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41   pAgg=pParse->aA
165b0 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  gg; i<pParse->nA
165c0 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29  gg; i++, pAgg++)
165d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
165e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
165f0 72 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  r;.      FuncDef
16600 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 66   *pDef;.      if
16610 28 20 21 70 41 67 67 2d 3e 69 73 41 67 67 20 29  ( !pAgg->isAgg )
16620 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16630 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70   assert( pAgg->p
16640 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  Func!=0 );.     
16650 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70   assert( pAgg->p
16660 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29  Func->xStep!=0 )
16670 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 70  ;.      pDef = p
16680 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Agg->pFunc;.    
16690 20 20 70 45 20 3d 20 70 41 67 67 2d 3e 70 45 78    pE = pAgg->pEx
166a0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
166b0 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pE!=0 );.     
166c0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d   assert( pE->op=
166d0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
166e0 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20   );.      nExpr 
166f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16700 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
16710 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
16720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16730 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
16740 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  er, i, 0);.     
16750 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
16760 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
16770 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
16780 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
16790 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
167a0 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20 26 26 20  (j=0; !pColl && 
167b0 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  j<nExpr; j++){. 
167c0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
167d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
167e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  Seq(pParse, pE->
167f0 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  pList->a[j].pExp
16800 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
16810 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
16820 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
16830 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
16840 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16850 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
16860 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63  ollSeq, 0, 0, (c
16870 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f  har *)pColl, P3_
16880 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
16890 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
168a0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  dbeOp3(v, OP_Agg
168b0 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c 20  Func, 0, nExpr, 
168c0 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
168d0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 7d 0a  FUNCDEF);.    }.
168e0 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68    }..  /* End th
168f0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
16900 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  loop..  */.  sql
16910 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
16920 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nfo);..  /* If w
16930 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67  e are processing
16940 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65 20   aggregates, we 
16950 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20 61  need to set up a
16960 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a   second loop.  *
16970 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  * over all of th
16980 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c 75  e aggregate valu
16990 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74  es and process t
169a0 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hem..  */.  if( 
169b0 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74  isAgg ){.    int
169c0 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65   endagg = sqlite
169d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
169e0 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  );.    int start
169f0 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67  agg;.    startag
16a00 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  g = sqlite3VdbeA
16a10 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65  ddOp(v, OP_AggNe
16a20 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a  xt, 0, endagg);.
16a30 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
16a40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16a50 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
16a60 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61  se, pHaving, sta
16a70 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  rtagg, 1);.    }
16a80 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
16a90 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
16aa0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
16ab0 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
16ac0 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67   iParm, startagg
16af0 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29  , endagg, aff) )
16b00 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
16b10 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
16b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16b30 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
16b40 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20  0, startagg);.  
16b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16b60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
16b70 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  agg);.    sqlite
16b80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16b90 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  _Noop, 0, 0);.  
16ba0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
16bb0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
16bc0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
16bd0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
16be0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
16bf0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
16c00 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
16c10 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
16c20 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
16c30 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
16c40 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
16c50 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
16c60 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a   eDest, iParm);.
16c70 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16c80 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16c90 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77  Y.  /* If this w
16ca0 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 77  as a subquery, w
16cb0 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65  e have now conve
16cc0 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65 72  rted the subquer
16cd0 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65  y into a.  ** te
16ce0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
16cf0 53 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73 75  So delete the su
16d00 62 71 75 65 72 79 20 73 74 72 75 63 74 75 72 65  bquery structure
16d10 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
16d20 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  .  ** to prevent
16d30 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66   this subquery f
16d40 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61  rom being evalua
16d50 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f  ted again and to
16d60 20 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a 20   force the.  ** 
16d70 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 74  the use of the t
16d80 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a  emporary table..
16d90 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
16da0 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
16db0 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
16dc0 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20  >nSrc>parentTab 
16dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16de0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
16df0 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
16e00 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c  ct==p );.    sql
16e10 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
16e20 28 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74  (p);.    pParent
16e30 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
16e40 54 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30  Tab].pSelect = 0
16e50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
16e60 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
16e70 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
16e80 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
16e90 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
16ea0 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
16eb0 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
16ec0 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
16ed0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
16ee0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
16ef0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
16f00 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
16f10 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
16f20 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
16f30 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
16f40 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 73 74 6f  ect_end:.  resto
16f50 72 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28  reAggregateInfo(
16f60 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
16f70 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  o);.  return rc;
16f80 0a 7d 0a                                         .}.