/ Hex Artifact Content
Login

Artifact cf566f995358f728288f0be481f12d20305117c0:


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 37  select.c,v 1.257
0200: 20 32 30 30 35 2f 30 38 2f 33 31 20 31 38 3a 32   2005/08/31 18:2
0210: 30 3a 30 30 20 64 72 68 20 45 78 70 20 24 0a 2a  0:00 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 2f  rBy ){.        /
3d10: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
3d20: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
3d30: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
3d40: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
3d50: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
3d60: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
3d70: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
3d80: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
3d90: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
3da0: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
3db0: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
3dc0: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
3dd0: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
3de0: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
3df0: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
3e00: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
3e10: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3e20: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3e30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3e40: 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20         char aff 
3e50: 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78  = (iParm>>16)&0x
3e60: 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20  FF;.        aff 
3e70: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
3e80: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
3e90: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
3ea0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3eb0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
3ec0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
3ed0: 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20 20 20 20  , &aff, 1);.    
3ee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3ef0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
3f00: 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30  sert, (iParm&0x0
3f10: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
3f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
3f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
3f40: 76 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65  v, addr2, sqlite
3f50: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3f60: 28 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  (v));.      brea
3f70: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
3f80: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
3f90: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
3fa0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
3fb0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
3fc0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
3fd0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
3fe0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
3ff0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
4000: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
4010: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
4020: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4030: 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20 20 63  RT_Exists:.    c
4040: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4050: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4060: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4070: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4080: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4090: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
40a0: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
40b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
40c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
40d0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
40e0: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
40f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4100: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4110: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a  to, 0, iBreak);.
4120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4130: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4140: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
4150: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4160: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
4170: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
4180: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
4190: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
41a0: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
41b0: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
41c0: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
41d0: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
41e0: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
41f0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
4200: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
4210: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
4220: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4230: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20  T_Subroutine:.  
4240: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4250: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
4260: 54 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20  T_Sorter: {.    
4270: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
4280: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4290: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
42a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
42b0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
42c0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
42d0: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
42e0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
42f0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
4300: 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a  T_Subroutine ){.
4310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4320: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4330: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
4340: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
4360: 65 73 74 21 3d 53 52 54 5f 53 6f 72 74 65 72 20  est!=SRT_Sorter 
4370: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4380: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4390: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
43a0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
43b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
43c0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
43d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
43e0: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
43f0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4400: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4410: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4420: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4430: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4440: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4450: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
4460: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
4470: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
4480: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
4490: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
44a0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
44b0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
44c0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
44d0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
44e0: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
44f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4500: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4510: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4520: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4530: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4540: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4550: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4560: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4570: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4580: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
4590: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
45a0: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
45b0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
45c0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
45d0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
45e0: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
45f0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
4600: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
4610: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
4620: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
4630: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
4640: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
4650: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
4660: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
4670: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
4680: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
4690: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
46a0: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
46b0: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
46c0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
46d0: 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P3 field of an
46e0: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
46f0: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
4700: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
4710: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
4720: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
4730: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
4740: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
4750: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
4760: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
4770: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4780: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4790: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
47a0: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
47b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
47c0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
47d0: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
47e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
47f0: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d   pInfo = sqliteM
4800: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
4810: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
4820: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
4830: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
4840: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
4850: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 63 68  aSortOrder = (ch
4860: 61 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  ar*)&pInfo->aCol
4870: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
4880: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45  nfo->nField = nE
4890: 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  xpr;.    pInfo->
48a0: 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20  enc = db->enc;. 
48b0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
48c0: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
48d0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
48e0: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
48f0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
4900: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
4910: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
4920: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
4930: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
4940: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
4950: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
4960: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
4970: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
4980: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
4990: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
49a0: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
49b0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
49c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
49d0: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
49e0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
49f0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
4a00: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
4a10: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
4a20: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
4a30: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
4a40: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
4a50: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
4a60: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
4a70: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
4a80: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
4a90: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
4aa0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
4ab0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
4ac0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
4ad0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
4ae0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4af0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
4b00: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
4b10: 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  rse,   /* The pa
4b20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
4b30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4b40: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
4b50: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
4b60: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
4b70: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
4b80: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
4b90: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
4ba0: 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  mn,     /* Numbe
4bb0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
4bc0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44  data */.  int eD
4bd0: 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  est,       /* Wr
4be0: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
4bf0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
4c00: 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20   int iParm      
4c10: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61    /* Optional pa
4c20: 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74  rameter associat
4c30: 65 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f  ed with eDest */
4c40: 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d  .){.  int end1 =
4c50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4c60: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
4c70: 65 6e 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  end2 = sqlite3Vd
4c80: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4c90: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65    int addr;.  Ke
4ca0: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 0a 20  yInfo *pInfo;.. 
4cb0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
4cc0: 53 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b  Sorter ) return;
4cd0: 0a 20 20 70 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  .  pInfo = keyIn
4ce0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
4cf0: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 72 64 65 72  Parse, p->pOrder
4d00: 42 79 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  By);.  if( pInfo
4d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4d20: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
4d30: 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c  , OP_Sort, 0, 0,
4d40: 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20 50   (char*)pInfo, P
4d50: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
4d60: 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  F);.  addr = sql
4d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4d80: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4d90: 20 65 6e 64 31 29 3b 0a 20 20 63 6f 64 65 4c 69   end1);.  codeLi
4da0: 6d 69 74 65 72 28 76 2c 20 70 2c 20 61 64 64 72  miter(v, p, addr
4db0: 2c 20 65 6e 64 32 2c 20 31 29 3b 0a 20 20 73 77  , end2, 1);.  sw
4dc0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4dd0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4de0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4df0: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
4e00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e10: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
4e20: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
4e30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4e40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4e50: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4e60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4e70: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
4e80: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
4e90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
4ea0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4eb0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
4ec0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
4ed0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4ee0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f00: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
4f10: 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  1, sqlite3VdbeCu
4f20: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
4f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4f40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4f50: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
4f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f70: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4f80: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
4f90: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
4fb0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4fc0: 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20  ord, 1, 0, "n", 
4fd0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
4fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ff0: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
5000: 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  rt, (iParm&0x000
5010: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
5020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5030: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
5040: 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ts:.    case SRT
5050: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
5060: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5070: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5080: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5090: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
50a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
50b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
50c0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31  OP_Goto, 0, end1
50d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
50e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
50f0: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
5100: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
5110: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
5120: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5140: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5150: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
5160: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
5170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5180: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
5190: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
51a0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
51b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
51c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
51d0: 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69  _Column, -1-i, i
51e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
51f0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5200: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
5210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5220: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
5230: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
5240: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5250: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5260: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
5270: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
5280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
5290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
52a0: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
52b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
52c0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
52d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
52e0: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
52f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5300: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5310: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
5320: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
5330: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
5340: 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20  bel(v, end2);.  
5350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5360: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
5370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5380: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
5390: 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  end1);.  sqlite3
53a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
53b0: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
53c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
53d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
53e0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
53f0: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
5400: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
5410: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5420: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
5430: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
5440: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
5450: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
5460: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
5470: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
5480: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
5490: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
54a0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
54b0: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
54c0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
54d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
54e0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
54f0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
5500: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
5510: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
5520: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
5530: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
5540: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
5550: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
5560: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
5570: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5580: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
5590: 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  e(NameContext *p
55a0: 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
55b0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
55c0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
55d0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
55e0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
55f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
5600: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
5610: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
5620: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
5630: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
5640: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
5650: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
5660: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
5670: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
5680: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
5690: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
56a0: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
56b0: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
56c0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
56d0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
56e0: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
56f0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
5700: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
5710: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
5720: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
5730: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
5740: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
5750: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
5760: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
5770: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
5780: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
5790: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
57a0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
57b0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
57c0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
57d0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
57e0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
57f0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5800: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
5810: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
5820: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
5830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5840: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
5850: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
5860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5870: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
5880: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
5890: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
58a0: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
58b0: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
58c0: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
58d0: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
58e0: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
58f0: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
5900: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
5910: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
5920: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
5930: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
5940: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
5950: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
5960: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
5970: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
5980: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
5990: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
59a0: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
59b0: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
59c0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
59d0: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
59e0: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
59f0: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
5a00: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
5a10: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
5a20: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
5a30: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
5a40: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
5a50: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
5a60: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
5a70: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
5a80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5a90: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
5aa0: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
5ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ac0: 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a  assert( pTab );.
5ad0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
5ae0: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
5af0: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
5b00: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
5b10: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
5b20: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
5b30: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
5b40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
5b50: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
5b60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5b70: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
5b80: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
5b90: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
5ba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5bb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5bc0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
5bd0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
5be0: 20 7b 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e   {.      NameCon
5bf0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
5c00: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
5c10: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
5c20: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
5c30: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
5c40: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
5c50: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
5c60: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
5c70: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53  umnType(&sNC, pS
5c80: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
5c90: 45 78 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72  Expr); .      br
5ca0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5cb0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  f.    default:. 
5cc0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a       zType = 0;.
5cd0: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
5ce0: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
5cf0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
5d00: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
5d10: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
5d20: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
5d30: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
5d40: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
5d50: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5d60: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
5d70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5d80: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
5d90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
5da0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
5db0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
5dc0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
5dd0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
5de0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5df0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
5e00: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
5e10: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5e20: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
5e30: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
5e40: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
5e50: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f  = pTabList;.  fo
5e60: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
5e70: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5e80: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
5e90: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5ea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5eb0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
5ec0: 70 65 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20  pe(&sNC, p);.   
5ed0: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
5ee0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a  continue;.    /*
5ef0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
5f00: 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70  ake it's own cop
5f10: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
5f20: 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68  type, in case th
5f30: 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61  e .    ** schema
5f40: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
5f50: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
5f60: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
5f70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5f80: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
5f90: 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e  me(v, i+pEList->
5fa0: 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74  nExpr, zType, st
5fb0: 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20  rlen(zType));.  
5fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
5fd0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
5fe0: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
5ff0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
6000: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
6010: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
6020: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
6030: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
6040: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
6050: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
6060: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
6070: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
6080: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
6090: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
60a0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
60b0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
60c0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
60d0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
60e0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
60f0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
6100: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
6110: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
6120: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
6130: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6140: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
6150: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6160: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
6170: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
6180: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
6190: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
61a0: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
61b0: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
61c0: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
61d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
61e0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
61f0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
6200: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
6210: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
6220: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
6230: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
6240: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
6250: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
6260: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
6270: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
6280: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6290: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
62a0: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
62b0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
62c0: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
62d0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
62e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
62f0: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
6300: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
6310: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
6320: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
6330: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
6340: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6350: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
6360: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6370: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6380: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
6390: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
63a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
63b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
63c0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
63d0: 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   i, zName, strle
63e0: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
63f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
6400: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
6410: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
6420: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
6430: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
6440: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
6450: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
6460: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
6470: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
6480: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
6490: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
64a0: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
64b0: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
64c0: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
64d0: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
64e0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
64f0: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
6500: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
6510: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
6520: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
6530: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
6540: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
6550: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
6560: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
6570: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
6580: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
6590: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
65a0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
65b0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
65c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
65d0: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
65e0: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
65f0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
6600: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
6610: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
6620: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e  olName(v, i, p->
6630: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
6640: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
6650: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
6660: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
6670: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
6680: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
6690: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
66a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
66b0: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
66c0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
66d0: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
66e0: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
66f0: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
6700: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
6710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6720: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
6730: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
6740: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
6750: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6760: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
6770: 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P3_DYNAMIC);.
6780: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
67a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
67b0: 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43   zCol, strlen(zC
67c0: 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol));.      }.  
67d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
67e0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
67f0: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
6800: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
6810: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
6820: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
6830: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
6840: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
6850: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f  ace(v, addr); */
6860: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6870: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
6880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6890: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
68a0: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
68b0: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
68c0: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
68d0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
68e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
68f0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
6900: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
6910: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
6920: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
6930: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
6940: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
6950: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
6960: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
6970: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
6980: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
6990: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
69a0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
69b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
69c0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
69d0: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
69e0: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
69f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
6a00: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
6a10: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
6a20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
6a30: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
6a40: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
6a50: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
6a60: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
6a70: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
6a80: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
6a90: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
6aa0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
6ab0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
6ac0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
6ad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
6ae0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
6af0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
6b00: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
6b10: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
6b20: 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53  ctStmt(Parse*, S
6b30: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
6b40: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
6b50: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
6b60: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
6b70: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
6b80: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
6b90: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
6ba0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
6bb0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
6bc0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
6bd0: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
6be0: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
6bf0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
6c00: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
6c10: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
6c20: 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d  *pEList;.  Colum
6c30: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a  n *aCol, *pCol;.
6c40: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
6c50: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
6c60: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
6c70: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6c80: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
6c90: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
6ca0: 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20  Select, 0) ){.  
6cb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6cc0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d    pTab = sqliteM
6cd0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
6ce0: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
6cf0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
6d00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
6d10: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
6d20: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61  Tab->zName = zTa
6d30: 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74  bName ? sqliteSt
6d40: 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a  rDup(zTabName) :
6d50: 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
6d60: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
6d70: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70    pTab->nCol = p
6d80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
6d90: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
6da0: 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  ol>0 );.  pTab->
6db0: 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71  aCol = aCol = sq
6dc0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6dd0: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
6de0: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
6df0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
6e00: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
6e10: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
6e20: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a  {.    Expr *p, *
6e30: 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  pR;.    char *zT
6e40: 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ype;.    char *z
6e50: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
6e60: 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20 20 20 69  zBasename;.    i
6e70: 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65  nt cnt;.    Name
6e80: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
6e90: 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20   .    /* Get an 
6ea0: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
6eb0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
6ec0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
6ed0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6ee0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
6ef0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
6f00: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
6f10: 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  z==0 || p->pRigh
6f20: 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30  t->token.z[0]!=0
6f30: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   );.    if( (zNa
6f40: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
6f50: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
6f60: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
6f70: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
6f80: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
6f90: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
6fa0: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
6fb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
6fc0: 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61 6d 65  liteStrDup(zName
6fd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6fe0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
7000: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
7010: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
7020: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
7030: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
7040: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  For columns of t
7050: 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20  he from A.B use 
7060: 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  B as the name */
7070: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
7080: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
7090: 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b  T", &pR->token);
70a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
70b0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
70c0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
70d0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
70e0: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
70f0: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
7100: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
7110: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
7120: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
7130: 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b  "%T", &p->span);
7140: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7150: 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65    /* If all else
7160: 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20   fails, make up 
7170: 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  a name */.      
7180: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
7190: 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64  Printf("column%d
71a0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ", i+1);.    }. 
71b0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
71c0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  e(zName);.    if
71d0: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
71e0: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  _failed ){.     
71f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
7200: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
7210: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
7220: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74  pTab);.      ret
7230: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
7240: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
7250: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
7260: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
7270: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
7280: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
7290: 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f  end a integer to
72a0: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
72b0: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
72c0: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
72d0: 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d  zBasename = zNam
72e0: 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  e;.    for(j=cnt
72f0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
7300: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7310: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
7320: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
7330: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
7340: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
7350: 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61 73  tf("%s:%d", zBas
7360: 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  ename, ++cnt);. 
7370: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
7380: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
7390: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
73a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
73b0: 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e  f( zBasename!=zN
73c0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
73d0: 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e 61 6d  iteFree(zBasenam
73e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  e);.    }.    pC
73f0: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
7400: 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  e;..    /* Get t
7410: 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70  he typename, typ
7420: 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20  e affinity, and 
7430: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7440: 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
7450: 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  * column..    */
7460: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
7470: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
7480: 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  );.    sNC.pSrcL
7490: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
74a0: 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  Src;.    zType =
74b0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f   sqliteStrDup(co
74c0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
74d0: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  ));.    pCol->zT
74e0: 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20  ype = zType;.   
74f0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7500: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
7510: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43  inity(p);.    pC
7520: 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->pColl = sqli
7530: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
7540: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
7550: 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20  f( !pCol->pColl 
7560: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  ){.      pCol->p
7570: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
7580: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
7590: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
75a0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
75b0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
75c0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45  .** Prepare a SE
75d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
75e0: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79  or processing by
75f0: 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   doing the follo
7600: 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a  wing.** things:.
7610: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
7620: 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
7630: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
7640: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
7650: 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
7660: 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
7670: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
7680: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
7690: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
76a0: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
76b0: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
76c0: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
76d0: 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
76e0: 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
76f0: 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
7700: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
7710: 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
7720: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
7730: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
7740: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
7750: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
7760: 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
7770: 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
7780: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
7790: 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
77a0: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
77b0: 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
77c0: 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
77d0: 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
77e0: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
77f0: 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
7800: 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
7810: 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
7820: 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
7830: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
7840: 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
7850: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
7860: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
7870: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
7880: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
7890: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
78a0: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
78b0: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
78c0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
78d0: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
78e0: 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
78f0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
7900: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7910: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
7920: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
7930: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
7940: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
7950: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
7960: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
7970: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
7980: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
7990: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
79a0: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
79b0: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
79c0: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
79d0: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
79e0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
79f0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
7a00: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
7a10: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
7a20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
7a30: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
7a40: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
7a50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
7a60: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
7a70: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
7a80: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ct *p){.  int i,
7a90: 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63   j, k, rc;.  Src
7aa0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
7ab0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7ac0: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
7ad0: 62 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  b;.  struct SrcL
7ae0: 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
7af0: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
7b00: 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71  p->pSrc==0 || sq
7b10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
7b20: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
7b30: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
7b40: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
7b50: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
7b60: 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
7b70: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
7b80: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
7b90: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
7ba0: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
7bb0: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
7bc0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
7bd0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
7be0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
7bf0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
7c00: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
7c10: 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
7c20: 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
7c30: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
7c40: 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
7c50: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
7c60: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
7c70: 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
7c80: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
7c90: 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
7ca0: 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
7cb0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
7cc0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
7cd0: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
7ce0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
7cf0: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
7d00: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
7d10: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
7d20: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
7d30: 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
7d40: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
7d50: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7d60: 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
7d70: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
7d80: 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
7d90: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
7da0: 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
7db0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
7dc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
7dd0: 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
7de0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7df0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7e00: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
7e10: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
7e20: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
7e30: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
7e40: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
7e50: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
7e60: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
7e70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
7e80: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
7e90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
7ea0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75  rintf("sqlite_su
7eb0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
7ec0: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
7ed0: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
7ee0: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
7ef0: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
7f00: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
7f10: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
7f20: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
7f30: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
7f40: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
7f50: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
7f60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7f80: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7f90: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
7fa0: 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69  Transient flag i
7fb0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
7fc0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
7fd0: 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  e has been.     
7fe0: 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
7ff0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61  allocated and ma
8000: 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e  y be freed at an
8010: 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65  y time.  In othe
8020: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a  r words,.      *
8030: 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f  * pTab is not po
8040: 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73  inting to a pers
8050: 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72  istent table str
8060: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
8070: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  nes.      ** par
8080: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  t of the schema.
8090: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
80a0: 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b  isTransient = 1;
80b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
80c0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
80d0: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
80e0: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
80f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
8100: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8110: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
8120: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
8130: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
8140: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
8150: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70  teTable(pParse,p
8160: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
8170: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
8180: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
8190: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
81a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
81b0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
81c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
81d0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 20  _OMIT_VIEW.     
81e0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
81f0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ct ){.        /*
8200: 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
8210: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
8220: 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
8230: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
8240: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
8250: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
8260: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
8270: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
8280: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
8290: 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
82a0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
82b0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
82c0: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
82d0: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
82e0: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
82f0: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
8300: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
8310: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
8320: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
8330: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
8340: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
8350: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
8360: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
8370: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
8380: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
8390: 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
83a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
83b0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
83c0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54  ite3SelectDup(pT
83d0: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
83e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
83f0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
8400: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
8410: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
8420: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
8430: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
8440: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
8450: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
8460: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
8470: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
8480: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
8490: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
84a0: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
84b0: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
84c0: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
84d0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
84e0: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
84f0: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
8500: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
8510: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
8520: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
8530: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
8540: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
8550: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
8560: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
8570: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
8580: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
8590: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
85a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
85b0: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
85c0: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
85d0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
85e0: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
85f0: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
8600: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
8610: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
8620: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
8630: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
8640: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
8650: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
8660: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
8670: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
8680: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
8690: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
86a0: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
86b0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
86c0: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
86d0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
86e0: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
86f0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
8700: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
8710: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
8720: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
8730: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
8740: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
8750: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
8760: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
8770: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
8780: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
8790: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
87a0: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
87b0: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
87c0: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
87d0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
87e0: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
87f0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
8800: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
8810: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
8820: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
8830: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
8840: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
8850: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
8860: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8870: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
8880: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
8890: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
88a0: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
88b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
88c0: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
88d0: 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
88e0: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
88f0: 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20  Names)!=0 &&.   
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
8920: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
8930: 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
8940: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
8950: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
8960: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
8970: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
8980: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
8990: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
89a0: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
89b0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
89c0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
89d0: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
89e0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
89f0: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
8a00: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
8a10: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
8a20: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8a30: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
8a40: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8a50: 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  d(pNew, a[k].pEx
8a60: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
8a70: 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
8a80: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
8a90: 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
8aa0: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
8ab0: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
8ac0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
8ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8ae0: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
8af0: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
8b00: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
8b10: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
8b20: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
8b30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
8b40: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
8b50: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
8b60: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
8b70: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
8b80: 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
8b90: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
8ba0: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
8bb0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
8bc0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
8bd0: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
8be0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
8bf0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
8c00: 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d  oken(&pE->pLeft-
8c10: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
8c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8c30: 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20    zTName = 0;.  
8c40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8c50: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
8c60: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
8c70: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
8c80: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
8c90: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
8ca0: 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
8cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
8cc0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
8cd0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
8ce0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
8cf0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
8d00: 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20  e[0]==0 ){ .    
8d10: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
8d20: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8d30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8d40: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
8d50: 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30   && (zTabName==0
8d60: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
8d70: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
8d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
8d90: 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
8da0: 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a  TabName)!=0) ){.
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8dc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8dd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
8de0: 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
8df0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8e00: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
8e10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
8e20: 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66  pr *pExpr, *pLef
8e30: 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  t, *pRight;.    
8e40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8e50: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
8e60: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  [j].zName;..    
8e70: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
8e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8e90: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8ea0: 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
8eb0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8ed0: 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  f( (pLeft->joint
8ee0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
8ef0: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
8f20: 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
8f30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8f40: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
8f50: 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
8f60: 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
8f70: 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
8f90: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
8fa0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
8fb0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8fe0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
8ff0: 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e  dex(pLeft->pUsin
9000: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
9030: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
9040: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
9050: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
9060: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
9070: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
9080: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
9090: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
90a0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
90d0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
90e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
90f0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
9100: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9110: 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
9120: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  k;.            s
9130: 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d  etToken(&pRight-
9140: 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a  >token, zName);.
9150: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9160: 7a 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e  zTabName && (lon
9170: 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
9180: 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20  st->nSrc>1) ){. 
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
91a0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
91b0: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
91c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
91d0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
91e0: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
91f0: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
9210: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
9220: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
9230: 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74   setToken(&pLeft
9240: 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d  ->token, zTabNam
9250: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
9260: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70    setToken(&pExp
9270: 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33  r->span, sqlite3
9280: 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c  MPrintf("%s.%s",
9290: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
92a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
92b0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
92c0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
92d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
92e0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
92f0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
9300: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
9310: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
9320: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
9330: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
9340: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9350: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9370: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
9380: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
9390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
93a0: 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
93b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
93c0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
93d0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
93e0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
93f0: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
9400: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
9420: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
9430: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
9440: 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e  pExpr, &pRight->
9450: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
9460: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9470: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9480: 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
9490: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
94a0: 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
94b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
94c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
94d0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
94e0: 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
94f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9510: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9520: 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
9530: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
9540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9550: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
9560: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
9570: 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b  iteFree(zTName);
9580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9590: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
95a0: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
95b0: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
95c0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
95d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
95e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
95f0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
9600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9610: 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e  ne associates en
9620: 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45  tries in an ORDE
9630: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
9640: 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c  list with.** col
9650: 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74  umns in a result
9660: 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45  .  For each ORDE
9670: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c  R BY expression,
9680: 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a   the opcode of.*
9690: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
96a0: 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  node is changed 
96b0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
96c0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c   the iColumn val
96d0: 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  ue of.** the top
96e0: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
96f0: 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f  illed in with co
9700: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20  lumn number and 
9710: 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61  the iTable.** va
9720: 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  lue of the top-l
9730: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
9740: 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20  led with iTable 
9750: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
9760: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
9770: 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73  ior SELECT claus
9780: 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f  es, they are pro
9790: 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41  cessed first.  A
97a0: 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20   match.** in an 
97b0: 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74  earlier SELECT t
97c0: 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20  akes precedence 
97d0: 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c  over a later SEL
97e0: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65  ECT..**.** Any e
97f0: 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e  ntry that does n
9800: 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67  ot match is flag
9810: 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e  ged as an error.
9820: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
9830: 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  of errors is ret
9840: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
9850: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
9860: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
9870: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9880: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
9890: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
98a0: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
98b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
98c0: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
98d0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
98e0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
98f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
9900: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
9910: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
9920: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
9930: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
9940: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
9950: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
9960: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
9970: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
9980: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
9990: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
99a0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
99b0: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
99c0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
99d0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
99e0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
99f0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
9a00: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
9a10: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
9a20: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
9a30: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
9a40: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
9a50: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
9a60: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
9a70: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65   }.  }.  if( pre
9a80: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
9a90: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
9aa0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9ab0: 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
9ac0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
9ad0: 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  f( matchOrderbyT
9ae0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
9af0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c  pSelect->pPrior,
9b00: 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c   pOrderBy, iTabl
9b10: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
9b20: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
9b30: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
9b40: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
9b50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
9b60: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
9b70: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
9b80: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
9b90: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  .pExpr;.    int 
9ba0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  iCol = -1;.    i
9bb0: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
9bc0: 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ].done ) continu
9bd0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
9be0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
9bf0: 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
9c00: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
9c10: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
9c20: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
9c30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9c40: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
9c50: 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73     "ORDER BY pos
9c60: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
9c70: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
9c80: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
9c90: 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
9ca0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
9cb0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
9cc0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9cd0: 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70     if( !mustComp
9ce0: 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lete ) continue;
9cf0: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
9d00: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
9d10: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
9d20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
9d30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
9d40: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
9d50: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
9d60: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
9d70: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
9d80: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
9d90: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
9da0: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
9db0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
9dc0: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71       zLabel = sq
9dd0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9de0: 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  en(&pE->token);.
9df0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9e00: 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20  zLabel!=0 );.   
9e10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9e20: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a  StrICmp(zName, z
9e30: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20  Label)==0 ){ .  
9e40: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
9e50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9e60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
9e70: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
9e80: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
9e90: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
9ea0: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
9eb0: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
9ec0: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
9ed0: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
9ee0: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
9ef0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
9f00: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
9f10: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
9f20: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
9f30: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
9f40: 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41  le;.      pE->iA
9f50: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  gg = -1;.      p
9f60: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
9f70: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
9f80: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
9f90: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
9fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9fb0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
9fc0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
9fd0: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
9fe0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
9ff0: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
a000: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
a010: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
a020: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
a030: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
a040: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
a050: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
a060: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
a070: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
a080: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
a090: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
a0a0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
a0b0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
a0c0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
a0d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
a0e0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
a0f0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
a100: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
a110: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
a120: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
a130: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a140: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
a150: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
a160: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
a170: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
a180: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
a190: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a   return v;.}../*
a1a0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a1b0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
a1c0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
a1d0: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
a1e0: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
a1f0: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
a200: 73 73 69 6f 6e 73 2e 20 20 6e 4c 69 6d 69 74 20  ssions.  nLimit 
a210: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
a220: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
a230: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
a240: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
a250: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
a260: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
a270: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
a280: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
a290: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
a2a0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
a2b0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
a2c0: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
a2d0: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
a2e0: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
a2f0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
a300: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
a310: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
a320: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
a330: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
a340: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
a350: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
a360: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
a370: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a380: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
a390: 65 20 76 61 6c 75 65 73 20 69 66 20 69 4c 69 6d  e values if iLim
a3a0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
a3b0: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
a3c0: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
a3d0: 65 66 69 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74  efined by nLimit
a3e0: 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e 20 20 69   and nOffset.  i
a3f0: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
a400: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
a410: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
a420: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
a430: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
a440: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
a450: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
a460: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
a470: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
a480: 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72   if nLimit>=0 or
a490: 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f 20 74 68   nOffset>0 do th
a4a0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
a4b0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
a4c0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
a4d0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
a4e0: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
a4f0: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
a500: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
a510: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
a520: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
a530: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
a540: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
a550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a560: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
a570: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
a580: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
a590: 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  {.  /* .  ** "LI
a5a0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
a5b0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
a5c0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
a5d0: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
a5e0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
a5f0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
a600: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
a610: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
a620: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
a630: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
a640: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
a650: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
a660: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
a670: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
a680: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
a690: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
a6a0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
a6b0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
a6c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
a6d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a6e0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  rse, p->pLimit);
a6f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a700: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
a710: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
a720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a730: 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
a740: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
a750: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a760: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
a770: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  Mem, 1);.    Vdb
a780: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
a790: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
a7a0: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
a7b0: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
a7c0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
a7d0: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
a7e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a7f0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
a800: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
a810: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
a820: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a830: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a840: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
a850: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
a860: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a870: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
a880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a890: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
a8a0: 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
a8b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a8c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
a8d0: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
a8e0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a8f0: 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74   "# OFFSET count
a900: 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  er"));.    p->iO
a910: 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
a920: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
a930: 61 74 65 20 56 44 42 45 20 69 6e 73 74 72 75 63  ate VDBE instruc
a940: 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  tions that will 
a950: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
a960: 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20 77   table that.** w
a970: 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
a980: 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 73  an index or to s
a990: 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73 75 6c  tore keyed resul
a9a0: 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ts for a compoun
a9b0: 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20 49 6e  d.** select.  In
a9c0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f 70   other words, op
a9d0: 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  en a transient t
a9e0: 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64 73 20  able that needs 
a9f0: 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  a.** KeyInfo str
aa00: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e 75 6d  ucture.  The num
aa10: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
aa20: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 69 73  n the KeyInfo is
aa30: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
aa40: 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  y the result set
aa50: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
aa60: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
aa70: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
aa80: 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  .**.** Specifica
aa90: 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lly, this routin
aaa0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  e is called to o
aab0: 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74 61 62  pen an index tab
aac0: 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54 49 4e  le for.** DISTIN
aad0: 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54 45 52  CT, UNION, INTER
aae0: 53 45 43 54 20 61 6e 64 20 45 58 43 45 50 54 20  SECT and EXCEPT 
aaf0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
ab00: 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a 20 55  s (but not .** U
ab10: 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  NION ALL)..**.**
ab20: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
ab30: 6e 65 64 20 69 73 20 74 68 65 20 61 64 64 72 65  ned is the addre
ab40: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 70 65  ss of the OP_Ope
ab50: 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63  nVirtual instruc
ab60: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
ab70: 69 6e 74 20 6f 70 65 6e 56 69 72 74 75 61 6c 49  int openVirtualI
ab80: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
ab90: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
aba0: 6e 74 20 69 54 61 62 29 7b 0a 20 20 4b 65 79 49  nt iTab){.  KeyI
abb0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
abc0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
abd0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
abe0: 61 64 64 72 3b 0a 0a 20 20 69 66 28 20 70 72 65  addr;..  if( pre
abf0: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
ac00: 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
ac10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4b  turn 0;.  }.  pK
ac20: 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
ac30: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
ac40: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  rse, p->pEList);
ac50: 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 3d  .  if( pKeyInfo=
ac60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ac70: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ac80: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
ac90: 6e 56 69 72 74 75 61 6c 2c 20 69 54 61 62 2c 20  nVirtual, iTab, 
aca0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
acc0: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
acd0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
ace0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
acf0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ad00: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
ad10: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 41 64  _SELECT./*.** Ad
ad20: 64 20 74 68 65 20 61 64 64 72 65 73 73 20 22 61  d the address "a
ad30: 64 64 72 22 20 74 6f 20 74 68 65 20 73 65 74 20  ddr" to the set 
ad40: 6f 66 20 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75  of all OpenVirtu
ad50: 61 6c 20 6f 70 63 6f 64 65 20 61 64 64 72 65 73  al opcode addres
ad60: 73 65 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  ses.** that are 
ad70: 62 65 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 65  being accumulate
ad80: 64 20 69 6e 20 70 2d 3e 70 70 4f 70 65 6e 56 69  d in p->ppOpenVi
ad90: 72 74 75 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  rtual..*/.static
ada0: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
adb0: 4f 70 65 6e 56 69 72 74 75 61 6c 41 64 64 72 28  OpenVirtualAddr(
adc0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 61  Select *p, int a
add0: 64 64 72 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a  ddr){.  IdList *
ade0: 70 4c 69 73 74 20 3d 20 2a 70 2d 3e 70 70 4f 70  pList = *p->ppOp
adf0: 65 6e 56 69 72 74 75 61 6c 20 3d 20 73 71 6c 69  enVirtual = sqli
ae00: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
ae10: 2a 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61  *p->ppOpenVirtua
ae20: 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4c 69  l, 0);.  if( pLi
ae30: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  st==0 ){.    ret
ae40: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ae50: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
ae60: 5b 70 4c 69 73 74 2d 3e 6e 49 64 2d 31 5d 2e 69  [pList->nId-1].i
ae70: 64 78 20 3d 20 61 64 64 72 3b 0a 20 20 72 65 74  dx = addr;.  ret
ae80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ae90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
aea0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
aeb0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
aec0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
aed0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
aee0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
aef0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
af00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
af10: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
af20: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
af30: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
af40: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
af50: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
af60: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
af70: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
af80: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
af90: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
afa0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
afb0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
afc0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
afd0: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
afe0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
aff0: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
b000: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
b010: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
b020: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
b030: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
b040: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
b050: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
b060: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
b070: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
b080: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
b090: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
b0a0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
b0b0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
b0c0: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
b0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
b0e0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
b0f0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
b100: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
b110: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
b120: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
b130: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
b140: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
b150: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b160: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b170: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
b180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b190: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
b1a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b1b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
b1c0: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
b1d0: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
b1e0: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
b1f0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
b200: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
b210: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  ate queries..**.
b220: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
b230: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
b240: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
b250: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
b260: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
b270: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
b280: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
b290: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
b2a0: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
b2b0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
b2c0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
b2d0: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
b2e0: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
b2f0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
b300: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
b310: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
b320: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
b330: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
b340: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
b350: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
b360: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
b370: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
b380: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
b390: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
b3a0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
b3b0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
b3c0: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
b3d0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
b3e0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
b3f0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
b400: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
b410: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
b420: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
b430: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
b440: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
b450: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
b460: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
b470: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
b480: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
b490: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
b4a0: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
b4b0: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
b4c0: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
b4d0: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
b4e0: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
b4f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
b500: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
b510: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
b520: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
b530: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
b540: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
b550: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
b560: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
b570: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
b580: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
b590: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
b5a0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
b5b0: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
b5c0: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
b5d0: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
b5e0: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
b5f0: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
b600: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
b610: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
b620: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b630: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
b640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b650: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
b660: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
b670: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ed */.  int eDes
b680: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
b690: 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65   \___  Store que
b6a0: 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73 70  ry results as sp
b6b0: 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74  ecified */.  int
b6c0: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
b6d0: 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74     /* /     by t
b6e0: 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74  hese two paramet
b6f0: 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a  ers.         */.
b700: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
b710: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
b720: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
b730: 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
b740: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
b750: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b760: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
b770: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
b780: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
b790: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
b7a0: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
b7b0: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
b7c0: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
b7d0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
b7e0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b7f0: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
b800: 44 42 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  DBE */.  IdList 
b810: 2a 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 3d 20  *pOpenVirtual = 
b820: 30 3b 2f 2a 20 4f 50 5f 4f 70 65 6e 56 69 72 74  0;/* OP_OpenVirt
b830: 75 61 6c 20 6f 70 63 6f 64 65 73 20 74 68 61 74  ual opcodes that
b840: 20 6e 65 65 64 20 61 20 4b 65 79 49 6e 66 6f 20   need a KeyInfo 
b850: 2a 2f 0a 20 20 69 6e 74 20 61 41 64 64 72 5b 35  */.  int aAddr[5
b860: 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ];         /* Ad
b870: 64 72 65 73 73 65 73 20 6f 66 20 53 65 74 4e 75  dresses of SetNu
b880: 6d 43 6f 6c 75 6d 6e 73 20 6f 70 65 72 61 74 6f  mColumns operato
b890: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 64 64  rs */.  int nAdd
b8a0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  r = 0;        /*
b8b0: 20 4e 75 6d 62 65 72 20 75 73 65 64 20 2a 2f 0a   Number used */.
b8c0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
b8d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b8e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
b8f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b900: 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  /..  /* Make sur
b910: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
b920: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
b930: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
b940: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
b950: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
b960: 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
b970: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
b980: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
b990: 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
b9a0: 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  */.  if( p==0 ||
b9b0: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
b9c0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
b9d0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b9e0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50  ct_end;.  }.  pP
b9f0: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
ba00: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
ba10: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
ba20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ba30: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
ba40: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
ba50: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
ba60: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
ba70: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
ba80: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
ba90: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
baa0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
bab0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
bac0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
bad0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bae0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
baf0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
bb00: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
bb10: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
bb20: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
bb30: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bb40: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bb50: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
bb60: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
bb70: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
bb80: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
bb90: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
bba0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
bbb0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
bbc0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
bbd0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
bbe0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
bbf0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
bc00: 0a 20 20 2f 2a 20 49 66 20 2a 70 20 74 68 69 73  .  /* If *p this
bc10: 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
bc20: 73 74 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  st select statem
bc30: 65 6e 74 2c 20 74 68 65 6e 20 69 6e 69 74 69 61  ent, then initia
bc40: 6c 69 7a 65 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f  lize.  ** p->ppO
bc50: 70 65 6e 56 69 72 74 75 61 6c 20 74 6f 20 70 6f  penVirtual to po
bc60: 69 6e 74 20 74 6f 20 70 4f 70 65 6e 56 69 72 74  int to pOpenVirt
bc70: 75 61 6c 2e 20 20 49 66 20 2a 70 20 69 73 20 6e  ual.  If *p is n
bc80: 6f 74 20 74 68 65 20 72 69 67 68 74 20 6d 6f 73  ot the right mos
bc90: 74 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t.  ** statement
bca0: 20 74 68 65 6e 20 70 2d 3e 70 70 4f 70 65 6e 56   then p->ppOpenV
bcb0: 69 72 74 75 61 6c 20 77 69 6c 6c 20 68 61 76 65  irtual will have
bcc0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
bcd0: 69 74 69 61 6c 69 7a 65 64 0a 20 20 2a 2a 20 62  itialized.  ** b
bce0: 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  y a prior call t
bcf0: 6f 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  o this same proc
bd00: 65 64 75 72 65 2e 20 20 50 61 73 73 20 61 6c 6f  edure.  Pass alo
bd10: 6e 67 20 74 68 65 20 70 4f 70 65 6e 56 69 72 74  ng the pOpenVirt
bd20: 75 61 6c 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  ual.  ** pointer
bd30: 20 74 6f 20 70 50 72 69 6f 72 2c 20 74 68 65 20   to pPrior, the 
bd40: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
bd50: 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20 20 2a 2f  o our left..  */
bd60: 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f 70 65 6e  .  if( p->ppOpen
bd70: 56 69 72 74 75 61 6c 3d 3d 30 20 29 7b 0a 20 20  Virtual==0 ){.  
bd80: 20 20 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75    p->ppOpenVirtu
bd90: 61 6c 20 3d 20 26 70 4f 70 65 6e 56 69 72 74 75  al = &pOpenVirtu
bda0: 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  al;.  }.  pPrior
bdb0: 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 20  ->ppOpenVirtual 
bdc0: 3d 20 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75  = p->ppOpenVirtu
bdd0: 61 6c 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  al;..  /* Create
bde0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
bdf0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
be00: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
be10: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
be20: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
be30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
be40: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
be50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
be60: 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
be70: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
be80: 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3d 3d   assert( nAddr==
be90: 30 20 29 3b 0a 20 20 20 20 61 41 64 64 72 5b 6e  0 );.    aAddr[n
bea0: 41 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  Addr++] = sqlite
beb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bec0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
bed0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65  iParm, 0);.    e
bee0: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
bef0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
bf00: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
bf10: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
bf20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bf30: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
bf40: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
bf50: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
bf60: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
bf70: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
bf80: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
bf90: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
bfa0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
bfb0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
bfc0: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
bfd0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
bfe0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
bff0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
c000: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
c010: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  r, eDest, iParm,
c020: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
c030: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
c040: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
c050: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c060: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
c070: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
c080: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   0;.        p->i
c090: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
c0a0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
c0b0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
c0c0: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
c0d0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
c0e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
c0f0: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
c100: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c110: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c120: 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
c130: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
c140: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
c150: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
c160: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c170: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c180: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c1a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c1b0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49        /* For UNI
c1c0: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
c1d0: 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   BY fall through
c1e0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
c1f0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
c200: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
c210: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
c220: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
c230: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
c240: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
c250: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c260: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
c270: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  t */.      int o
c280: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  p = 0;      /* O
c290: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
c2a0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
c2b0: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
c2c0: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
c2d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
c2e0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
c2f0: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
c300: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
c310: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
c320: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
c330: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
c340: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
c350: 74 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  t */.      ExprL
c360: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
c370: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
c380: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
c390: 65 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a  e right SELECT *
c3a0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
c3b0: 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  ;..      priorOp
c3c0: 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
c3d0: 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
c3e0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
c3f0: 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72  if( eDest==prior
c400: 4f 70 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  Op && p->pOrderB
c410: 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d  y==0 && !p->pLim
c420: 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65  it && !p->pOffse
c430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
c440: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
c450: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
c460: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
c470: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
c480: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
c490: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c4a0: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72   unionTab = iPar
c4b0: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
c4c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
c4d0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
c4e0: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
c4f0: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
c500: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
c510: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
c520: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
c530: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
c540: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
c550: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b++;.        if(
c560: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20   p->pOrderBy .  
c570: 20 20 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72        && matchOr
c580: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
c590: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
c5a0: 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  erBy, unionTab, 
c5b0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
c5c0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
c5d0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c5e0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c5f0: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20   }.        addr 
c600: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c610: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
c620: 74 75 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  tual, unionTab, 
c630: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
c640: 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  p->op!=TK_ALL ){
c650: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c660: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 56  multiSelectOpenV
c670: 69 72 74 75 61 6c 41 64 64 72 28 70 2c 20 61 64  irtualAddr(p, ad
c680: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
c690: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c6a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c6b0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c6c0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  t_end;.         
c6d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 09 61 73   }.        }..as
c6e0: 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65  sert( nAddr<size
c6f0: 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66  of(aAddr)/sizeof
c700: 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20  (aAddr[0]) );.  
c710: 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64        aAddr[nAdd
c720: 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  r++] = sqlite3Vd
c730: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
c740: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75 6e 69  tNumColumns, uni
c750: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
c760: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
c770: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
c780: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c790: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c7a0: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
c7b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c7c0: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
c7d0: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
c7e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c7f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
c800: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
c810: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
c820: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
c830: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c840: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c850: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
c860: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
c870: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
c880: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
c890: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
c8a0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
c8b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
c8c0: 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78  PT:  op = SRT_Ex
c8d0: 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  cept;   break;. 
c8e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
c8f0: 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52  UNION:   op = SR
c900: 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61  T_Union;    brea
c910: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
c920: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20   TK_ALL:     op 
c930: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
c940: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c950: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
c960: 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   0;.      pOrder
c970: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
c980: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
c990: 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rBy = 0;.      p
c9a0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
c9b0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
c9c0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
c9d0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
c9e0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
c9f0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
ca00: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
ca10: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70  ct(pParse, p, op
ca20: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30  , unionTab, 0, 0
ca30: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
ca40: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
ca50: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
ca60: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
ca70: 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
ca80: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
ca90: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
caa0: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
cab0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
cac0: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
cad0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d     p->iLimit = -
cae0: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  1;.      p->iOff
caf0: 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  set = -1;.      
cb00: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cb10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
cb20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
cb30: 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ...      /* Conv
cb40: 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
cb50: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
cb60: 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
cb70: 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
cb80: 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
cb90: 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
cba0: 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20      */      .   
cbb0: 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72     if( eDest!=pr
cbc0: 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
cbd0: 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20  b!=iParm ){.    
cbe0: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
cbf0: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
cc00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cc10: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
cc20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
cc30: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
cc40: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
cc50: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
cc60: 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73  rse, 0, p->pELis
cc70: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
cc80: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
cc90: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cca0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
ccb0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
ccc0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ccd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cce0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ccf0: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
cd00: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
cd10: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
cd20: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
cd30: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74   p);.        iSt
cd40: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
cd50: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
cd60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
cd70: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
cd80: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
cd90: 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
cda0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
cdd0: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
cde0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
ce10: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
ce20: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ce30: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
ce40: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ce50: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ce60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ce70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
ce80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
ce90: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
cea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ceb0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
cec0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
ced0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cee0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
cef0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
cf00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf10: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
cf20: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
cf30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
cf40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
cf50: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
cf60: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
cf70: 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
cf80: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
cf90: 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
cfa0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
cfb0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
cfc0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f  t addr;..      /
cfd0: 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
cfe0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
cff0: 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
d000: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
d010: 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
d020: 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
d030: 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
d040: 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
d050: 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
d060: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
d070: 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
d080: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
d090: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d0a0: 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
d0b0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d0c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
d0d0: 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72  derBy && matchOr
d0e0: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50  derbyToColumn(pP
d0f0: 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64 65 72  arse,p,p->pOrder
d100: 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20  By,tab1,1) ){.  
d110: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
d120: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d130: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d140: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 64 64 72     }..      addr
d150: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d160: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
d170: 72 74 75 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  rtual, tab1, 0);
d180: 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  .      rc = mult
d190: 69 53 65 6c 65 63 74 4f 70 65 6e 56 69 72 74 75  iSelectOpenVirtu
d1a0: 61 6c 41 64 64 72 28 70 2c 20 61 64 64 72 29 3b  alAddr(p, addr);
d1b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d1c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d1d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d1e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d1f0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
d200: 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41   nAddr<sizeof(aA
d210: 64 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64  ddr)/sizeof(aAdd
d220: 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 61  r[0]) );.      a
d230: 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20  Addr[nAddr++] = 
d240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d250: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
d260: 75 6d 6e 73 2c 20 74 61 62 31 2c 20 30 29 3b 0a  umns, tab1, 0);.
d270: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d280: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
d290: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
d2a0: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
d2b0: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
d2c0: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
d2d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
d2e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d2f0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
d300: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
d310: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
d320: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d330: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d340: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d350: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d360: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
d370: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
d380: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
d390: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
d3a0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
d3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d3c0: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
d3d0: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
d3e0: 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
d3f0: 4f 70 65 6e 56 69 72 74 75 61 6c 41 64 64 72 28  OpenVirtualAddr(
d400: 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  p, addr);.      
d410: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d420: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
d430: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d440: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
d450: 20 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c    assert( nAddr<
d460: 73 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69  sizeof(aAddr)/si
d470: 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29  zeof(aAddr[0]) )
d480: 3b 0a 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41  ;.      aAddr[nA
d490: 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  ddr++] = sqlite3
d4a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d4b0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74  SetNumColumns, t
d4c0: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ab2, 0);.      p
d4d0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
d4e0: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
d4f0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
d500: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
d510: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
d520: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
d530: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
d540: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d550: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d560: 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
d570: 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b2, 0, 0, 0, aff
d580: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
d590: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
d5a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d5b0: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
d5c0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
d5d0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
d5e0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
d5f0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
d600: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d610: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d620: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
d630: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
d640: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
d650: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
d660: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
d670: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
d680: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
d690: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d6a0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
d6b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
d6c0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
d6d0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
d6e0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
d6f0: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
d700: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
d710: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
d720: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d730: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
d740: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d750: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
d760: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d770: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
d780: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f  Break);.      co
d790: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
d7a0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ers(pParse, p);.
d7b0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
d7c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d7d0: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
d7e0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
d7f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d800: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
d810: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
d820: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
d830: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d840: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
d850: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
d860: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20     p->pOrderBy, 
d890: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
d8a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
d8d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
d8e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d8f0: 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
d900: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d920: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d930: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
d940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d960: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
d970: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
d980: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d990: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
d9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d9b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
d9c0: 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
d9d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d9e0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
d9f0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
da00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
da10: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
da20: 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
da30: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
da40: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
da50: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
da60: 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
da70: 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
da80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
da90: 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
daa0: 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
dab0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
dac0: 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
dad0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
dae0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
daf0: 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
db00: 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
db10: 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
db20: 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
db30: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
db40: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
db50: 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
db60: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
db70: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
db80: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
db90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
dba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
dbb0: 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72  umns in temporar
dbc0: 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20  y tables.  */.  
dbd0: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
dbe0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65  ->nExpr;.  while
dbf0: 28 20 6e 41 64 64 72 3e 30 20 29 7b 0a 20 20 20  ( nAddr>0 ){.   
dc00: 20 6e 41 64 64 72 2d 2d 3b 0a 20 20 20 20 73 71   nAddr--;.    sq
dc10: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
dc20: 32 28 76 2c 20 61 41 64 64 72 5b 6e 41 64 64 72  2(v, aAddr[nAddr
dc30: 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
dc40: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
dc50: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
dc60: 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
dc70: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
dc80: 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
dc90: 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
dca0: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
dcb0: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
dcc0: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
dcd0: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
dce0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
dcf0: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
dd00: 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
dd10: 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
dd20: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
dd30: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
dd40: 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
dd50: 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
dd60: 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
dd70: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
dd80: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
dd90: 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
dda0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
ddb0: 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
ddc0: 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
ddd0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
dde0: 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
ddf0: 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
de00: 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
de10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
de20: 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
de30: 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
de40: 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
de50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20   p->pOrderBy || 
de60: 28 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 26 26  (pOpenVirtual &&
de70: 20 70 4f 70 65 6e 56 69 72 74 75 61 6c 2d 3e 6e   pOpenVirtual->n
de80: 49 64 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  Id>0) ){.    int
de90: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
dea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
deb0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
dec0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
ded0: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
dee0: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
def0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
df00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
df10: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 70 4f 70   assert( p->ppOp
df20: 65 6e 56 69 72 74 75 61 6c 20 3d 3d 20 26 70 4f  enVirtual == &pO
df30: 70 65 6e 56 69 72 74 75 61 6c 20 29 3b 0a 20 20  penVirtual );.  
df40: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
df50: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
df60: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
df70: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
df80: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  ));.    if( !pKe
df90: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
dfa0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
dfb0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
dfc0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
dfd0: 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
dfe0: 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65  fo->enc = pParse
dff0: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  ->db->enc;.    p
e000: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
e010: 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  = nCol;..    for
e020: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
e030: 2b 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  +){.      pKeyIn
e040: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  fo->aColl[i] = m
e050: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
e060: 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
e070: 0a 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79  .      if( !pKey
e080: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
e090: 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  {.        pKeyIn
e0a0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
e0b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
e0c0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
e0d0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
e0e0: 3b 20 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 26  ; pOpenVirtual &
e0f0: 26 20 69 3c 70 4f 70 65 6e 56 69 72 74 75 61 6c  & i<pOpenVirtual
e100: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
e110: 20 20 20 69 6e 74 20 70 33 74 79 70 65 20 3d 20     int p3type = 
e120: 28 69 3d 3d 30 3f 50 33 5f 4b 45 59 49 4e 46 4f  (i==0?P3_KEYINFO
e130: 5f 48 41 4e 44 4f 46 46 3a 50 33 5f 4b 45 59 49  _HANDOFF:P3_KEYI
e140: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  NFO);.      int 
e150: 61 64 64 72 20 3d 20 70 4f 70 65 6e 56 69 72 74  addr = pOpenVirt
e160: 75 61 6c 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20  ual->a[i].idx;. 
e170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e180: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
e190: 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
e1a0: 66 6f 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 20  fo, p3type);.   
e1b0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   }..    if( p->p
e1c0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
e1d0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e1e0: 5f 69 74 65 6d 20 2a 70 4f 72 64 65 72 42 79 54  _item *pOrderByT
e1f0: 65 72 6d 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  erm = p->pOrderB
e200: 79 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28  y->a;.      for(
e210: 69 3d 30 3b 20 69 3c 70 2d 3e 70 4f 72 64 65 72  i=0; i<p->pOrder
e220: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
e230: 70 4f 72 64 65 72 42 79 54 65 72 6d 2b 2b 29 7b  pOrderByTerm++){
e240: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
e250: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 54  Expr = pOrderByT
e260: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
e270: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
e280: 3d 20 70 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e  = pOrderByTerm->
e290: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
e2a0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e2b0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
e2c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43  Expr->iColumn<nC
e2d0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ol );.        /*
e2e0: 20 61 73 73 65 72 74 28 20 21 70 45 78 70 72 2d   assert( !pExpr-
e2f0: 3e 70 43 6f 6c 6c 20 29 3b 20 2a 2f 0a 20 20 20  >pColl ); */.   
e300: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
e310: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
e320: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
e330: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
e340: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d  pParse, zName, -
e350: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
e360: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  e{.          pEx
e370: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  pr->pColl = pKey
e380: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 70 45 78 70  Info->aColl[pExp
e390: 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20  r->iColumn];.   
e3a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e3b0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
e3c0: 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
e3d0: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
e3e0: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
e3f0: 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rm);.    }..    
e400: 69 66 28 20 21 70 4f 70 65 6e 56 69 72 74 75 61  if( !pOpenVirtua
e410: 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  l ){.      /* Th
e420: 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 55  is happens for U
e430: 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44  NION ALL ... ORD
e440: 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 20 20 73  ER BY */.      s
e450: 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e  qliteFree(pKeyIn
e460: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  fo);.    }.  }..
e470: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e480: 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e 56 69 72  :.  if( pOpenVir
e490: 74 75 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  tual ){.    sqli
e4a0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
e4b0: 70 4f 70 65 6e 56 69 72 74 75 61 6c 29 3b 0a 20  pOpenVirtual);. 
e4c0: 20 7d 0a 20 20 70 2d 3e 70 70 4f 70 65 6e 56 69   }.  p->ppOpenVi
e4d0: 72 74 75 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  rtual = 0;.  ret
e4e0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e4f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e500: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
e510: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e520: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
e530: 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
e540: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
e550: 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
e560: 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
e570: 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
e580: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
e590: 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
e5a0: 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
e5b0: 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
e5c0: 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
e5d0: 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
e5e0: 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
e5f0: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
e600: 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
e610: 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
e620: 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
e630: 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
e640: 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
e650: 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
e660: 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
e670: 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
e680: 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
e690: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
e6a0: 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
e6b0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
e6c0: 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
e6d0: 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
e6e0: 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
e6f0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
e700: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
e710: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
e720: 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
e730: 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
e740: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
e750: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
e760: 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
e770: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
e780: 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
e790: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
e7a0: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
e7b0: 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a  t*,int,ExprList*
e7c0: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44  );  /* Forward D
e7d0: 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ecl */.static vo
e7e0: 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
e7f0: 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
e800: 70 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46  prList *);  /* F
e810: 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
e820: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
e830: 45 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72  Expr(Expr *pExpr
e840: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78  , int iTable, Ex
e850: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b  prList *pEList){
e860: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
e870: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
e880: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
e890: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
e8a0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
e8b0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
e8c0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
e8d0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
e8e0: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
e8f0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
e900: 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
e910: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
e920: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
e930: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
e940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
e950: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
e960: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
e970: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
e980: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
e990: 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70  ew = pEList->a[p
e9a0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
e9b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
e9c0: 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20  rt( pNew!=0 );. 
e9d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
e9e0: 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20   pNew->op;.     
e9f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ea00: 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pLeft==0 );.    
ea10: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
ea20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ea30: 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
ea40: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ea50: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
ea60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
ea70: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
ea80: 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68  rDup(pNew->pRigh
ea90: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
eaa0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
eab0: 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
eac0: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
ead0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65  3ExprListDup(pNe
eae0: 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  w->pList);.     
eaf0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
eb00: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20   pNew->iTable;. 
eb10: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
eb20: 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c  umn = pNew->iCol
eb30: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72  umn;.      pExpr
eb40: 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69  ->iAgg = pNew->i
eb50: 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Agg;.      sqlit
eb60: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
eb70: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77  pr->token, &pNew
eb80: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
eb90: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
eba0: 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  (&pExpr->span, &
ebb0: 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
ebc0: 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63     pExpr->pSelec
ebd0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
ebe0: 74 44 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65  tDup(pNew->pSele
ebf0: 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ct);.      pExpr
ec00: 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  ->flags = pNew->
ec10: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  flags;.    }.  }
ec20: 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
ec30: 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
ec40: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ec50: 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
ec60: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  (pExpr->pRight, 
ec70: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ec80: 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74  .    substSelect
ec90: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
eca0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ecb0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
ecc0: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
ecd0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ece0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
ecf0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
ed00: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
ed10: 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  st, int iTable, 
ed20: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ed30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
ed40: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
ed50: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
ed60: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
ed70: 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45  i++){.    substE
ed80: 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
ed90: 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
eda0: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
edb0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
edc0: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
edd0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
ede0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
edf0: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
ee00: 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
ee10: 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  st(p->pEList, iT
ee20: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
ee30: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
ee40: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
ee50: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
ee60: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
ee70: 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
ee80: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
ee90: 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  stExpr(p->pHavin
eea0: 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
eeb0: 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28  t);.  substExpr(
eec0: 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
eed0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65  e, pEList);.}.#e
eee0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
eef0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
ef00: 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  W) */..#ifndef S
ef10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ef20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ef30: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
ef40: 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
ef50: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
ef60: 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
ef70: 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
ef80: 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
ef90: 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
efa0: 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
efb0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
efc0: 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
efd0: 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
efe0: 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
eff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
f000: 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
f010: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
f020: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
f030: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
f040: 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
f050: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
f060: 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
f070: 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
f080: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
f090: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
f0a0: 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
f0b0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
f0c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
f0d0: 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
f0e0: 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
f0f0: 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
f100: 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
f110: 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
f120: 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
f130: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
f140: 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
f150: 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
f160: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
f170: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
f180: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f190: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
f1a0: 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
f1b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
f1c0: 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
f1d0: 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
f1e0: 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
f1f0: 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
f200: 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
f210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
f220: 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
f230: 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
f240: 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
f250: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
f260: 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
f270: 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
f280: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
f290: 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
f2a0: 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
f2b0: 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
f2c0: 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
f2d0: 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
f2e0: 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
f2f0: 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
f300: 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
f310: 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
f320: 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
f330: 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
f340: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
f350: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
f360: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
f370: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
f380: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f390: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
f3a0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
f3b0: 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
f3c0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
f3d0: 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
f3e0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
f3f0: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
f400: 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
f410: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
f420: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
f430: 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
f440: 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  oin, or.**      
f450: 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69    the subquery i
f460: 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
f470: 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33  oin.  (Ticket #3
f480: 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  06).**.**   (4) 
f490: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
f4a0: 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
f4b0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f4c0: 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
f4d0: 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65  **.**   (5)  The
f4e0: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
f4f0: 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
f500: 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
f510: 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
f520: 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
f530: 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
f540: 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
f550: 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
f560: 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
f570: 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
f580: 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
f590: 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
f5a0: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
f5b0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
f5c0: 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
f5d0: 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
f5e0: 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
f5f0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
f600: 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
f610: 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
f620: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
f630: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
f640: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
f650: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
f660: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
f670: 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
f680: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
f690: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
f6a0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f6b0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
f6c0: 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
f6d0: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
f6e0: 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
f6f0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f700: 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
f710: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f720: 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20  s..**.**  (12)  
f730: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f740: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65  not the right te
f750: 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  rm of a LEFT OUT
f760: 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a  ER JOIN or the.*
f770: 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
f780: 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
f790: 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62  lause.  (added b
f7a0: 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a  y ticket #350).*
f7b0: 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
f7c0: 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
f7d0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
f7e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
f7f0: 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
f800: 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
f810: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
f820: 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
f830: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f840: 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
f850: 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
f860: 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
f870: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
f880: 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
f890: 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
f8a0: 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
f8b0: 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
f8c0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
f8d0: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
f8e0: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
f8f0: 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
f900: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
f910: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
f920: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
f930: 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
f940: 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
f950: 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
f960: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
f970: 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
f980: 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
f990: 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
f9a0: 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
f9b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
f9c0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
f9d0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
f9e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
f9f0: 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
fa00: 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
fa10: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
fa20: 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
fa30: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
fa40: 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
fa50: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
fa60: 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
fa70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
fa80: 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
fa90: 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
faa0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
fab0: 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
fac0: 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
fad0: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
fae0: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
faf0: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  tions */.){.  Se
fb00: 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
fb10: 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
fb20: 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
fb30: 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  y" */.  SrcList 
fb40: 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
fb50: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
fb60: 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
fb70: 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
fb80: 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
fb90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
fba0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
fbb0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
fbc0: 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
fbd0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
fbe0: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
fbf0: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
fc00: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
fc10: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
fc20: 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
fc30: 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
fc40: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
fc50: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
fc60: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
fc70: 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fc90: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
fca0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
fcb0: 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
fcc0: 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
fcd0: 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43  query */..  /* C
fce0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
fcf0: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
fd00: 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
fd10: 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
fd20: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
fd30: 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
fd40: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
fd50: 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
fd60: 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
fd70: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
fd80: 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
fd90: 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d  iFrom];.  pSub =
fda0: 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
fdb0: 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
fdc0: 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
fdd0: 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
fde0: 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
fdf0: 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  ;.  if( subquery
fe00: 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
fe10: 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
fe20: 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ;.  pSubSrc = pS
fe30: 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
fe40: 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
fe50: 20 69 66 28 20 28 70 53 75 62 2d 3e 70 4c 69 6d   if( (pSub->pLim
fe60: 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 29  it && p->pLimit)
fe70: 20 7c 7c 20 70 53 75 62 2d 3e 70 4f 66 66 73 65   || pSub->pOffse
fe80: 74 20 7c 7c 20 0a 20 20 20 20 20 20 28 70 53 75  t || .      (pSu
fe90: 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 69 73 41  b->pLimit && isA
fea0: 67 67 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  gg) ) return 0;.
feb0: 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
fec0: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
fed0: 30 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 69  0;.  if( pSub->i
fee0: 73 44 69 73 74 69 6e 63 74 20 26 26 20 28 70 53  sDistinct && (pS
fef0: 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
ff00: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74  Agg) ){.     ret
ff10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
ff20: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
ff30: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
ff40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ff50: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
ff60: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
ff70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
ff80: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
ff90: 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
ffa0: 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
ffb0: 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
ffc0: 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
ffd0: 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
ffe0: 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
fff0: 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
10000 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
10010 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
10020 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
10030 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
10040 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
10050 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
10060 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
10070 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
10080 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
10090 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
100a0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
100b0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
100c0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
100d0 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
100e0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  me thing..  */. 
100f0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
10100 72 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20  rc>1 && iFrom>0 
10110 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  && (pSrc->a[iFro
10120 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m-1].jointype & 
10130 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
10140 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10150 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
10160 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
10170 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
10180 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
10190 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
101a0 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
101b0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
101c0 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
101d0 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
101e0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
101f0 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
10200 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
10210 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
10220 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
10230 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
10240 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
10250 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
10260 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
10270 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
10280 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
10290 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
102a0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
102b0 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
102c0 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
102d0 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
102e0 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
102f0 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
10300 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
10310 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
10320 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
10330 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
10340 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63  iFrom>0 && (pSrc
10350 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69  ->a[iFrom-1].joi
10360 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
10370 29 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70  )!=0 .      && p
10380 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29  Sub->pWhere!=0 )
10390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
103a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
103b0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
103c0 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74  , it means flatt
103d0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
103e0 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
103f0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
10400 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
10410 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e in the outer q
10420 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  uery..  */..  /*
10430 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65   Move all of the
10440 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
10450 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
10460 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
10470 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
10480 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
10490 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
104a0 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
104b0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
104c0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
104d0 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
104e0 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
104f0 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
10500 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
10510 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
10520 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
10530 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
10540 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
10550 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
10560 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
10570 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
10580 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
10590 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
105a0 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
105b0 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
105c0 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
105d0 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
105e0 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
105f0 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  /.  iParent = pS
10600 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
10610 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  .  {.    int nSu
10620 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e  bSrc = pSubSrc->
10630 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f  nSrc;.    int jo
10640 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65  intype = pSubite
10650 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20  m->jointype;..  
10660 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
10670 61 62 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d  able(0, pSubitem
10680 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
10690 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
106a0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
106b0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
106c0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
106d0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53     sqliteFree(pS
106e0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
106f0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
10700 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
10710 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20  extra = nSubSrc 
10720 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  - 1;.      for(i
10730 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =1; i<nSubSrc; i
10740 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  ++){.        pSr
10750 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
10760 73 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30  stAppend(pSrc, 0
10770 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10780 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
10790 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
107a0 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d  pSrc->nSrc-1; i-
107b0 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d  extra>=iFrom; i-
107c0 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  -){.        pSrc
107d0 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61  ->a[i] = pSrc->a
107e0 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20  [i-extra];.     
107f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
10800 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
10810 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72   i++){.      pSr
10820 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
10830 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
10840 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
10850 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
10860 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
10870 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
10880 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e   pSrc->a[iFrom+n
10890 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79  SubSrc-1].jointy
108a0 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
108b0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67   }..  /* Now beg
108c0 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
108d0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
108e0 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
108f0 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  for .  ** refere
10900 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
10910 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
10920 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20   query..  ** .  
10930 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
10940 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  .  **   SELECT a
10950 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
10960 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
10970 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
10980 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
10990 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
109a0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
109b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
109c0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
109d0 20 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20          /.  **  
109e0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
109f0 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
10a00 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
10a10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10a20 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ___/.  **.  ** W
10a30 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
10a40 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
10a50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
10a60 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
10a70 20 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65   see.  ** "a" we
10a80 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
10a90 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
10aa0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
10ab0 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
10ac0 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45  "..  */.  substE
10ad0 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
10ae0 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
10af0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69  ->pEList);.  pLi
10b00 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
10b10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
10b20 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
10b30 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
10b40 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
10b50 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26  >a[i].zName==0 &
10b60 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74  & (pExpr = pList
10b70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
10b80 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  pan.z!=0 ){.    
10b90 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
10ba0 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
10bb0 44 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e  Dup(pExpr->span.
10bc0 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
10bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
10be0 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
10bf0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
10c00 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
10c10 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
10c20 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
10c30 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
10c40 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10c50 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
10c60 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
10c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10c80 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
10c90 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
10ca0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
10cb0 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65  .    pSub->pOrde
10cc0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
10cd0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
10ce0 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
10cf0 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
10d00 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
10d10 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
10d20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
10d30 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
10d40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
10d50 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a  (pSub->pWhere);.
10d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68    }else{.    pWh
10d70 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ere = 0;.  }.  i
10d80 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
10d90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10da0 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  p->pHaving==0 );
10db0 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
10dc0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
10dd0 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
10de0 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ere;.    substEx
10df0 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
10e00 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
10e10 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48  List);.    p->pH
10e20 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
10e30 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e  xprAnd(p->pHavin
10e40 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  g, sqlite3ExprDu
10e50 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  p(pSub->pHaving)
10e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10e70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
10e80 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
10e90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
10ea0 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f  stDup(pSub->pGro
10eb0 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  upBy);.  }else{.
10ec0 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
10ed0 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74  >pWhere, iParent
10ee0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10ef0 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
10f00 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
10f10 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  p->pWhere, pWher
10f20 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
10f30 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
10f40 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
10f50 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
10f60 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75  r or the.  ** ou
10f70 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
10f80 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70  tinct. .  */.  p
10f90 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
10fa0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
10fb0 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
10fc0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c  ;..  /*.  ** SEL
10fd0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
10fe0 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
10ff0 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
11000 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a   x OFFSET y;.  *
11010 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
11020 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  imit ){.    p->p
11030 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
11040 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e  imit;.    pSub->
11050 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  pLimit = 0;.  }.
11060 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
11070 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
11080 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
11090 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
110a0 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
110b0 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
110c0 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20  tDelete(pSub);. 
110d0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
110e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
110f0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
11100 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45  * Analyze the SE
11110 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
11120 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61  assed in as an a
11130 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
11140 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d  f it.** is a sim
11150 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
11160 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74  () query.  If it
11170 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65   is and this que
11180 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74  ry can be.** sat
11190 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73  isfied using a s
111a0 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68  ingle seek to th
111b0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65  e beginning or e
111c0 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a  nd of an index,.
111d0 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  ** then generate
111e0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
111f0 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65  is SELECT and re
11200 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73  turn 1.  If this
11210 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69   is not a .** si
11220 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
11230 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20  x() query, then 
11240 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20  return 0;.**.** 
11250 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f  A simply min() o
11260 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f  r max() query lo
11270 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
11280 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d  *.**    SELECT m
11290 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65  in(a) FROM table
112a0 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d  ;.**    SELECT m
112b0 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65  ax(a) FROM table
112c0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ;.**.** The quer
112d0 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20  y may have only 
112e0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
112f0 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d  n its FROM argum
11300 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63  ent.  There.** c
11310 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42  an be no GROUP B
11320 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57  Y or HAVING or W
11330 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54  HERE clauses.  T
11340 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75  he result set mu
11350 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e  st.** be the min
11360 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61  () or max() of a
11370 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
11380 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
11390 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74  e column.** in t
113a0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
113b0 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
113c0 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a  be indexed..**.*
113d0 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73  * The parameters
113e0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
113f0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
11400 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65   for sqlite3Sele
11410 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65  ct()..** See the
11420 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
11430 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
11440 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
11450 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
11460 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65  tatic int simple
11470 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73  MinMaxQuery(Pars
11480 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
11490 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c  t *p, int eDest,
114a0 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45   int iParm){.  E
114b0 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e  xpr *pExpr;.  in
114c0 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20  t iCol;.  Table 
114d0 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
114e0 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65  pIdx;.  int base
114f0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
11500 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74  nt seekOp;.  int
11510 20 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73   cont;.  ExprLis
11520 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73  t *pEList, *pLis
11530 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75  t, eList;.  stru
11540 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11550 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72   eListItem;.  Sr
11560 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 0a 20 20  cList *pSrc;..  
11570 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
11580 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
11590 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
115a0 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
115b0 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
115c0 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
115d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
115e0 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
115f0 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
11600 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
11610 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
11620 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
11630 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11640 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
11650 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
11660 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
11670 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
11680 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
11690 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
116a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
116b0 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
116c0 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  n 0;.  pList = p
116d0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
116e0 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
116f0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
11700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
11710 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
11720 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
11730 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
11740 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ICmp(pExpr->toke
11750 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
11760 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
11770 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c  OP_Rewind;.  }el
11780 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
11790 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
117a0 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
117b0 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
117c0 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c  = OP_Last;.  }el
117d0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
117e0 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  ;.  }.  pExpr = 
117f0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
11800 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
11810 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
11820 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c  return 0;.  iCol
11830 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
11840 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  n;.  pTab = pSrc
11850 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
11860 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  /* If we get to 
11870 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  here, it means t
11880 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74  he query is of t
11890 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e  he correct form.
118a0 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
118b0 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
118c0 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61   an index and ma
118d0 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f  ke pIdx point to
118e0 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70   the.  ** approp
118f0 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66  riate index.  If
11900 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
11910 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54  x() is on an INT
11920 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a  EGER PRIMARY.  *
11930 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f  * key column, no
11940 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73   index is necess
11950 61 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20  ary so set pIdx 
11960 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a  to NULL.  If no.
11970 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65    ** usable inde
11980 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75  x is found, retu
11990 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
119a0 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70   iCol<0 ){.    p
119b0 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Idx = 0;.  }else
119c0 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  {.    CollSeq *p
119d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
119e0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
119f0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f  , pExpr);.    fo
11a00 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
11a10 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
11a20 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11a30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
11a40 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a  ->nColumn>=1 );.
11a50 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
11a60 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
11a70 6c 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e  l && pIdx->keyIn
11a80 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f  fo.aColl[0]==pCo
11a90 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll ) break;.    
11aa0 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  }.    if( pIdx==
11ab0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11ac0 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  }..  /* Identify
11ad0 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66   column types if
11ae0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
11af0 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20  g the callback. 
11b00 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20   This.  ** step 
11b10 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
11b20 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e  e output is goin
11b30 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20  g to a table or 
11b40 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20  a memory cell.. 
11b50 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e   ** The column n
11b60 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
11b70 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
11b80 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   in the calling 
11b90 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
11ba0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
11bb0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
11bc0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
11bd0 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
11be0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
11bf0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
11c00 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
11c10 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
11c20 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
11c30 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  T_TempTable ){. 
11c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c50 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
11c60 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 30 29  rtual, iParm, 0)
11c70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11c80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
11c90 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61 72  NumColumns, iPar
11ca0 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
11cb0 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   Generating code
11cc0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e   to find the min
11cd0 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61   or the max.  Ba
11ce0 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68  sically all we h
11cf0 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
11d00 73 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  s find the first
11d10 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74   or the last ent
11d20 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e  ry in the chosen
11d30 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a   index.  If.  **
11d40 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
11d50 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e  x() is on the IN
11d60 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
11d70 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65  Y, then find the
11d80 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c   first.  ** or l
11d90 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
11da0 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a   main table..  *
11db0 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
11dc0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
11dd0 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  se, pTab->iDb);.
11de0 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61    base = pSrc->a
11df0 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 63  [0].iCursor;.  c
11e00 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
11e10 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ters(pParse, p);
11e20 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
11e30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ].pSelect==0 ){.
11e40 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
11e50 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76  ableForReading(v
11e60 2c 20 62 61 73 65 2c 20 70 54 61 62 29 3b 0a 20  , base, pTab);. 
11e70 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71 6c 69   }.  cont = sqli
11e80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11e90 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  (v);.  if( pIdx=
11ea0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11eb0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65  3VdbeAddOp(v, se
11ec0 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a  ekOp, base, 0);.
11ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11ee0 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  Even though the 
11ef0 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f  cursor used to o
11f00 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65  pen the index he
11f10 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  re is closed.   
11f20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61   ** as soon as a
11f30 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61   single value ha
11f40 73 20 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d  s been read from
11f50 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74   it, allocate it
11f60 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70  .    ** using (p
11f70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74  Parse->nTab++) t
11f80 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 63 75  o prevent the cu
11f90 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69  rsor id from bei
11fa0 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65  ng .    ** reuse
11fb0 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  d. This is impor
11fc0 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65  tant for stateme
11fd0 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
11fe0 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20  .    ** "INSERT 
11ff0 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61  INTO x SELECT ma
12000 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20  x() FROM x"..   
12010 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
12020 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50 61  ;.    iIdx = pPa
12030 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
12040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12050 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
12060 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a   pIdx->iDb, 0);.
12070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
12080 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
12090 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74  d, iIdx, pIdx->t
120a0 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  num,.           
120b0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26          (char*)&
120c0 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50  pIdx->keyInfo, P
120d0 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  3_KEYINFO);.    
120e0 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52  if( seekOp==OP_R
120f0 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  ewind ){.      s
12100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12110 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
12120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12130 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12140 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
12150 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20  );.      seekOp 
12160 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  = OP_MoveGt;.   
12170 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
12180 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f  beAddOp(v, seekO
12190 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20  p, iIdx, 0);.   
121a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
121b0 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  p(v, OP_IdxRowid
121c0 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
121d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
121e0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
121f0 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
12200 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12210 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c  OP_MoveGe, base,
12220 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74   0);.  }.  eList
12230 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65  .nExpr = 1;.  me
12240 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c  mset(&eListItem,
12250 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74   0, sizeof(eList
12260 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e  Item));.  eList.
12270 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a  a = &eListItem;.
12280 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78    eList.a[0].pEx
12290 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65  pr = pExpr;.  se
122a0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
122b0 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c  arse, p, &eList,
122c0 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44   0, 0, 0, -1, eD
122d0 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f 6e 74  est, iParm, cont
122e0 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71  , cont, 0);.  sq
122f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12300 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
12310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12320 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
12330 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72  base, 0);.  .  r
12340 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
12350 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52  * Analyze and OR
12360 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
12370 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53  BY clause in a S
12380 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
12390 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
123a0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
123b0 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20   seen..**.** An 
123c0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
123d0 50 20 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f  P BY is a list o
123e0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  f expressions.  
123f0 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
12400 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67  n.** is an integ
12410 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  er constant, the
12420 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
12430 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
12440 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
12450 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74  nding entry in t
12460 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
12470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
12480 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
12490 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
124a0 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  *pNC,     /* Nam
124b0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
124c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
124d0 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  t. */.  ExprList
124e0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
124f0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
12500 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
12510 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
12520 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12530 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45   *zType     /* E
12540 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72  ither "ORDER" or
12550 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70   "GROUP", as app
12560 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20  ropriate */.){. 
12570 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
12580 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43  st *pEList = pNC
12590 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a  ->pEList;     /*
125a0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
125b0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
125c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
125d0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20   = pNC->pParse; 
125e0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
125f0 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
12600 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ECT */.  assert(
12610 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66   pEList );..  if
12620 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
12630 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
12640 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
12650 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
12660 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
12670 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
12680 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
12690 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
126a0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
126b0 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
126c0 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
126d0 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45  iCol<=pEList->nE
126e0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
126f0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
12700 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45  (pE);.        pE
12710 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12720 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ].pExpr = sqlite
12730 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
12740 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72  >a[iCol-1].pExpr
12750 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12770 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12780 0a 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20  .           "%s 
12790 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  BY column number
127a0 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
127b0 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
127c0 20 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65            "betwe
127d0 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54  en 1 and %d", zT
127e0 79 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73  ype, iCol, pELis
127f0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
12800 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
12810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12820 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
12830 73 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20  solveNames(pNC, 
12840 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  pE) ){.      ret
12850 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
12860 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12870 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29  IsConstant(pE) )
12880 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12890 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
128a0 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59            "%s BY
128b0 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20   terms must not 
128c0 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63  be non-integer c
128d0 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65  onstants", zType
128e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
128f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
12900 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12910 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
12920 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65  esolves any name
12930 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65  s used in the re
12940 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a  sult set of the.
12950 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45  ** supplied SELE
12960 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66  CT statement. If
12970 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12980 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f  ement being reso
12990 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62  lved.** is a sub
129a0 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f  -select, then pO
129b0 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e  uterNC is a poin
129c0 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43  ter to the NameC
129d0 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68  ontext .** of th
129e0 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e  e parent SELECT.
129f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
12a00 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20  electResolve(.  
12a10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
12a30 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
12a40 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12a60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12a70 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
12a80 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
12a90 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65  pOuterNC  /* The
12aa0 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74   outer name cont
12ab0 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ext. May be NULL
12ac0 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  . */.){.  ExprLi
12ad0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
12ae0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73       /* Result s
12af0 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  et. */.  int i; 
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20      /* For-loop 
12b20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e  variable used in
12b30 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
12b40 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
12b50 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
12b60 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63   /* Local name-c
12b70 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontext */..  /* 
12b80 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
12b90 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c 20  has run before, 
12ba0 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
12bb0 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ly. */.  if( p->
12bc0 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20  isResolved ){.  
12bd0 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74 65    assert( !pOute
12be0 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  rNC );.    retur
12bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12c00 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  .  p->isResolved
12c10 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 1;..  /* If t
12c20 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61 64  here have alread
12c30 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20 64  y been errors, d
12c40 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
12c50 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12c60 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
12c70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12c80 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65   }..  /* Prepare
12c90 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
12ca0 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c  ement. This call
12cb0 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61   will allocate a
12cc0 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  ll cursors.  ** 
12cd0 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64  required to hand
12ce0 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e  le the tables an
12cf0 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  d subqueries in 
12d00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
12d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70  .  */.  if( prep
12d20 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
12d30 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
12d40 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
12d50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
12d60 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
12d70 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54  ons in the LIMIT
12d80 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
12d90 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20  ses. These.  ** 
12da0 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
12db0 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  to refer to any 
12dc0 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61  names, so pass a
12dd0 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74  n empty NameCont
12de0 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e  ext..  */.  sNC.
12df0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
12e00 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20 3d 20  .  sNC.hasAgg = 
12e10 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20 3d 20  0;.  sNC.nErr = 
12e20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20 3d 20  0;.  sNC.nRef = 
12e30 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20  0;.  sNC.pEList 
12e40 3d 20 30 3b 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77  = 0;.  sNC.allow
12e50 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 70  Agg = 0;.  sNC.p
12e60 53 72 63 4c 69 73 74 20 3d 20 30 3b 0a 20 20 73  SrcList = 0;.  s
12e70 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
12e80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
12e90 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
12ea0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
12eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12ec0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
12ed0 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
12ee0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12ef0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
12f00 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
12f10 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   local name-cont
12f20 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45  ext to pass to E
12f30 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
12f40 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  ) to.  ** resolv
12f50 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
12f60 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  -list..  */.  sN
12f70 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  C.allowAgg = 1;.
12f80 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
12f90 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e   p->pSrc;.  sNC.
12fa0 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43  pNext = pOuterNC
12fb0 3b 0a 0a 20 20 2f 2a 20 4e 61 6d 65 43 6f 6e 74  ;..  /* NameCont
12fc0 65 78 74 2e 6e 44 65 70 74 68 20 73 74 6f 72 65  ext.nDepth store
12fd0 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 72  s the depth of r
12fe0 65 63 75 72 73 69 6f 6e 20 66 6f 72 20 74 68 69  ecursion for thi
12ff0 73 20 71 75 65 72 79 2e 20 46 6f 72 0a 20 20 2a  s query. For.  *
13000 2a 20 61 6e 20 6f 75 74 65 72 20 71 75 65 72 79  * an outer query
13010 20 28 65 2e 67 2e 20 53 45 4c 45 43 54 20 2a 20   (e.g. SELECT * 
13020 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
13030 65 72 29 20 74 68 69 73 20 69 73 20 31 2e 20 46  er) this is 1. F
13040 6f 72 0a 20 20 2a 2a 20 61 20 73 75 62 71 75 65  or.  ** a subque
13050 72 79 20 69 74 20 69 73 20 32 2e 20 46 6f 72 20  ry it is 2. For 
13060 61 20 73 75 62 71 75 65 72 79 20 6f 66 20 61 20  a subquery of a 
13070 73 75 62 71 75 65 72 79 2c 20 33 2e 20 41 6e 64  subquery, 3. And
13080 20 73 6f 20 6f 6e 2e 20 0a 20 20 2a 2a 20 50 61   so on. .  ** Pa
13090 72 73 65 2e 6e 4d 61 78 44 65 70 74 68 20 69 73  rse.nMaxDepth is
130a0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 65 70   the maximum dep
130b0 74 68 20 66 6f 72 20 61 6e 79 20 73 75 62 71 75  th for any subqu
130c0 65 72 79 20 72 65 73 6f 6c 76 65 64 20 73 6f 0a  ery resolved so.
130d0 20 20 2a 2a 20 66 61 72 2e 20 54 68 69 73 20 69    ** far. This i
130e0 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
130f0 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
13100 66 20 61 67 67 72 65 67 61 74 65 20 63 6f 6e 74  f aggregate cont
13110 65 78 74 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  exts.  ** requir
13120 65 64 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 20  ed at runtime.. 
13130 20 2a 2f 0a 20 20 73 4e 43 2e 6e 44 65 70 74 68   */.  sNC.nDepth
13140 20 3d 20 28 70 4f 75 74 65 72 4e 43 3f 70 4f 75   = (pOuterNC?pOu
13150 74 65 72 4e 43 2d 3e 6e 44 65 70 74 68 2b 31 3a  terNC->nDepth+1:
13160 31 29 3b 0a 20 20 69 66 28 20 73 4e 43 2e 6e 44  1);.  if( sNC.nD
13170 65 70 74 68 3e 70 50 61 72 73 65 2d 3e 6e 4d 61  epth>pParse->nMa
13180 78 44 65 70 74 68 20 29 7b 0a 20 20 20 20 70 50  xDepth ){.    pP
13190 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68 20  arse->nMaxDepth 
131a0 3d 20 73 4e 43 2e 6e 44 65 70 74 68 3b 0a 20 20  = sNC.nDepth;.  
131b0 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
131c0 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
131d0 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45  ult set. */.  pE
131e0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
131f0 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20  ;.  if( !pEList 
13200 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13210 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30  ERROR;.  for(i=0
13220 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
13230 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
13240 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pX = pEList->
13250 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13260 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
13270 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
13280 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72  , pX) ){.      r
13290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
132a0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
132b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
132c0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
132d0 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
132e0 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
132f0 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a  o GROUP BY .  **
13300 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20   expression, do 
13310 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67  not allow aggreg
13320 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74  ates in any of t
13330 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
13340 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
13350 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29  ert( !p->isAgg )
13360 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  ;.  if( p->pGrou
13370 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
13380 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
13390 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
133a0 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
133b0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
133c0 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
133d0 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
133e0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
133f0 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
13400 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
13410 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
13420 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
13430 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13440 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
13450 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
13460 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
13470 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65  HAVING");.    re
13480 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13490 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  R;.  }..  /* Add
134a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
134b0 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
134c0 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
134d0 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  parsing the.  **
134e0 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
134f0 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
13500 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
13510 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a   is so that.  **
13520 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
13530 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13540 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65   (etc.) can refe
13550 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  r to expressions
13560 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73   by.  ** aliases
13570 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
13580 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69  et..  **.  ** Mi
13590 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68  nor point: If th
135a0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
135b0 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
135c0 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
135d0 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
135e0 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
135f0 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73   to it..  */.  s
13600 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
13610 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  EList;.  if( sql
13620 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13630 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
13640 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73  here) ||.      s
13650 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13660 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
13670 70 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20  pHaving) ||.    
13680 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
13690 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70  oupBy(&sNC, p->p
136a0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
136b0 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65  ) ||.      proce
136c0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
136d0 73 4e 43 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  sNC, p->pGroupBy
136e0 2c 20 22 47 52 4f 55 50 22 29 0a 20 20 29 7b 0a  , "GROUP").  ){.
136f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13700 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
13710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
13730 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
13740 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 20 69  llowing struct i
13750 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  s used by sqlite
13760 33 53 65 6c 65 63 74 28 29 0a 2a 2a 20 74 6f 20  3Select().** to 
13770 73 61 76 65 20 61 67 67 72 65 67 61 74 65 20 72  save aggregate r
13780 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  elated informati
13790 6f 6e 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  on from the Pars
137a0 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 74 20 74  e object.** at t
137b0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
137c0 20 63 61 6c 6c 20 61 6e 64 20 74 6f 20 72 65 73   call and to res
137d0 74 6f 72 65 20 69 74 20 61 74 20 74 68 65 20 65  tore it at the e
137e0 6e 64 2e 20 53 65 65 0a 2a 2a 20 73 61 76 65 41  nd. See.** saveA
137f0 67 67 72 65 67 61 74 65 49 6e 66 6f 28 29 20 61  ggregateInfo() a
13800 6e 64 20 72 65 73 74 6f 72 65 41 67 67 72 65 67  nd restoreAggreg
13810 61 74 65 49 6e 66 6f 28 29 2e 0a 2a 2f 20 0a 73  ateInfo()..*/ .s
13820 74 72 75 63 74 20 41 67 67 72 65 67 61 74 65 49  truct AggregateI
13830 6e 66 6f 20 7b 0a 20 20 69 6e 74 20 6e 41 67 67  nfo {.  int nAgg
13840 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
13850 67 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  g;.};.typedef st
13860 72 75 63 74 20 41 67 67 72 65 67 61 74 65 49 6e  ruct AggregateIn
13870 66 6f 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f  fo AggregateInfo
13880 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 6f 70 79 20 61  ;../* .** Copy a
13890 67 67 72 65 67 61 74 65 20 72 65 6c 61 74 65 64  ggregate related
138a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
138b0 6d 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  m the Parse stru
138c0 63 74 75 72 65 0a 2a 2a 20 69 6e 74 6f 20 74 68  cture.** into th
138d0 65 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20  e AggregateInfo 
138e0 73 74 72 75 63 74 75 72 65 2e 20 5a 65 72 6f 20  structure. Zero 
138f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 72 65  the aggregate re
13900 6c 61 74 65 64 0a 2a 2a 20 76 61 6c 75 65 73 20  lated.** values 
13910 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
13920 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  uct..*/.static v
13930 6f 69 64 20 73 61 76 65 41 67 67 72 65 67 61 74  oid saveAggregat
13940 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
13950 72 73 65 2c 20 41 67 67 72 65 67 61 74 65 49 6e  rse, AggregateIn
13960 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 70 49  fo *pInfo){.  pI
13970 6e 66 6f 2d 3e 61 41 67 67 20 3d 20 70 50 61 72  nfo->aAgg = pPar
13980 73 65 2d 3e 61 41 67 67 3b 0a 20 20 70 49 6e 66  se->aAgg;.  pInf
13990 6f 2d 3e 6e 41 67 67 20 3d 20 70 50 61 72 73 65  o->nAgg = pParse
139a0 2d 3e 6e 41 67 67 3b 0a 20 20 70 50 61 72 73 65  ->nAgg;.  pParse
139b0 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20 70 50  ->aAgg = 0;.  pP
139c0 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30 3b 0a  arse->nAgg = 0;.
139d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 61 67  }../*.** Copy ag
139e0 67 72 65 67 61 74 65 20 72 65 6c 61 74 65 64 20  gregate related 
139f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
13a00 20 74 68 65 20 41 67 67 72 65 67 61 74 65 49 6e   the AggregateIn
13a10 66 6f 20 73 74 72 75 63 74 0a 2a 2a 20 62 61 63  fo struct.** bac
13a20 6b 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  k into the Parse
13a30 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
13a40 61 67 67 72 65 67 61 74 65 20 72 65 6c 61 74 65  aggregate relate
13a50 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
13a60 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
13a70 64 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  d in the Parse s
13a80 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c 65  tructure is dele
13a90 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
13aa0 6f 69 64 20 72 65 73 74 6f 72 65 41 67 67 72 65  oid restoreAggre
13ab0 67 61 74 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  gateInfo(Parse *
13ac0 70 50 61 72 73 65 2c 20 41 67 67 72 65 67 61 74  pParse, Aggregat
13ad0 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  eInfo *pInfo){. 
13ae0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 72   sqliteFree(pPar
13af0 73 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70 50 61  se->aAgg);.  pPa
13b00 72 73 65 2d 3e 61 41 67 67 20 3d 20 70 49 6e 66  rse->aAgg = pInf
13b10 6f 2d 3e 61 41 67 67 3b 0a 20 20 70 50 61 72 73  o->aAgg;.  pPars
13b20 65 2d 3e 6e 41 67 67 20 3d 20 70 49 6e 66 6f 2d  e->nAgg = pInfo-
13b30 3e 6e 41 67 67 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a  >nAgg;.}.  ./*.*
13b40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13b50 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
13b60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
13b70 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
13b80 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
13b90 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
13ba0 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
13bb0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65  he.** value of e
13bc0 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a  Dest and iParm..
13bd0 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20  **.**     eDest 
13be0 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75  Value       Resu
13bf0 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
13c00 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
13c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c30 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
13c40 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
13c50 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
13c60 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
13c70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
13c80 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
13c90 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
13ca0 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
13cb0 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a  ory cell iParm.*
13cc0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
13cd0 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
13ce0 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
13cf0 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  f table iParm..*
13d00 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
13d10 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
13d20 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
13d30 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
13d40 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
13d50 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
13d60 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
13d70 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
13d80 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
13d90 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
13da0 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
13db0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
13dc0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
13dd0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Parm.**.** The t
13de0 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e  able above is in
13df0 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74  complete.  Addit
13e00 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75  ional eDist valu
13e10 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a  e have be added.
13e20 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  ** since this co
13e30 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65  mment was writte
13e40 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65  n.  See the sele
13e50 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75  ctInnerLoop() fu
13e60 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20  nction for.** a 
13e70 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67  complete listing
13e80 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20   of the allowed 
13e90 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20  values of eDest 
13ea0 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e  and their meanin
13eb0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gs..**.** This r
13ec0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
13ed0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
13ee0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
13ef0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
13f00 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
13f10 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
13f20 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
13f30 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
13f40 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
13f50 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
13f60 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
13f70 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
13f80 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
13f90 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
13fa0 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
13fb0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  hat..**.** The p
13fc0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
13fd0 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41  b, and *pParentA
13fe0 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69  gg fields are fi
13ff0 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a  lled in if this.
14000 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73  ** SELECT is a s
14010 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72  ubquery.  This r
14020 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74  outine may try t
14030 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53  o combine this S
14040 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74  ELECT.** with it
14050 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d  s parent to form
14060 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71   a single flat q
14070 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69  uery.  In so doi
14080 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20  ng, it might.** 
14090 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e  change the paren
140a0 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e  t query from a n
140b0 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20  on-aggregate to 
140c0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
140d0 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20  ry..** For that 
140e0 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72  reason, the pPar
140f0 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70  entAgg flag is p
14100 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74  assed as a point
14110 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e  er, so it.** can
14120 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a   be changed..**.
14130 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20  ** Example 1:   
14140 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
14150 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
14160 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  eter..**.**    S
14170 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
14180 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20  JOIN (SELECT x, 
14190 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
141a0 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20  ) JOIN t3;.**   
141b0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
141c0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
141d0 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
141e0 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20  _/        /.**  
141f0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20            /.**  
14230 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
14240 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
14250 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
14260 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a  _________/.**.**
14270 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14280 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
14290 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73  outer query firs
142a0 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61  t.   For that ca
142b0 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77  ll,.** pParent w
142c0 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75  ill be NULL.  Du
142d0 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73  ring the process
142e0 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ing of the outer
142f0 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a   query, this .**
14300 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14310 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ed recursively t
14320 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62  o handle the sub
14330 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20  query.  For the 
14340 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  recursive.** cal
14350 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  l, pParent will 
14360 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  point to the out
14370 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75  er query.  Becau
14380 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  se the subquery 
14390 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  is.** the second
143a0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68   element in a th
143b0 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68  ree-way join, th
143c0 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61  e parentTab para
143d0 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  meter will.** be
143e0 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75   1 (the 2nd valu
143f0 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64  e of a 0-indexed
14400 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20   array.).*/.int 
14410 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
14420 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
14440 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
14450 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
14460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14470 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14480 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
14490 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
144a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
144b0 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
144c0 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
144d0 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
144e0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
144f0 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
14500 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
14510 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
14520 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
14530 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
14540 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
14550 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
14560 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
14570 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
14580 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
14590 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
145a0 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
145b0 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20  t *pParentAgg,  
145c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
145d0 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
145e0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
145f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14610 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
14620 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
14630 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
14640 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
14650 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
14660 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
14670 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
14680 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
14690 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
146a0 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
146b0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
146c0 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
146d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
146e0 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
146f0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
14700 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
14710 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
14720 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
14730 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
14740 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
14750 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
14760 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
14770 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
14780 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
14790 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
147a0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
147b0 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
147c0 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
147d0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
147e0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
147f0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
14800 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
14810 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
14820 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  LL */.  int isDi
14830 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
14840 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
14850 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
14860 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
14870 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20  nt distinct;    
14880 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
14890 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
148a0 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20  stinct set */.  
148b0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
148c0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
148d0 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
148e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
148f0 20 20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20    AggregateInfo 
14900 73 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  sAggInfo;..  if(
14910 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
14920 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  failed || pParse
14930 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29  ->nErr || p==0 )
14940 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
14950 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14960 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14970 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
14980 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 23  ) ) return 1;..#
14990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
149a0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
149b0 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
149c0 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
149d0 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
149e0 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
149f0 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
14a00 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
14a10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
14a20 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
14a30 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
14a40 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64  , aff);.  }.#end
14a50 69 66 0a 0a 20 20 73 61 76 65 41 67 67 72 65 67  if..  saveAggreg
14a60 61 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ateInfo(pParse, 
14a70 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 70 4f  &sAggInfo);.  pO
14a80 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
14a90 65 72 42 79 3b 0a 20 20 69 66 28 20 65 44 65 73  erBy;.  if( eDes
14aa0 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
14ab0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
14ac0 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
14ad0 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 70  Discard ){.    p
14ae0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14af0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
14b00 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
14b10 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
14b20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
14b30 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
14b40 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14b50 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  y;..  /* Make lo
14b60 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
14b70 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
14b80 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
14b90 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
14ba0 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
14bb0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
14bc0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
14bd0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
14be0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
14bf0 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41    isAgg = p->isA
14c00 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  gg;.  isDistinct
14c10 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
14c20 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
14c30 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
14c40 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
14c50 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
14c60 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
14c70 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
14c80 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
14c90 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
14ca0 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
14cb0 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
14cc0 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
14cd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
14ce0 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
14cf0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
14d00 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
14d10 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
14d20 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
14d30 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
14d40 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
14d50 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  put..  */.  asse
14d60 72 74 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  rt( eDest!=SRT_E
14d70 78 69 73 74 73 20 7c 7c 20 70 45 4c 69 73 74 2d  xists || pEList-
14d80 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 23 69 66  >nExpr==1 );.#if
14d90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14da0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
14db0 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
14dc0 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
14dd0 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  t) && pEList->nE
14de0 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  xpr>1 ){.    sql
14df0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14e00 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
14e10 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
14e20 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
14e30 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
14e40 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
14e50 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
14e60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
14e70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14e80 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
14e90 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
14ea0 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
14eb0 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
14ec0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
14ed0 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65  _Union:.    case
14ee0 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20   SRT_Except:.   
14ef0 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72   case SRT_Discar
14f00 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  d:.      pOrderB
14f10 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  y = 0;.      bre
14f20 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
14f30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14f40 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
14f50 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
14f60 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
14f70 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
14f80 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
14f90 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
14fa0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
14fb0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
14fc0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
14fd0 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
14fe0 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
14ff0 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
15000 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
15010 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
15020 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
15030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
15040 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
15050 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
15060 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
15070 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
15080 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
15090 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
150a0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
150b0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
150c0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
150d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
150e0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
150f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15100 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
15110 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
15120 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
15130 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15140 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
15150 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
15160 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
15170 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ..    if( pTabLi
15180 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
15190 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
151a0 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
151b0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20  ->a[i].zName!=0 
151c0 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41  ){.      zSavedA
151d0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
151e0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
151f0 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t;.      pParse-
15200 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
15210 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
15220 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
15230 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
15240 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
15250 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
15260 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
15270 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
15280 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
15290 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
152a0 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62  ect, SRT_TempTab
152b0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
152c0 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
152d0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c  a[i].iCursor, p,
152e0 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a   i, &isAgg, 0);.
152f0 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74      if( needRest
15300 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20  oreContext ){.  
15310 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
15320 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
15330 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
15340 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
15350 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
15360 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
15370 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
15380 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20  t!=SRT_Union && 
15390 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70  eDest!=SRT_Excep
153a0 74 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  t && eDest!=SRT_
153b0 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20  Discard ){.     
153c0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
153d0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
153e0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
153f0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
15400 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
15410 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
15420 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
15430 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nct;.  }.#endif.
15440 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
15450 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
15460 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   of a min() or m
15470 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79  ax() function by
15480 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20   itself.  ** in 
15490 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
154a0 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c    */.  if( simpl
154b0 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61  eMinMaxQuery(pPa
154c0 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
154d0 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20  Parm) ){.    rc 
154e0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 0;.    goto se
154f0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
15500 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
15510 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
15520 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
15530 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
15540 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
15550 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
15560 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
15570 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
15580 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
15590 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  .  .  */.#ifndef
155a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
155b0 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  W.  if( pParent 
155c0 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
155d0 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
155e0 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
155f0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
15600 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
15610 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
15620 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
15630 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67  ntAgg = 1;.    g
15640 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15650 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15660 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
15670 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
15680 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c   resolve any col
15690 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
156a0 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74  .  ** names that
156b0 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 6c 69   have been expli
156c0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 2e  citly specified.
156d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
156e0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  erBy ){.    stru
156f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15700 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72   *pTerm;.    for
15710 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64  (i=0, pTerm=pOrd
15720 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65  erBy->a; i<pOrde
15730 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  rBy->nExpr; i++,
15740 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
15750 20 69 66 28 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d   if( pTerm->zNam
15760 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65  e ){.        pTe
15770 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  rm->pExpr->pColl
15780 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
15790 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
157a0 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 2c 20 2d 31  pTerm->zName, -1
157b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
157c0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
157d0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67  >nErr ){.      g
157e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
157f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15800 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
15810 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
15820 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
15830 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
15840 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
15850 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
15860 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
15870 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
15880 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
15890 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
158a0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
158b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
158c0 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61  OpenVirtual, iPa
158d0 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
158e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
158f0 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
15900 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
15910 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
15920 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
15930 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
15940 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
15950 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20  .  if( isAgg || 
15960 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
15970 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
15980 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
15990 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
159a0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
159b0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
159c0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
159d0 54 61 62 4c 69 73 74 3b 0a 0a 20 20 20 20 61 73  TabList;..    as
159e0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41  sert( pParse->nA
159f0 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41  gg==0 );.    isA
15a00 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  gg = 1;.    if( 
15a10 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
15a20 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
15a30 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  pEList) ){.     
15a40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15a60 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
15a70 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
15a80 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20  pGroupBy) ){.   
15a90 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
15aa0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
15ab0 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
15ac0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
15ad0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
15ae0 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
15af0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
15b00 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
15b10 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
15b20 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
15b30 20 70 4f 72 64 65 72 42 79 29 20 29 7b 0a 20 20   pOrderBy) ){.  
15b40 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
15b50 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  end;.    }.  }..
15b60 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 61    /* Reset the a
15b70 67 67 72 65 67 61 74 6f 72 0a 20 20 2a 2f 0a 20  ggregator.  */. 
15b80 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
15b90 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
15ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15bb0 20 4f 50 5f 41 67 67 52 65 73 65 74 2c 20 28 70   OP_AggReset, (p
15bc0 47 72 6f 75 70 42 79 3f 30 3a 31 29 2c 20 70 50  GroupBy?0:1), pP
15bd0 61 72 73 65 2d 3e 6e 41 67 67 29 3b 0a 20 20 20  arse->nAgg);.   
15be0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
15bf0 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
15c00 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
15c10 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20  Func;.      if( 
15c20 28 70 46 75 6e 63 20 3d 20 70 50 61 72 73 65 2d  (pFunc = pParse-
15c30 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 29 21  >aAgg[i].pFunc)!
15c40 3d 30 20 26 26 20 70 46 75 6e 63 2d 3e 78 46 69  =0 && pFunc->xFi
15c50 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20  nalize!=0 ){.   
15c60 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d       int nExpr =
15c70 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
15c80 45 5f 53 53 45 0a 20 20 20 20 20 20 20 20 45 78  E_SSE.        Ex
15c90 70 72 20 2a 70 41 67 67 45 78 70 72 20 3d 20 70  pr *pAggExpr = p
15ca0 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
15cb0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66  Expr;.        if
15cc0 28 20 70 41 67 67 45 78 70 72 20 26 26 20 70 41  ( pAggExpr && pA
15cd0 67 67 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b  ggExpr->pList ){
15ce0 0a 20 20 20 20 20 20 20 20 20 20 6e 45 78 70 72  .          nExpr
15cf0 20 3d 20 70 41 67 67 45 78 70 72 2d 3e 70 4c 69   = pAggExpr->pLi
15d00 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
15d10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
15d30 70 33 28 76 2c 20 4f 50 5f 41 67 67 49 6e 69 74  p3(v, OP_AggInit
15d40 2c 20 6e 45 78 70 72 2c 20 69 2c 20 28 63 68 61  , nExpr, i, (cha
15d50 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e  r*)pFunc, P3_FUN
15d60 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  CDEF);.      }. 
15d70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72     }.    if( pGr
15d80 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
15d90 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 6b  eyInfo *pKey = k
15da0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
15db0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
15dc0 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBy);.      if( 
15dd0 30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  0==pKey ){.     
15de0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
15df0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15e10 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
15e20 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f  char *)pKey, P3_
15e30 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
15e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15e50 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
15e60 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   memory cell to 
15e70 4e 55 4c 4c 20 66 6f 72 20 53 52 54 5f 4d 65 6d  NULL for SRT_Mem
15e80 20 6f 72 20 30 20 66 6f 72 20 53 52 54 5f 45 78   or 0 for SRT_Ex
15e90 69 73 74 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ists.  */.  if( 
15ea0 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
15eb0 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  | eDest==SRT_Exi
15ec0 73 74 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sts ){.    sqlit
15ed0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 65  e3VdbeAddOp(v, e
15ee0 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 3f 20  Dest==SRT_Mem ? 
15ef0 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 49 6e 74  OP_Null : OP_Int
15f00 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
15f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15f20 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
15f30 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d  , iParm, 1);.  }
15f40 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
15f50 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
15f60 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
15f70 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
15f80 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
15f90 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
15fa0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15fb0 0a 20 20 20 20 6f 70 65 6e 56 69 72 74 75 61 6c  .    openVirtual
15fc0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
15fd0 20 64 69 73 74 69 6e 63 74 29 3b 0a 20 20 7d 65   distinct);.  }e
15fe0 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
15ff0 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
16000 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
16010 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
16020 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
16030 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
16040 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
16050 68 65 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20  here,.          
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20     pGroupBy ? 0 
16080 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  : &pOrderBy);.  
16090 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
160a0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
160b0 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  ..  /* Use the s
160c0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
160d0 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  op if we are not
160e0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
160f0 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20  ** aggregates.  
16100 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
16110 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  ){.    if( selec
16120 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
16130 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
16140 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
16150 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f     iParm, pWInfo
16180 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
16190 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
161a0 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
161b0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
161c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
161d0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
161e0 69 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20  ith aggregates, 
161f0 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63  then do the spec
16200 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20  ial aggregate.  
16210 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  ** processing.  
16220 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
16230 20 20 41 67 67 45 78 70 72 20 2a 70 41 67 67 3b    AggExpr *pAgg;
16240 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 20 3d 20  .    int lbl1 = 
16250 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 66  0;.    pParse->f
16260 69 6c 6c 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  illAgg = 1;.    
16270 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
16280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16290 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
162a0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
162b0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66  .      /* No aff
162c0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 73 20  inity string is 
162d0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
162e0 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b  following OP_Mak
162f0 65 52 65 63 6f 72 64 20 0a 20 20 20 20 20 20 2a  eRecord .      *
16300 2a 20 62 65 63 61 75 73 65 20 77 65 20 64 6f 20  * because we do 
16310 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61  not need to do a
16320 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64  ny coercion of d
16330 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20  atatypes. */.   
16340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16350 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
16360 63 6f 72 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e  cord, pGroupBy->
16370 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
16380 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56   lbl1 = sqlite3V
16390 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
163a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
163b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
163c0 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29  gFocus, 0, lbl1)
163d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
163e0 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65  i=0, pAgg=pParse
163f0 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65  ->aAgg; i<pParse
16400 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67  ->nAgg; i++, pAg
16410 67 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g++){.      if( 
16420 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f  pAgg->isAgg ) co
16430 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71  ntinue;.      sq
16440 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
16450 61 72 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70  arse, pAgg->pExp
16460 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
16470 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16480 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a  _AggSet, 0, i);.
16490 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
164a0 2d 3e 66 69 6c 6c 41 67 67 20 3d 20 30 3b 0a 20  ->fillAgg = 0;. 
164b0 20 20 20 69 66 28 20 6c 62 6c 31 3c 30 20 29 7b     if( lbl1<0 ){
164c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
164d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
164e0 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20  , lbl1);.    }. 
164f0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67     for(i=0, pAgg
16500 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69  =pParse->aAgg; i
16510 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
16520 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20  ++, pAgg++){.   
16530 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
16540 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20     int nExpr;.  
16550 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
16560 66 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  f;.      if( !pA
16570 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74  gg->isAgg ) cont
16580 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
16590 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21  rt( pAgg->pFunc!
165a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
165b0 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d  rt( pAgg->pFunc-
165c0 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20  >xStep!=0 );.   
165d0 20 20 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e     pDef = pAgg->
165e0 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20  pFunc;.      pE 
165f0 3d 20 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20  = pAgg->pExpr;. 
16600 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
16610 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
16620 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  rt( pE->op==TK_A
16630 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
16640 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c       nExpr = sql
16650 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
16660 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
16670 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  >pList);.      s
16680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16690 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
166a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
166b0 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  pDef->needCollSe
166c0 71 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  q ){.        Col
166d0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
166e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
166f0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
16700 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78   !pColl && j<nEx
16710 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
16720 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
16730 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
16740 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74  Parse, pE->pList
16750 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
16760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16770 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
16780 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
16790 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
167a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
167b0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op3(v, OP_CollSe
167c0 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  q, 0, 0, (char *
167d0 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53  )pColl, P3_COLLS
167e0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
167f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
16800 33 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c  3(v, OP_AggFunc,
16810 20 30 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72   0, nExpr, (char
16820 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44  *)pDef, P3_FUNCD
16830 45 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  EF);.    }.  }..
16840 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
16850 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
16860 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
16870 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
16880 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
16890 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
168a0 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20  egates, we need 
168b0 74 6f 20 73 65 74 20 75 70 20 61 20 73 65 63 6f  to set up a seco
168c0 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65  nd loop.  ** ove
168d0 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67  r all of the agg
168e0 72 65 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e  regate values an
168f0 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a  d process them..
16900 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
16910 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61   ){.    int enda
16920 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  gg = sqlite3Vdbe
16930 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16940 20 20 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a    int startagg;.
16950 20 20 20 20 73 74 61 72 74 61 67 67 20 3d 20 73      startagg = s
16960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16970 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30  v, OP_AggNext, 0
16980 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 69  , endagg);.    i
16990 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
169a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
169b0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
169c0 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67  Having, startagg
169d0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
169e0 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  if( selectInnerL
169f0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
16a00 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
16a10 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
16a20 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   eDest,.        
16a30 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 72              iPar
16a40 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64  m, startagg, end
16a50 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20  agg, aff) ){.   
16a60 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
16a70 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  nd;.    }.    sq
16a80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16a90 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74  , OP_Goto, 0, st
16aa0 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c  artagg);.    sql
16ab0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16ac0 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b  abel(v, endagg);
16ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16ae0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
16af0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
16b00 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
16b10 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
16b20 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
16b30 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
16b40 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
16b50 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
16b60 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
16b70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
16b80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
16b90 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
16ba0 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
16bb0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
16bc0 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a  t, iParm);.  }..
16bd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16be0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f  MIT_SUBQUERY.  /
16bf0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20  * If this was a 
16c00 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76  subquery, we hav
16c10 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20  e now converted 
16c20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
16c30 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  o a.  ** tempora
16c40 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65  ry table.  So de
16c50 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72  lete the subquer
16c60 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  y structure from
16c70 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
16c80 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   to prevent this
16c90 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
16ca0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
16cb0 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
16cc0 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75  e the.  ** the u
16cd0 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  se of the tempor
16ce0 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ary table..  */.
16cf0 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
16d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16d10 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  rent->pSrc->nSrc
16d20 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20  >parentTab );.  
16d30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
16d40 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
16d50 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70  tTab].pSelect==p
16d60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
16d70 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a  electDelete(p);.
16d80 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
16d90 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
16da0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d  pSelect = 0;.  }
16db0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68  .#endif..  /* Th
16dc0 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
16dd0 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
16de0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
16df0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
16e00 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
16e10 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
16e20 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
16e30 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
16e40 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
16e50 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
16e60 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
16e70 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
16e80 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
16e90 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
16ea0 6e 64 3a 0a 20 20 72 65 73 74 6f 72 65 41 67 67  nd:.  restoreAgg
16eb0 72 65 67 61 74 65 49 6e 66 6f 28 70 50 61 72 73  regateInfo(pPars
16ec0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
16ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.