/ Hex Artifact Content
Login

Artifact 28b752e58955c7920711fbdbfdcd369a2bd09448:


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 32  select.c,v 1.252
0200: 20 32 30 30 35 2f 30 36 2f 31 32 20 32 31 3a 33   2005/06/12 21:3
0210: 35 3a 35 32 20 64 72 68 20 45 78 70 20 24 0a 2a  5:52 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0440: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0470: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0480: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0490: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
04a0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
04b0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
04c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
04d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
04e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
04f0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0500: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0510: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0520: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0530: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0540: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0560: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0570: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0580: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
0590: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
05a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
05b0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
05c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
05d0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
05e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
05f0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0610: 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a  lete(pOrderBy);.
0620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0630: 65 6c 65 74 65 28 70 4c 69 6d 69 74 29 3b 0a 20  elete(pLimit);. 
0640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0650: 6c 65 74 65 28 70 4f 66 66 73 65 74 29 3b 0a 20  lete(pOffset);. 
0660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0670: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0680: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
06a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
06b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
06c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  0);.    }.    pN
06d0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
06e0: 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ist;.    pNew->p
06f0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
0700: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0710: 57 68 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d  Where;.    pNew-
0720: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0730: 75 70 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  upBy;.    pNew->
0740: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0750: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  g;.    pNew->pOr
0760: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
0770: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69  ;.    pNew->isDi
0780: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0790: 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  nct;.    pNew->o
07a0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
07b0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
07c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e  = pLimit;.    pN
07d0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
07e0: 66 66 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d  ffset;.    pNew-
07f0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
0800: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0810: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0820: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0830: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
0840: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
0850: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0860: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0870: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0880: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0890: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
08a0: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
08b0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
08c0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
08d0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
08e0: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
08f0: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0900: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0910: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0920: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0930: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0940: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0950: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0960: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0970: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0980: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0990: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
09a0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
09b0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
09c0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
09d0: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
09e0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
09f0: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a10: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a20: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0a30: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0a40: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0a50: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0a60: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0a70: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0a80: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0a90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0aa0: 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20   *zKeyword;.    
0ab0: 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20 75 38  u8 nChar;.    u8
0ac0: 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f   code;.  } keywo
0ad0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  rds[] = {.    { 
0ae0: 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54  "natural", 7, JT
0af0: 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20  _NATURAL },.    
0b00: 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20  { "left",    4, 
0b10: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
0b20: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74   },.    { "right
0b30: 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54  ",   5, JT_RIGHT
0b40: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0b50: 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c   { "full",    4,
0b60: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
0b70: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0b80: 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35    { "outer",   5
0b90: 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  , JT_OUTER },.  
0ba0: 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35    { "inner",   5
0bb0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20  , JT_INNER },.  
0bc0: 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35    { "cross",   5
0bd0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20  , JT_INNER },.  
0be0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
0bf0: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
0c00: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
0c10: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
0c20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
0c30: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
0c40: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
0c50: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
0c60: 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77  0; j<sizeof(keyw
0c70: 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79  ords)/sizeof(key
0c80: 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b  words[0]); j++){
0c90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
0ca0: 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68  =keywords[j].nCh
0cb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
0cc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
0cd0: 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b  (p->z, keywords[
0ce0: 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e  j].zKeyword, p->
0cf0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
0d00: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79   jointype |= key
0d10: 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  words[j].code;. 
0d20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
0d40: 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65  if( j>=sizeof(ke
0d50: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0d60: 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20  eywords[0]) ){. 
0d70: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0d80: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
0d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0da0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
0db0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
0dc0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
0dd0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
0de0: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
0df0: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
0e00: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
0e10: 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20 3d 20  st char *zSp1 = 
0e20: 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  " ";.    const c
0e30: 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b  har *zSp2 = " ";
0e40: 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30 20 29  .    if( pB==0 )
0e50: 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20 20 20  { zSp1++; }.    
0e60: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
0e70: 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  2++; }.    sqlit
0e80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
0e90: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
0ea0: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0eb0: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
0ec0: 25 54 25 73 25 54 25 73 25 54 22 2c 20 70 41 2c  %T%s%T%s%T", pA,
0ed0: 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70 32 2c   zSp1, pB, zSp2,
0ee0: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
0ef0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0f00: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74   }else if( joint
0f10: 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29  ype & JT_RIGHT )
0f20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0f30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
0f40: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
0f50: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
0f60: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0f70: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
0f80: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
0f90: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
0fa0: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
0fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0fc0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
0fd0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
0fe0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
0ff0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
1000: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1010: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1020: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1030: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1040: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1050: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1060: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1070: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1080: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1090: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
10a0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
10b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
10c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10e0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b  e value of a tok
10f0: 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d 74  en to a '\000'-t
1100: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
1110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1120: 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20   setToken(Token 
1130: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1140: 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a 3b 0a  z){.  p->z = z;.
1150: 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28    p->n = strlen(
1160: 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30  z);.  p->dyn = 0
1170: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
1180: 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48  a term to the WH
1190: 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ERE expression i
11a0: 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20 72  n *ppExpr that r
11b0: 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a  equires the.** z
11c0: 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  Col column to be
11d0: 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77   equal in the tw
11e0: 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20 61  o tables pTab1 a
11f0: 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61  nd pTab2..*/.sta
1200: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1210: 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63  eTerm(.  const c
1220: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20  har *zCol,      
1230: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1240: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
1250: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c  st Table *pTab1,
1260: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1270: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1280: 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20  char *zAlias1,  
1290: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
12a0: 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20 4d 61  first table.  Ma
12b0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  y be NULL */.  c
12c0: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
12d0: 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  2,      /* Secon
12e0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  d table */.  con
12f0: 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 32  st char *zAlias2
1300: 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66  ,     /* Alias f
1310: 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e  or second table.
1320: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1330: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
1340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1350: 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  dd the equality 
1360: 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70  term to this exp
1370: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
1380: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45  Token dummy;.  E
1390: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
13a0: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
13b0: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
13c0: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
13d0: 0a 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75  ..  setToken(&du
13e0: 6d 6d 79 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45  mmy, zCol);.  pE
13f0: 31 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1a = sqlite3Expr
1400: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1410: 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20  ummy);.  pE2a = 
1420: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1430: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1440: 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d  ;.  if( zAlias1=
1450: 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73  =0 ){.    zAlias
1460: 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  1 = pTab1->zName
1470: 3b 0a 20 20 7d 0a 20 20 73 65 74 54 6f 6b 65 6e  ;.  }.  setToken
1480: 28 26 64 75 6d 6d 79 2c 20 7a 41 6c 69 61 73 31  (&dummy, zAlias1
1490: 29 3b 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69  );.  pE1b = sqli
14a0: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
14b0: 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  , 0, &dummy);.  
14c0: 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29  if( zAlias2==0 )
14d0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20  {.    zAlias2 = 
14e0: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
14f0: 7d 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75  }.  setToken(&du
1500: 6d 6d 79 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  mmy, zAlias2);. 
1510: 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 45   pE2b = sqlite3E
1520: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1530: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 31 63   &dummy);.  pE1c
1540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
1550: 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31  K_DOT, pE1b, pE1
1560: 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20  a, 0);.  pE2c = 
1570: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
1580: 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20  OT, pE2b, pE2a, 
1590: 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74  0);.  pE = sqlit
15a0: 65 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70 45  e3Expr(TK_EQ, pE
15b0: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
15c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
15d0: 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
15e0: 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71  ;.  *ppExpr = sq
15f0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70  lite3ExprAnd(*pp
1600: 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a  Expr, pE);.}../*
1610: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1620: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1630: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1640: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1650: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1660: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1670: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
1680: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
1690: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
16a0: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
16b0: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
16c0: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
16d0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
16e0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
16f0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
1700: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
1710: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
1720: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
1730: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1740: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1750: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
1760: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
1770: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1780: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
1790: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
17a0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
17b0: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
17c0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
17d0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
17e0: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
17f0: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
1800: 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68  r(Expr *p){.  wh
1810: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
1820: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
1830: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1840: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
1850: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20  ->pLeft);.    p 
1860: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
1870: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
1880: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
1890: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
18a0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
18b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
18c0: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
18d0: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
18e0: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
18f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
1900: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
1910: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
1920: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
1930: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1940: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
1950: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
1960: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
1970: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
1980: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
1990: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
19a0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
19b0: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
19c0: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
19d0: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
19e0: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
19f0: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
1a00: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
1a10: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
1a20: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
1a30: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
1a40: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
1a50: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
1a60: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
1a70: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
1a80: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
1a90: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
1aa0: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
1ab0: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
1ac0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1ad0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
1ae0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1af0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1b00: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
1b10: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
1b20: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
1b30: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
1b40: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
1b50: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
1b80: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1b90: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
1ba0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1bc0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
1bd0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1be0: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
1bf0: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
1c00: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
1c10: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c20: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
1c30: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
1c40: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
1c50: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1c60: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
1c70: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
1c80: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
1c90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
1ca0: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
1cb0: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
1cc0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
1cd0: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
1ce0: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
1cf0: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
1d00: 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69  ht->pTab;..    i
1d10: 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  f( pLeftTab==0 |
1d20: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29  | pRightTab==0 )
1d30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
1d40: 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55  /* When the NATU
1d50: 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70  RAL keyword is p
1d60: 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52  resent, add WHER
1d70: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
1d80: 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
1d90: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
1da0: 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20  two tables have 
1db0: 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a  in common..    *
1dc0: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
1dd0: 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
1de0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
1df0: 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c  if( pLeft->pOn |
1e00: 7c 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20  | pLeft->pUsing 
1e10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e30: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
1e40: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
1e50: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
1e60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1e70: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
1e80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1e90: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
1ea0: 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e  0; j<pLeftTab->n
1eb0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1ec0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1ed0: 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b   pLeftTab->aCol[
1ee0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
1ef0: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
1f00: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
1f10: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1f20: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
1f30: 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62  (zName, pLeftTab
1f40: 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c  , pLeft->zAlias,
1f50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
1f80: 74 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70  t->zAlias, &p->p
1f90: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
1fa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1fb0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
1fc0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1fd0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
1fe0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
1ff0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  */.    if( pLeft
2000: 2d 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e  ->pOn && pLeft->
2010: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2020: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2030: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2040: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2050: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2060: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2070: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2080: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2090: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
20a0: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
20b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
20d0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
20e0: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
20f0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2100: 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a  ( pLeft->pOn ){.
2110: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
2120: 72 28 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20  r(pLeft->pOn);. 
2130: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
2140: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2150: 70 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66 74  p->pWhere, pLeft
2160: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c  ->pOn);.      pL
2170: 65 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  eft->pOn = 0;.  
2180: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2190: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
21a0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
21b0: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
21c0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
21d0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
21e0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
21f0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
2200: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
2210: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
2220: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
2230: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
2240: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
2250: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
2260: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2270: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
2280: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
2290: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
22a0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
22b0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
22c0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
22d0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
22e0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
22f0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
2300: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
2310: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
2320: 65 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  eft->pUsing ){. 
2330: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
2340: 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69  st = pLeft->pUsi
2350: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
2360: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
2370: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2380: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69  har *zName = pLi
2390: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
23a0: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
23b0: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62  mnIndex(pLeftTab
23c0: 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f  , zName)<0 || co
23d0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
23e0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b  Tab, zName)<0 ){
23f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2400: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2410: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
2420: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
2430: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
2440: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2450: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2460: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
2470: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2480: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2490: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
24a0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
24b0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
24c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
24e0: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
24f0: 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65  zAlias, &p->pWhe
2500: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
2530: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
2540: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
2550: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2560: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
2570: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2580: 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a  tDelete(Select *
2590: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
25a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
25b0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
25c0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
25d0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
25e0: 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  ete(p->pSrc);.  
25f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2600: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
2610: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2620: 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42  elete(p->pGroupB
2630: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y);.  sqlite3Exp
2640: 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69  rDelete(p->pHavi
2650: 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ng);.  sqlite3Ex
2660: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2670: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  pOrderBy);.  sql
2680: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
2690: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73  (p->pPrior);.  s
26a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26b0: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73  (p->pLimit);.  s
26c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26d0: 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20  (p->pOffset);.  
26e0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
26f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2700: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2710: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2720: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2730: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2740: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2750: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2760: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2770: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2780: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2790: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
27a0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
27b0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
27c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
27d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
27e0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
27f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2800: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
2810: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
2820: 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79 2d  ecord, pOrderBy-
2830: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71  >nExpr, 0);.  sq
2840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2850: 2c 20 4f 50 5f 53 6f 72 74 49 6e 73 65 72 74 2c  , OP_SortInsert,
2860: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
2870: 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70   Add code to imp
2880: 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45  lement the OFFSE
2890: 54 20 61 6e 64 20 4c 49 4d 49 54 0a 2a 2f 0a 73  T and LIMIT.*/.s
28a0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4c  tatic void codeL
28b0: 69 6d 69 74 65 72 28 0a 20 20 56 64 62 65 20 2a  imiter(.  Vdbe *
28c0: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
28d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
28e0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53  o this VM */.  S
28f0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2900: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2910: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2920: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oded */.  int iC
2930: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a  ontinue,    /* J
2940: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
2950: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
2960: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  ord */.  int iBr
2970: 65 61 6b 2c 20 20 20 20 20 20 20 2f 2a 20 4a 75  eak,       /* Ju
2980: 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64 20 74  mp here to end t
2990: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
29a0: 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20 20 2f   nPop          /
29b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
29c0: 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b 20 77  s to pop stack w
29d0: 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29  hen jumping */.)
29e0: 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73  {.  if( p->iOffs
29f0: 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  et>=0 ){.    int
2a00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2a10: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2a20: 29 20 2b 20 33 3b 0a 20 20 20 20 69 66 28 20 6e  ) + 3;.    if( n
2a30: 50 6f 70 3e 30 20 29 20 61 64 64 72 2b 2b 3b 0a  Pop>0 ) addr++;.
2a40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
2a60: 63 72 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  cr, p->iOffset, 
2a70: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
2a80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
2a90: 66 4d 65 6d 50 6f 73 2c 20 70 2d 3e 69 4f 66 66  fMemPos, p->iOff
2aa0: 73 65 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  set, addr);.    
2ab0: 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20  if( nPop>0 ){.  
2ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
2ae0: 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  nPop, 0);.    }.
2af0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b00: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
2b10: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
2b20: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2b30: 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53  (v, "# skip OFFS
2b40: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
2b50: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d   }.  if( p->iLim
2b60: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
2b70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2b80: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e   OP_MemIncr, p->
2b90: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
2ba0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
2bb0: 28 28 76 2c 20 22 23 20 65 78 69 74 20 77 68 65  ((v, "# exit whe
2bc0: 6e 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  n LIMIT reached"
2bd0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
2be0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2bf0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
2c00: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
2c10: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
2c20: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
2c30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
2c40: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
2c50: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
2c60: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
2c70: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
2c80: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
2c90: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
2ca0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
2cb0: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
2cc0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
2cd0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
2ce0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
2cf0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
2d00: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
2d10: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2d20: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2d30: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2d40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2d50: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
2d60: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2d70: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
2d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d90: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
2da0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2db0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2dc0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2dd0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
2de0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
2df0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
2e00: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
2e10: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
2e20: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
2e30: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
2e40: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
2e50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2e60: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
2e70: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
2e80: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
2e90: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
2ea0: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
2eb0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
2ec0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
2ed0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
2ee0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
2ef0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
2f00: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
2f10: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
2f20: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2f30: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
2f40: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
2f50: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
2f60: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
2f70: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
2f80: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
2f90: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
2fb0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
2fc0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
2fd0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c  */.  int iBreak,
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ff0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
3000: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
3010: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
3020: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
3030: 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74        /* affinit
3040: 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73  y string if eDes
3050: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a  t is SRT_Union *
3060: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
3070: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3080: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
3090: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
30a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
30b0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
30c0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
30d0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
30e0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
30f0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
3100: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
3110: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
3120: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
3130: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
3140: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
3150: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
3160: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
3170: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61  utput..  */.  ha
3180: 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74  sDistinct = dist
3190: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
31a0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
31b0: 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  pr>0;.  if( pOrd
31c0: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
31d0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
31e0: 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c  odeLimiter(v, p,
31f0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65   iContinue, iBre
3200: 61 6b 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ak, 0);.  }..  /
3210: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
3220: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
3230: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
3240: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
3250: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
3260: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
3270: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3280: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
3290: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   i);.    }.  }el
32a0: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20  se{.    nColumn 
32b0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
32c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
32d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
32e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
32f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
3300: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
3310: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3320: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
3330: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
3340: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
3350: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3360: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
3370: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
3380: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
3390: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
33a0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
33b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
33c0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
33d0: 74 69 6e 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c  tinct ){.#if NUL
33e0: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
33f0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  T.    sqlite3Vdb
3400: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
3410: 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45  ull, -pEList->nE
3420: 78 70 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  xpr, sqlite3Vdbe
3430: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37  CurrentAddr(v)+7
3440: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
3450: 20 44 65 6c 69 62 65 72 61 74 65 6c 79 20 6c 65   Deliberately le
3460: 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
3470: 20 73 74 72 69 6e 67 20 6f 66 66 20 6f 66 20 74   string off of t
3480: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
3490: 20 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   ** OP_MakeRecor
34a0: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
34b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
34c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 45 4c 69  MakeRecord, pELi
34d0: 73 74 2d 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20  st->nExpr * -1, 
34e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
34f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
3500: 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63  istinct, distinc
3510: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
3520: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
3530: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3540: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3550: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31   pEList->nExpr+1
3560: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3570: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3580: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3590: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
35a0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
35b0: 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63  p indistinct rec
35c0: 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c  ords"));.    sql
35d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
35e0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 64   OP_IdxInsert, d
35f0: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
3600: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
3610: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4c 69   ){.      codeLi
3620: 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e  miter(v, p, iCon
3630: 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c 20 6e  tinue, iBreak, n
3640: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20  Column);.    }. 
3650: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44   }..  switch( eD
3660: 65 73 74 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  est ){.#ifndef S
3670: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
3680: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 2f  UND_SELECT.    /
3690: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
36a0: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
36b0: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
36c0: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
36d0: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
36e0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
36f0: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
3700: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n: {.      sqlit
3710: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3720: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3730: 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41  olumn, NULL_ALWA
3740: 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20  YS_DISTINCT);.  
3750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3760: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
3770: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
3780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3790: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
37a0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30  Insert, iParm, 0
37b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
37c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
37d0: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
37e0: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
37f0: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
3800: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
3810: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
3820: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
3830: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
3840: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
3850: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
3860: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
3870: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3880: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
3890: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
38a0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
38b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
38c0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
38d0: 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44  n, NULL_ALWAYS_D
38e0: 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20  ISTINCT);.      
38f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3900: 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20  eP3(v, -1, aff, 
3910: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3930: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
3940: 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33  d, iParm, addr+3
3950: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3960: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3970: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30  Delete, iParm, 0
3980: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3990: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
39a0: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
39b0: 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
39c0: 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
39d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
39e0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
39f0: 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61   case SRT_TempTa
3a00: 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ble: {.      sql
3a10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3a20: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3a30: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
3a40: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
3a50: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
3a60: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
3a70: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
3a80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3aa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
3ab0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b  owid, iParm, 0);
3ac0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3ad0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3ae0: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
3af0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3b00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65  AddOp(v, OP_Inse
3b10: 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  rt, iParm, 0);. 
3b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3b30: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
3b40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
3b50: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
3b60: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
3b70: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
3b80: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
3b90: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
3ba0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
3bb0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
3bc0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
3bd0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
3be0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
3bf0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
3c00: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
3c10: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
3c20: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
3c30: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
3c40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
3c50: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
3c60: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
3c70: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
3c80: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
3c90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ca0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
3cb0: 20 2d 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20   -1, addr1+3);. 
3cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3cd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
3ce0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   1, 0);.      ad
3cf0: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3d00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3d10: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 0, 0);.      
3d20: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
3d30: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
3d40: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
3d50: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
3d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d70: 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69 50    char aff = (iP
3d80: 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20  arm>>16)&0xFF;. 
3d90: 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
3da0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
3db0: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
3dc0: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
3dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3de0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
3df0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
3e00: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 1);.        s
3e10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3e20: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
3e30: 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46   (iParm&0x0000FF
3e40: 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  FF), 0);.      }
3e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3e60: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
3e70: 64 72 32 2c 20 73 71 6c 69 74 65 33 56 64 62 65  dr2, sqlite3Vdbe
3e80: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
3e90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ea0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
3eb0: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
3ec0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
3ed0: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
3ee0: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
3ef0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
3f00: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
3f10: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
3f20: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
3f30: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
3f40: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
3f50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
3f60: 69 73 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53  ists:.    case S
3f70: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
3f80: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
3f90: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
3fa0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
3fb0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
3fc0: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
3fd0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
3fe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
3ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4000: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
4010: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
4020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4030: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4040: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
4050: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4060: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
4070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4080: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
4090: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65  .    /* Send the
40a0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c   data to the cal
40b0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a  lback function..
40c0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
40d0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
40e0: 20 20 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65    case SRT_Sorte
40f0: 72 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r: {.      if( p
4100: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4120: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
4130: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
4140: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
4150: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4160: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
4170: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4180: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4190: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
41a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
41b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
41c0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
41d0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
41e0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
41f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
4200: 6f 6b 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  oke a subroutine
4210: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 72   to handle the r
4220: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 73 75 62  esults.  The sub
4230: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 0a 20  routine itself. 
4240: 20 20 20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73     ** is respons
4250: 69 62 6c 65 20 66 6f 72 20 70 6f 70 70 69 6e 67  ible for popping
4260: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 66   the results off
4270: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
4280: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4290: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
42a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
42b0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
42c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
42d0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
42e0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
42f0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4300: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
4310: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
4320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4340: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
4350: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
4360: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4370: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
4380: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
4390: 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
43a0: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
43b0: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
43c0: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
43d0: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
43e0: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
43f0: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
4400: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
4410: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
4420: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
4430: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
4440: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
4450: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
4460: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
4470: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
4480: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
4490: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
44a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
44b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
44c0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
44d0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
44e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
44f0: 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  _Pop, nColumn, 0
4500: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4510: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
4520: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4530: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
4540: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
4550: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
4560: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
4570: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
4580: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
4590: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
45a0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
45b0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
45c0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
45d0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
45e0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
45f0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
4600: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
4610: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
4620: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
4630: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
4640: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
4650: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
4660: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
4670: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
4680: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
4690: 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68   *p,       /* Th
46a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
46b0: 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c  nt */.  Vdbe *v,
46c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
46d0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
46e0: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
46f0: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t nColumn,     /
4700: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4710: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
4720: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
4730: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
4740: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
4750: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  re */.  int iPar
4760: 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69  m        /* Opti
4770: 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61  onal parameter a
4780: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
4790: 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Dest */.){.  int
47a0: 20 65 6e 64 31 20 3d 20 73 71 6c 69 74 65 33 56   end1 = sqlite3V
47b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
47c0: 0a 20 20 69 6e 74 20 65 6e 64 32 20 3d 20 73 71  .  int end2 = sq
47d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
47e0: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
47f0: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
4800: 6e 66 6f 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  nfo;.  ExprList 
4810: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  *pOrderBy;.  int
4820: 20 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73 71 6c 69   nCol, i;.  sqli
4830: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4840: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65 44 65  ->db;..  if( eDe
4850: 73 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29  st==SRT_Sorter )
4860: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72 64 65   return;.  pOrde
4870: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
4880: 79 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f 72 64  y;.  nCol = pOrd
4890: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  erBy->nExpr;.  p
48a0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Info = sqliteMal
48b0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  loc( sizeof(*pIn
48c0: 66 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69 7a 65  fo) + nCol*(size
48d0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20  of(CollSeq*)+1) 
48e0: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d  );.  if( pInfo==
48f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49  0 ) return;.  pI
4900: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
4910: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 66 6f 2d  = (char*)&pInfo-
4920: 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  >aColl[nCol];.  
4930: 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  pInfo->nField = 
4940: 6e 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nCol;.  for(i=0;
4950: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
4960: 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 6c 61     /* If a colla
4970: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61  tion sequence wa
4980: 73 20 73 70 65 63 69 66 69 65 64 20 65 78 70 6c  s specified expl
4990: 69 63 69 74 79 2c 20 74 68 65 6e 20 69 74 0a 20  icity, then it. 
49a0: 20 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64 20     ** is stored 
49b0: 69 6e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  in pOrderBy->a[i
49c0: 5d 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65 72 77 69  ].zName. Otherwi
49d0: 73 65 2c 20 75 73 65 20 74 68 65 20 64 65 66 61  se, use the defa
49e0: 75 6c 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  ult.    ** colla
49f0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 74 68  tion type for th
4a00: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  e expression..  
4a10: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
4a20: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
4a30: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
4a40: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
4a50: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
4a60: 20 69 66 28 20 21 70 49 6e 66 6f 2d 3e 61 43 6f   if( !pInfo->aCo
4a70: 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70  ll[i] ){.      p
4a80: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
4a90: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
4aa0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
4ab0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
4ac0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
4ad0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  sortOrder;.  }. 
4ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
4af0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30  v, OP_Sort, 0, 0
4b00: 2c 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20  , (char*)pInfo, 
4b10: 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
4b20: 46 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  FF);.  addr = sq
4b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4b40: 2c 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30  , OP_SortNext, 0
4b50: 2c 20 65 6e 64 31 29 3b 0a 20 20 63 6f 64 65 4c  , end1);.  codeL
4b60: 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 61 64 64  imiter(v, p, add
4b70: 72 2c 20 65 6e 64 32 2c 20 31 29 3b 0a 20 20 73  r, end2, 1);.  s
4b80: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
4b90: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
4ba0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
4bb0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
4bc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4bd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  ddOp(v, OP_NewRo
4be0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  wid, iParm, 0);.
4bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4c00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
4c10: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
4c20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c30: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
4c40: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
4c60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4c70: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
4c80: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
4c90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4ca0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4cb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4cc0: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
4cd0: 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -1, sqlite3VdbeC
4ce0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4cf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4d00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4d10: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
4d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d30: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
4d40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4d50: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4d60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d70: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
4d80: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c  cord, 1, 0, "n",
4d90: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4da0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4db0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
4dc0: 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30  ert, (iParm&0x00
4dd0: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
4de0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4df0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
4e00: 73 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52  sts:.    case SR
4e10: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
4e20: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4e30: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4e40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4e50: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72  P_MemStore, iPar
4e60: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 1);.      sql
4e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4e80: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64   OP_Goto, 0, end
4e90: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
4ea0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4eb0: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4ec0: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
4ed0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
4ee0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
4ef0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f00: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
4f10: 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  r, p->pEList->nE
4f20: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
4f30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f40: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
4f50: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
4f60: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
4f70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4f80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4f90: 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20  P_Column, -1-i, 
4fa0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
4fb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
4fc0: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
4fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4fe0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
4ff0: 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  back, nColumn, 0
5000: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5020: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
5030: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
5040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5060: 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29  v, OP_Pop, 2, 0)
5070: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5080: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
5090: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
50a0: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
50b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
50c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
50d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
50e0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
50f0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5100: 61 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20  abel(v, end2);. 
5110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5120: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
5130: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
5140: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
5150: 20 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65   end1);.  sqlite
5160: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5170: 5f 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30  _SortReset, 0, 0
5180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5190: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
51a0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
51b0: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
51c0: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
51d0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
51e0: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
51f0: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
5200: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
5210: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
5220: 49 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  If the declarati
5230: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
5240: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
5250: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
5260: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f  ed from.** the o
5270: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
5280: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
5290: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
52a0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a   is a column..**
52b0: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
52c0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
52e0: 69 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45  ither TEXT, NUME
52f0: 52 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54  RIC or ANY..** T
5300: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
5310: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
5320: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
5330: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
5340: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
5350: 70 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  pe(NameContext *
5360: 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
5370: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
5380: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b  *zType;.  int j;
5390: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
53a0: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
53b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
53c0: 0a 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20  .  /* The TK_AS 
53d0: 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c  operator can onl
53e0: 79 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52  y occur in ORDER
53f0: 20 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48   BY, GROUP BY, H
5400: 41 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20  AVING,.  ** and 
5410: 4c 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20  LIMIT clauses.  
5420: 42 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e  But pExpr origin
5430: 61 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ates in the resu
5440: 6c 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a  lt set of a.  **
5450: 20 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78   SELECT.  So pEx
5460: 70 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e  pr can never con
5470: 74 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61  tain an AS opera
5480: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  tor..  */.  asse
5490: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
54a0: 4b 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63  K_AS );..  switc
54b0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
54c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
54d0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c  MN: {.      Tabl
54e0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  e *pTab = 0;.   
54f0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
5500: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
5510: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
5520: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
5530: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
5540: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
5550: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
5560: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
5570: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
5580: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
5590: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
55a0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
55b0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
55c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
55d0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
55e0: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
55f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5600: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
5610: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
5620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5630: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
5640: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
5650: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
5660: 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79   can occurs if y
5670: 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  ou have somethin
5680: 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e  g like "SELECT n
5690: 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20  ew.x;" inside.  
56a0: 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
56b0: 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  er.  In other wo
56c0: 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65  rds, if you refe
56d0: 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61  rence the specia
56e0: 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20  l "new".        
56f0: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ** table in the 
5700: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
5710: 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e  select.  We do n
5720: 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77  ot have a good w
5730: 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ay.        ** to
5740: 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c   find the actual
5750: 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20   table type, so 
5760: 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20  call it "TEXT". 
5770: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a   This is really.
5780: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74          ** somet
5790: 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62  hing of a bug, b
57a0: 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  ut I do not know
57b0: 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a   how to fix it..
57c0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
57d0: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
57e0: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65  does not produce
57f0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
5800: 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72  wer - it just pr
5810: 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
5820: 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53  * a segfault.  S
5830: 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e  ee ticket #1229.
5840: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5850: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
5860: 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  T";.        brea
5870: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5880: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b   assert( pTab );
5890: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
58a0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
58b0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
58c0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
58d0: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
58e0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
58f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
5900: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54  <0 ){.        zT
5910: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
5920: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5930: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
5940: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5950: 54 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Type;.      }.  
5960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5980: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5990: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
59a0: 3a 20 7b 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f  : {.      NameCo
59b0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
59c0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
59d0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
59e0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
59f0: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
5a00: 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  t->pSrc;.      s
5a10: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
5a20: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
5a30: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
5a40: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
5a50: 70 45 78 70 72 29 3b 20 0a 20 20 20 20 20 20 62  pExpr); .      b
5a60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
5a70: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
5a80: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b        zType = 0;
5a90: 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
5aa0: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
5ab0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5ac0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
5ad0: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
5ae0: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
5af0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
5b00: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
5b10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
5b20: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
5b30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5b40: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
5b50: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
5b60: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5b70: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
5b80: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
5b90: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
5ba0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
5bb0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
5bc0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
5bd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5be0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
5bf0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
5c00: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
5c10: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 66   = pTabList;.  f
5c20: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
5c30: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
5c40: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
5c50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
5c60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5c70: 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54  *zType = columnT
5c80: 79 70 65 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20  ype(&sNC, p);.  
5c90: 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29    if( zType==0 )
5ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f   continue;.    /
5cb0: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
5cc0: 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f  make it's own co
5cd0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
5ce0: 2d 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74  -type, in case t
5cf0: 68 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d  he .    ** schem
5d00: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
5d10: 65 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  e this virtual m
5d20: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
5d30: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
5d40: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
5d50: 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d  ame(v, i+pEList-
5d60: 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20 73  >nExpr, zType, s
5d70: 74 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20  trlen(zType));. 
5d80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
5d90: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
5da0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
5db0: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
5dc0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
5dd0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
5de0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
5df0: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
5e00: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
5e10: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
5e20: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
5e30: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
5e40: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
5e50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5e60: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
5e70: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
5e80: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
5e90: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
5ea0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
5eb0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
5ec0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
5ed0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5ee0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5ef0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5f00: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
5f10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5f20: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
5f30: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
5f40: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
5f50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
5f60: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
5f70: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
5f80: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
5f90: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
5fa0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
5fb0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
5fc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
5fd0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
5fe0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
5ff0: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   v==0 || sqlite3
6000: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
6010: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
6020: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
6030: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
6040: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
6050: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
6060: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
6070: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
6080: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
6090: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
60a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
60b0: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
60c0: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
60d0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
60e0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
60f0: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
6100: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6110: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  pr;.    if( p==0
6120: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6130: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
6140: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
6150: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
6160: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
6170: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
6180: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
6190: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  , i, zName, strl
61a0: 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  en(zName));.    
61b0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
61c0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  }.    if( p->op=
61d0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54  =TK_COLUMN && pT
61e0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
61f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
6200: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
6210: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
6220: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
6230: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
6240: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
6250: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
6260: 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65  ursor!=p->iTable
6270: 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61  ; j++){}.      a
6280: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
6290: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
62a0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
62b0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
62c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
62d0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
62e0: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
62f0: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
6300: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
6310: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
6320: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
6330: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
6340: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
6350: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
6360: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
6370: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
6380: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6390: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
63a0: 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e  fullNames && p->
63b0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
63c0: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
63d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
63e0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d  ColName(v, i, p-
63f0: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
6400: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .n);.      }else
6410: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
6420: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
6430: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
6440: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
6450: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
6460: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6470: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
6480: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
6490: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
64a0: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
64b0: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
64c0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
64d0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
64e0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
64f0: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
6500: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
6510: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
6520: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61  olName(v, i, zNa
6530: 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  me, P3_DYNAMIC);
6540: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6560: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6570: 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a  , zCol, strlen(z
6580: 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col));.      }. 
6590: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
65a0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
65b0: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
65c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
65d0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73  lName(v, i, p->s
65e0: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
65f0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
6600: 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53  te3VdbeCompressS
6610: 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a  pace(v, addr); *
6620: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
6630: 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30     char zName[30
6640: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
6650: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
6660: 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30  N || pTabList==0
6670: 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   );.      sprint
6680: 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  f(zName, "column
6690: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
66a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
66b0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61  olName(v, i, zNa
66c0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
66d0: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
66e0: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
66f0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
6700: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
6710: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6720: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
6730: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
6740: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
6750: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
6760: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
6770: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6780: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
6790: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
67a0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
67b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
67c0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
67d0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
67e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
67f0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
6800: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
6810: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
6820: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
6830: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
6840: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
6850: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
6860: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
6870: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
6880: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
6890: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
68a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
68b0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
68c0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
68d0: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
68e0: 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20  ectStmt(Parse*, 
68f0: 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Select*);../*.**
6900: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
6910: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
6920: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
6930: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
6940: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
6950: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
6960: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
6970: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
6980: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
6990: 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a  *pParse, char *z
69a0: 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20  TabName, Select 
69b0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
69c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
69d0: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
69e0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75   *pEList;.  Colu
69f0: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
6a00: 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ..  if( prepSele
6a10: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
6a20: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
6a30: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
6a40: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
6a50: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
6a60: 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20  pSelect, 0) ){. 
6a70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6a80: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
6a90: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
6aa0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
6ab0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
6ac0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
6ad0: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
6ae0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54  pTab->zName = zT
6af0: 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53  abName ? sqliteS
6b00: 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20  trDup(zTabName) 
6b10: 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  : 0;.  pEList = 
6b20: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
6b30: 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  .  pTab->nCol = 
6b40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
6b50: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
6b60: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d  Col>0 );.  pTab-
6b70: 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73  >aCol = aCol = s
6b80: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
6b90: 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30  eof(pTab->aCol[0
6ba0: 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ])*pTab->nCol );
6bb0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
6bc0: 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  =aCol; i<pTab->n
6bd0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
6be0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20  ){.    Expr *p, 
6bf0: 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  *pR;.    char *z
6c00: 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Type;.    char *
6c10: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  zName;.    char 
6c20: 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20 20 20  *zBasename;.    
6c30: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d  int cnt;.    Nam
6c40: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
6c50: 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e    .    /* Get an
6c60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
6c70: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
6c80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
6c90: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6ca0: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
6cb0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
6cc0: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
6cd0: 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  .z==0 || p->pRig
6ce0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d  ht->token.z[0]!=
6cf0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
6d00: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
6d10: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
6d20: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
6d30: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
6d40: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
6d50: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
6d60: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
6d70: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
6d80: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61 6d  qliteStrDup(zNam
6d90: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
6da0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
6db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
6dc0: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
6dd0: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
6de0: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
6df0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
6e00: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   For columns of 
6e10: 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65  the from A.B use
6e20: 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a   B as the name *
6e30: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
6e40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
6e50: 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29  %T", &pR->token)
6e60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6e70: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
6e80: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
6e90: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
6ea0: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
6eb0: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
6ec0: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
6ed0: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
6ee0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
6ef0: 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29  ("%T", &p->span)
6f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6f10: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73     /* If all els
6f20: 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70  e fails, make up
6f30: 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20   a name */.     
6f40: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6f50: 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25  MPrintf("column%
6f60: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  d", i+1);.    }.
6f70: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6f80: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  te(zName);.    i
6f90: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
6fa0: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
6fb0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
6fc0: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
6fd0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
6fe0: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65   pTab);.      re
6ff0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
7000: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
7010: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
7020: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
7030: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
7040: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
7050: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
7060: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
7070: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
7080: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
7090: 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61   zBasename = zNa
70a0: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  me;.    for(j=cn
70b0: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
70c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
70d0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
70e0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
70f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61  0 ){.        zNa
7100: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
7110: 6e 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61  ntf("%s:%d", zBa
7120: 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a  sename, ++cnt);.
7130: 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
7140: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
7150: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e==0 ) break;.  
7160: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7170: 69 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a  if( zBasename!=z
7180: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
7190: 6c 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e 61  liteFree(zBasena
71a0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
71b0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
71c0: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  me;..    /* Get 
71d0: 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79  the typename, ty
71e0: 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64  pe affinity, and
71f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7200: 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  nce for the.    
7210: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a  ** column..    *
7220: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
7230: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
7240: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  ));.    sNC.pSrc
7250: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
7260: 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20  pSrc;.    zType 
7270: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63  = sqliteStrDup(c
7280: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
7290: 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  p));.    pCol->z
72a0: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
72b0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
72c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
72d0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70  finity(p);.    p
72e0: 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  Col->pColl = sql
72f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
7300: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
7310: 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  if( !pCol->pColl
7320: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
7330: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
7340: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
7350: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
7360: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72  >iPKey = -1;.  r
7370: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
7380: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53  *.** Prepare a S
7390: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
73a0: 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62  for processing b
73b0: 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c  y doing the foll
73c0: 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a  owing.** things:
73d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
73e0: 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
73f0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
7400: 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
7410: 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
7420: 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
7430: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
7440: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
7450: 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
7460: 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
7470: 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
7480: 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
7490: 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
74a0: 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
74b0: 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
74c0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
74d0: 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
74e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
74f0: 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
7500: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
7510: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
7520: 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
7530: 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
7540: 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
7550: 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
7560: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
7570: 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
7580: 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
7590: 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
75a0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
75b0: 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
75c0: 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
75d0: 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
75e0: 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65  presistent repre
75f0: 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
7600: 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
7610: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
7620: 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
7630: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
7640: 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20   accomodate the 
7650: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
7660: 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
7670: 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
7680: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
7690: 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
76a0: 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
76b0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
76c0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
76d0: 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
76e0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
76f0: 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
7700: 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
7710: 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
7720: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
7730: 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
7740: 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
7750: 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
7760: 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
7770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
7780: 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
7790: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
77a0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  BLE..**.** Retur
77b0: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  n 0 on success. 
77c0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
77d0: 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e  oblems, leave an
77e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
77f0: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
7800: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
7810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7820: 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61  repSelectStmt(Pa
7830: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
7840: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
7850: 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72  , j, k, rc;.  Sr
7860: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
7870: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
7880: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
7890: 61 62 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  ab;.  struct Src
78a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
78b0: 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  ;..  if( p==0 ||
78c0: 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73   p->pSrc==0 || s
78d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
78e0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
78f0: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
7900: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
7910: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
7920: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
7930: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
7940: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
7950: 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
7960: 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
7970: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
7980: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
7990: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
79a0: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
79b0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
79c0: 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  c);..  /* Look u
79d0: 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
79e0: 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
79f0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
7a00: 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
7a10: 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
7a20: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
7a30: 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
7a40: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
7a50: 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
7a60: 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
7a70: 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
7a80: 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
7a90: 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
7aa0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
7ab0: 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
7ac0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
7ad0: 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
7ae0: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
7af0: 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
7b00: 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
7b10: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
7b20: 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
7b30: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
7b40: 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
7b50: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
7b60: 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
7b70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7b80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
7b90: 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
7ba0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7bb0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
7bc0: 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
7bd0: 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
7be0: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
7bf0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
7c00: 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
7c10: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
7c20: 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d  ( pFrom->zAlias=
7c30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
7c40: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20  rom->zAlias =.  
7c50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
7c60: 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73  Printf("sqlite_s
7c70: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
7c80: 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c  oid*)pFrom->pSel
7c90: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
7ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
7cb0: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
7cc0: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
7cd0: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
7ce0: 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53    sqlite3ResultS
7cf0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
7d00: 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  e, pFrom->zAlias
7d10: 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
7d20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
7d30: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
7d40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7d50: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
7d60: 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20  sTransient flag 
7d70: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
7d80: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
7d90: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
7da0: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
7db0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
7dc0: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
7dd0: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
7de0: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
7df0: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
7e00: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
7e10: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
7e20: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
7e30: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
7e40: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
7e50: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
7e60: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
7e70: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
7e80: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
7e90: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
7ea0: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
7eb0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
7ec0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
7ed0: 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
7ee0: 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
7ef0: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
7f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
7f10: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
7f20: 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72  pFrom->zName,pFr
7f30: 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om->zDatabase);.
7f40: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7f50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
7f60: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7f70: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
7f80: 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
7f90: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
7fa0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
7fb0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
7fc0: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
7fd0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
7fe0: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
7ff0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
8000: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
8010: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
8020: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
8030: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8040: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
8050: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f        /* If pFro
8060: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  m->pSelect!=0 it
8070: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
8080: 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
8090: 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
80a0: 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
80b0: 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
80c0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
80d0: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
80e0: 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
80f0: 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
8100: 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
8110: 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
8120: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
8130: 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
8140: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  /.        if( pF
8150: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
8160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  ){.          pFr
8170: 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
8180: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
8190: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
81a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
81b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
81c0: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
81d0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
81e0: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
81f0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
8200: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
8210: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
8220: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
8230: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
8240: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
8250: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
8260: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
8270: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
8280: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
8290: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
82a0: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
82b0: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
82c0: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
82d0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
82e0: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
82f0: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
8300: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
8310: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
8320: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
8330: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
8340: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
8350: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
8360: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8370: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
8380: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
8390: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
83a0: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
83b0: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
83c0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
83d0: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
83e0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
83f0: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
8400: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
8410: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
8420: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
8430: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
8440: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
8450: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
8460: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
8470: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
8480: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
8490: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
84a0: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
84b0: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
84c0: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
84d0: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
84e0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
84f0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
8500: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
8510: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
8520: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
8530: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
8540: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
8550: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
8560: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
8570: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
8580: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
8590: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
85a0: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
85b0: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
85c0: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
85d0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
85e0: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
85f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
8600: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
8610: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
8620: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
8630: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
8640: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
8650: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
8660: 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
8670: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
8680: 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
8690: 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
86a0: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
86b0: 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20  lNames)!=0 &&.  
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c      (flags & SQL
86e0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
86f0: 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
8700: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
8710: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
8720: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
8730: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
8740: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
8750: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
8760: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
8770: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
8780: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
8790: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
87a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
87b0: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
87c0: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
87d0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
87e0: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
87f0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
8800: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
8810: 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  nd(pNew, a[k].pE
8820: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
8830: 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
8840: 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
8850: 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
8860: 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
8870: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
8880: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
8890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
88a0: 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
88b0: 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
88c0: 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
88d0: 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
88e0: 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
88f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
8900: 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
8910: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
8920: 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
8930: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
8940: 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
8950: 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
8960: 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
8970: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
8980: 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
8990: 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
89a0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
89b0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
89c0: 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74  Token(&pE->pLeft
89d0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
89e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
89f0: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
8a00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8a10: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
8a20: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
8a30: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
8a40: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
8a50: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
8a60: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
8a70: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
8a80: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
8a90: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
8aa0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
8ab0: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
8ac0: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
8ad0: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
8ae0: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
8af0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8b00: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
8b10: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
8b20: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
8b30: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
8b40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8b50: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
8b60: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
8b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
8b80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8b90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
8ba0: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
8bb0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8bc0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
8bd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
8be0: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65  xpr *pExpr, *pLe
8bf0: 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  ft, *pRight;.   
8c00: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
8c10: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
8c20: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
8c30: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
8c40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8c50: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
8c60: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
8c70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
8c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8c90: 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e  if( (pLeft->join
8ca0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
8cb0: 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
8ce0: 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29  ft->pTab, zName)
8cf0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
8d00: 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
8d10: 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
8d20: 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
8d30: 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
8d50: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
8d60: 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ht */.          
8d70: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8da0: 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
8db0: 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73 69  ndex(pLeft->pUsi
8dc0: 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
8dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8de0: 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
8df0: 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
8e00: 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
8e10: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
8e20: 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
8e30: 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
8e40: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
8e50: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
8e60: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
8e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8e90: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
8ea0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
8eb0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
8ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8ed0: 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
8ee0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
8ef0: 73 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74  setToken(&pRight
8f00: 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b  ->token, zName);
8f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8f20: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f   zTabName && (lo
8f30: 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
8f40: 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a  ist->nSrc>1) ){.
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
8f60: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
8f70: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
8f80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8f90: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
8fa0: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65  Expr(TK_DOT, pLe
8fb0: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8fd0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
8fe0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
8ff0: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66    setToken(&pLef
9000: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
9010: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
9020: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
9030: 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65  pr->span, sqlite
9040: 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22  3MPrintf("%s.%s"
9050: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
9060: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
9070: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
9080: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
9090: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
90a0: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
90b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
90c0: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
90d0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
90e0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
9100: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
9110: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
9120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9130: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
9140: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
9150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9160: 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
9170: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
9180: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
9190: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
91a0: 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70  (pNew, pExpr, &p
91b0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
91c0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
91e0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
91f0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
9200: 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d   pExpr, &pRight-
9210: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
9220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9240: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
9250: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
9260: 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
9270: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9280: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9290: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
92a0: 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
92b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
92c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
92d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
92e0: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
92f0: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
9300: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9310: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
9320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9330: 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29  liteFree(zTName)
9340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9350: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
9360: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
9370: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
9380: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
9390: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
93a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
93b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
93c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
93d0: 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65  ine associates e
93e0: 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44  ntries in an ORD
93f0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
9400: 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f   list with.** co
9410: 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c  lumns in a resul
9420: 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44  t.  For each ORD
9430: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
9440: 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a  , the opcode of.
9450: 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ** the top-level
9460: 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64   node is changed
9470: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e   to TK_COLUMN an
9480: 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61  d the iColumn va
9490: 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f  lue of.** the to
94a0: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
94b0: 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63  filled in with c
94c0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64  olumn number and
94d0: 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76   the iTable.** v
94e0: 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d  alue of the top-
94f0: 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69  level node is fi
9500: 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65  lled with iTable
9510: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
9520: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70  * If there are p
9530: 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75  rior SELECT clau
9540: 73 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72  ses, they are pr
9550: 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20  ocessed first.  
9560: 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e  A match.** in an
9570: 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20   earlier SELECT 
9580: 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65  takes precedence
9590: 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45   over a later SE
95a0: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  LECT..**.** Any 
95b0: 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20  entry that does 
95c0: 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61  not match is fla
95d0: 67 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72  gged as an error
95e0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
95f0: 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65   of errors is re
9600: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9610: 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72  c int matchOrder
9620: 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  byToColumn(.  Pa
9630: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9640: 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65        /* A place
9650: 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20   to leave error 
9660: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65  messages */.  Se
9670: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
9680: 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
9690: 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  o result columns
96a0: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
96b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
96c0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
96d0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c  The ORDER BY val
96e0: 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61  ues to match aga
96f0: 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  inst columns */.
9700: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
9710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
9720: 65 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69  ert this value i
9730: 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  n iTable */.  in
9740: 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20  t mustComplete  
9750: 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45        /* If TRUE
9760: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d   all ORDER BYs m
9770: 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a  ust match */.){.
9780: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
9790: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
97a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
97b0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d  .  if( pSelect==
97c0: 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 || pOrderBy==0
97d0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
97e0: 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  f( mustComplete 
97f0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
9800: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
9810: 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42  r; i++){ pOrderB
9820: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
9830: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ; }.  }.  if( pr
9840: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
9850: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  rse, pSelect) ){
9860: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
9870: 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74   }.  if( pSelect
9880: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
9890: 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79  if( matchOrderby
98a0: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
98b0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
98c0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  , pOrderBy, iTab
98d0: 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  le, 0) ){.      
98e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
98f0: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
9900: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
9910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
9920: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9930: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
9940: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
9950: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  ].pExpr;.    int
9960: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
9970: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
9980: 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  i].done ) contin
9990: 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
99a0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
99b0: 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20  (pE, &iCol) ){. 
99c0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30       if( iCol<=0
99d0: 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
99e0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
99f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9a00: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
9a10: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f      "ORDER BY po
9a20: 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64  sition %d should
9a30: 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e   be between 1 an
9a40: 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
9a50: 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
9a60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  Expr);.        n
9a70: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  Err++;.        b
9a80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9a90: 20 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d      if( !mustCom
9aa0: 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65  plete ) continue
9ab0: 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a  ;.      iCol--;.
9ac0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d      }.    for(j=
9ad0: 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70  0; iCol<0 && j<p
9ae0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
9af0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
9b00: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
9b10: 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   && (pE->op==TK_
9b20: 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b  ID || pE->op==TK
9b30: 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20  _STRING) ){.    
9b40: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c      char *zName,
9b50: 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20   *zLabel;.      
9b60: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
9b70: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
9b80: 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73        zLabel = s
9b90: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
9ba0: 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b  ken(&pE->token);
9bb0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9bc0: 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20   zLabel!=0 );.  
9bd0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9be0: 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
9bf0: 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20  zLabel)==0 ){ . 
9c00: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
9c10: 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  j;.        }.   
9c20: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
9c30: 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d  zLabel);.      }
9c40: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9c50: 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
9c60: 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69  Compare(pE, pELi
9c70: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20  st->a[j].pExpr) 
9c80: 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20  ){.        iCol 
9c90: 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = j;.      }.   
9ca0: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
9cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e  =0 ){.      pE->
9cc0: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
9cd0: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
9ce0: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
9cf0: 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pE->iTable = iTa
9d00: 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  ble;.      pE->i
9d10: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Agg = -1;.      
9d20: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
9d30: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  one = 1;.    }. 
9d40: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
9d50: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b   mustComplete ){
9d60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9d70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
9d80: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
9d90: 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20   term number %d 
9da0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
9db0: 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
9dc0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e  ", i+1);.      n
9dd0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65  Err++;.      bre
9de0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
9df0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
9e00: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
9e10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9e20: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
9e30: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  /../*.** Get a V
9e40: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
9e50: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
9e60: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
9e70: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
9e80: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
9e90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
9ea0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
9eb0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
9ec0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
9ed0: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
9ee0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
9ef0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9f00: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
9f10: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
9f20: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
9f30: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
9f40: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
9f50: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f    return v;.}../
9f60: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9f70: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
9f80: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
9f90: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
9fa0: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
9fb0: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
9fc0: 65 73 73 69 6f 6e 73 2e 20 20 6e 4c 69 6d 69 74  essions.  nLimit
9fd0: 20 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c   and nOffset hol
9fe0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
9ff0: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
a000: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
a010: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
a020: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
a030: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
a040: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
a050: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
a060: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
a070: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
a080: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
a090: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
a0a0: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
a0b0: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
a0c0: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
a0d0: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
a0e0: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
a0f0: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
a100: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
a110: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
a120: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
a130: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
a140: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
a150: 68 65 20 76 61 6c 75 65 73 20 69 66 20 69 4c 69  he values if iLi
a160: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
a170: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
a180: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
a190: 64 65 66 69 6e 65 64 20 62 79 20 6e 4c 69 6d 69  defined by nLimi
a1a0: 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e 20 20  t and nOffset.  
a1b0: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
a1c0: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
a1d0: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
a1e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
a1f0: 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28  ault values.** (
a200: 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20  usually but not 
a210: 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72  always -1) prior
a220: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
a230: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c   routine..** Onl
a240: 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f  y if nLimit>=0 o
a250: 72 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f 20 74  r nOffset>0 do t
a260: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
a270: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
a280: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
a290: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
a2a0: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
a2b0: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
a2c0: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
a2d0: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
a2e0: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
a2f0: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
a300: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a310: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
a320: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
a330: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
a340: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
a350: 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ){.  /* .  ** "L
a360: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
a370: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
a380: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
a390: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
a3a0: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
a3b0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
a3c0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
a3d0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
a3e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
a3f0: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
a400: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
a410: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
a420: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
a430: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
a440: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
a450: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
a460: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a470: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
a480: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
a490: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
a4a0: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  arse, p->pLimit)
a4b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a4c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
a4d0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
a4e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a4f0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69  dOp(v, OP_Negati
a500: 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ve, 0, 0);.    s
a510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a520: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
a530: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64  iMem, 1);.    Vd
a540: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
a550: 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29   LIMIT counter")
a560: 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  );.    p->iLimit
a570: 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69   = iMem;.  }.  i
a580: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
a590: 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
a5a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
a5b0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
a5c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
a5d0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
a5e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a5f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a600: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
a610: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
a620: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a630: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
a640: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a650: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
a660: 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20  gative, 0, 0);. 
a670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a680: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
a690: 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  re, iMem, 1);.  
a6a0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
a6b0: 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e  , "# OFFSET coun
a6c0: 74 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69  ter"));.    p->i
a6d0: 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20  Offset = iMem;. 
a6e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
a6f0: 72 61 74 65 20 56 44 42 45 20 69 6e 73 74 72 75  rate VDBE instru
a700: 63 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c 6c  ctions that will
a710: 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e   open a transien
a720: 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20  t table that.** 
a730: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
a740: 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f 20   an index or to 
a750: 73 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73 75  store keyed resu
a760: 6c 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  lts for a compou
a770: 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20 49  nd.** select.  I
a780: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f  n other words, o
a790: 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20  pen a transient 
a7a0: 74 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64 73  table that needs
a7b0: 20 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74   a.** KeyInfo st
a7c0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e 75  ructure.  The nu
a7d0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a7e0: 69 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 69  in the KeyInfo i
a7f0: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
a800: 62 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  by the result se
a810: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
a820: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
a830: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a840: 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69 63  ..**.** Specific
a850: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
a860: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a870: 6f 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74 61  open an index ta
a880: 62 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54 49  ble for.** DISTI
a890: 4e 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54 45  NCT, UNION, INTE
a8a0: 52 53 45 43 54 20 61 6e 64 20 45 58 43 45 50 54  RSECT and EXCEPT
a8b0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
a8c0: 74 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a 20  ts (but not .** 
a8d0: 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a 2a  UNION ALL)..**.*
a8e0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a8f0: 72 6e 65 64 20 69 73 20 74 68 65 20 61 64 64 72  rned is the addr
a900: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 70  ess of the OP_Op
a910: 65 6e 54 65 6d 70 20 69 6e 73 74 72 75 63 74 69  enTemp instructi
a920: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
a930: 74 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65 78 28  t openTempIndex(
a940: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a950: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 54  elect *p, int iT
a960: 61 62 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ab){.  KeyInfo *
a970: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74 20  pKeyInfo;.  int 
a980: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 73 71 6c 69 74  nColumn;.  sqlit
a990: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a9a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
a9b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a9c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 61  ->pVdbe;.  int a
a9d0: 64 64 72 3b 0a 0a 20 20 69 66 28 20 70 72 65 70  ddr;..  if( prep
a9e0: 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
a9f0: 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
aa00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 6f  urn 0;.  }.  nCo
aa10: 6c 75 6d 6e 20 3d 20 70 2d 3e 70 45 4c 69 73 74  lumn = p->pEList
aa20: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4b 65 79 49  ->nExpr;.  pKeyI
aa30: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
aa40: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  oc( sizeof(*pKey
aa50: 49 6e 66 6f 29 2b 6e 43 6f 6c 75 6d 6e 2a 73 69  Info)+nColumn*si
aa60: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 29  zeof(CollSeq*) )
aa70: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
aa80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
aa90: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
aaa0: 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 70 4b 65  = db->enc;.  pKe
aab0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  yInfo->nField = 
aac0: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 66 6f 72 28 69  nColumn;.  for(i
aad0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
aae0: 2b 2b 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e 66  ++){.    pKeyInf
aaf0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
ab00: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
ab10: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
ab20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
ab30: 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
ab40: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
ab50: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
ab60: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70  aColl[i] = db->p
ab70: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
ab80: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 73 71 6c    }.  addr = sql
ab90: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
aba0: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 54 61 62  P_OpenTemp, iTab
abb0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 28 63 68 61  , 0, .      (cha
abc0: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
abd0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
abe0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
abf0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ac00: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
ac10: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 41 64  _SELECT./*.** Ad
ac20: 64 20 74 68 65 20 61 64 64 72 65 73 73 20 22 61  d the address "a
ac30: 64 64 72 22 20 74 6f 20 74 68 65 20 73 65 74 20  ddr" to the set 
ac40: 6f 66 20 61 6c 6c 20 4f 70 65 6e 54 65 6d 70 20  of all OpenTemp 
ac50: 6f 70 63 6f 64 65 20 61 64 64 72 65 73 73 65 73  opcode addresses
ac60: 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 62 65 69  .** that are bei
ac70: 6e 67 20 61 63 63 75 6d 75 6c 61 74 65 64 20 69  ng accumulated i
ac80: 6e 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 2e  n p->ppOpenTemp.
ac90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
aca0: 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54 65  ultiSelectOpenTe
acb0: 6d 70 41 64 64 72 28 53 65 6c 65 63 74 20 2a 70  mpAddr(Select *p
acc0: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 49  , int addr){.  I
acd0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 2a  dList *pList = *
ace0: 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  p->ppOpenTemp = 
acf0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
ad00: 65 6e 64 28 2a 70 2d 3e 70 70 4f 70 65 6e 54 65  end(*p->ppOpenTe
ad10: 6d 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 4c  mp, 0);.  if( pL
ad20: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ist==0 ){.    re
ad30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ad40: 4d 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  M;.  }.  pList->
ad50: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 2d 31 5d 2e  a[pList->nId-1].
ad60: 69 64 78 20 3d 20 61 64 64 72 3b 0a 20 20 72 65  idx = addr;.  re
ad70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ad80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ad90: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
ada0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
adb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
adc0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
add0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ade0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
adf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
ae00: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
ae10: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
ae20: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
ae30: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
ae40: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
ae50: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
ae60: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
ae70: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
ae80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
ae90: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
aea0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
aeb0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
aec0: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
aed0: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
aee0: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
aef0: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
af00: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
af10: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
af20: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
af30: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
af40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
af50: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
af60: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
af70: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
af80: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
af90: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
afa0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
afb0: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
afc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
afd0: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  et = 0;.  }.  if
afe0: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
aff0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
b000: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
b010: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
b020: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
b030: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
b040: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b050: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b060: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
b070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b080: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b090: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b0a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
b0b0: 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79   process a query
b0c0: 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20   that is really 
b0d0: 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20  the union.** or 
b0e0: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
b0f0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
b100: 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a  rate queries..**
b110: 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
b120: 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
b130: 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
b140: 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
b150: 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
b160: 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
b170: 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
b180: 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
b190: 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
b1a0: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
b1b0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
b1c0: 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
b1d0: 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
b1e0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
b1f0: 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
b200: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
b210: 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
b220: 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
b230: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
b240: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
b250: 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
b260: 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
b270: 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
b280: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
b290: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
b2a0: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
b2b0: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
b2c0: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
b2d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
b2e0: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
b2f0: 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
b300: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
b310: 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
b320: 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
b330: 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
b340: 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
b350: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
b360: 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
b370: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
b380: 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
b390: 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
b3a0: 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
b3b0: 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
b3c0: 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
b3d0: 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
b3e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b3f0: 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
b400: 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
b410: 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
b420: 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
b430: 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
b440: 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
b450: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
b460: 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
b470: 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
b480: 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
b490: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
b4a0: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
b4b0: 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
b4c0: 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
b4d0: 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
b4e0: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
b4f0: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
b500: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
b510: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
b520: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
b530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b540: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
b550: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
b560: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ded */.  int eDe
b570: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  st,            /
b580: 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75  * \___  Store qu
b590: 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73  ery results as s
b5a0: 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e  pecified */.  in
b5b0: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
b5c0: 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20      /* /     by 
b5d0: 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65  these two parame
b5e0: 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f  ters.         */
b5f0: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
b600: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
b610: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
b620: 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
b630: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
b640: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b650: 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
b660: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
b670: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
b680: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
b690: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
b6a0: 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
b6b0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
b6c0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
b6d0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
b6e0: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
b6f0: 56 44 42 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74  VDBE */.  IdList
b700: 20 2a 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b   *pOpenTemp = 0;
b710: 2f 2a 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 6f  /* OP_OpenTemp o
b720: 70 63 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64  pcodes that need
b730: 20 61 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20   a KeyInfo */.  
b740: 69 6e 74 20 61 41 64 64 72 5b 35 5d 3b 20 20 20  int aAddr[5];   
b750: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b760: 65 73 20 6f 66 20 53 65 74 4e 75 6d 43 6f 6c 75  es of SetNumColu
b770: 6d 6e 73 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  mns operators */
b780: 0a 20 20 69 6e 74 20 6e 41 64 64 72 20 3d 20 30  .  int nAddr = 0
b790: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
b7a0: 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  er used */.  int
b7b0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
b7c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b7d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
b7e0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
b7f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
b800: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
b810: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
b820: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
b830: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
b840: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
b850: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
b860: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
b870: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
b880: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
b890: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
b8a0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
b8b0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
b8c0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
b8d0: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
b8e0: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69  = p->pPrior;.  i
b8f0: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
b900: 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
b910: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b920: 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
b930: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
b940: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
b950: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
b960: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
b970: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
b980: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
b990: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
b9a0: 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
b9b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b9c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
b9d0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
b9e0: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
b9f0: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
ba00: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
ba10: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
ba20: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
ba30: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ba40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
ba50: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
ba60: 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69  valid query engi
ba70: 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65  ne.  If not, cre
ba80: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
ba90: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
baa0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
bab0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
bac0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bad0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bae0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
baf0: 20 49 66 20 2a 70 20 74 68 69 73 20 69 73 20 74   If *p this is t
bb00: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 65  he right-most se
bb10: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2c 20  lect statement, 
bb20: 74 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 0a  then initialize.
bb30: 20 20 2a 2a 20 70 2d 3e 70 70 4f 70 65 6e 54 65    ** p->ppOpenTe
bb40: 6d 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 70  mp to point to p
bb50: 4f 70 65 6e 54 65 6d 70 2e 20 20 49 66 20 2a 70  OpenTemp.  If *p
bb60: 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
bb70: 74 20 6d 6f 73 74 0a 20 20 2a 2a 20 73 74 61 74  t most.  ** stat
bb80: 65 6d 65 6e 74 20 74 68 65 6e 20 70 2d 3e 70 70  ement then p->pp
bb90: 4f 70 65 6e 54 65 6d 70 20 77 69 6c 6c 20 68 61  OpenTemp will ha
bba0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
bbb0: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 20 20 2a 2a  initialized.  **
bbc0: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
bbd0: 20 74 6f 20 74 68 69 73 20 73 61 6d 65 20 70 72   to this same pr
bbe0: 6f 63 65 64 75 72 65 2e 20 20 50 61 73 73 20 61  ocedure.  Pass a
bbf0: 6c 6f 6e 67 20 74 68 65 20 70 4f 70 65 6e 54 65  long the pOpenTe
bc00: 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  mp.  ** pointer 
bc10: 74 6f 20 70 50 72 69 6f 72 2c 20 74 68 65 20 6e  to pPrior, the n
bc20: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ext statement to
bc30: 20 6f 75 72 20 6c 65 66 74 2e 0a 20 20 2a 2f 0a   our left..  */.
bc40: 20 20 69 66 28 20 70 2d 3e 70 70 4f 70 65 6e 54    if( p->ppOpenT
bc50: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  emp==0 ){.    p-
bc60: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 26 70  >ppOpenTemp = &p
bc70: 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 0a 20 20  OpenTemp;.  }.  
bc80: 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54 65  pPrior->ppOpenTe
bc90: 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54 65  mp = p->ppOpenTe
bca0: 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  mp;..  /* Create
bcb0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
bcc0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
bcd0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
bce0: 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
bcf0: 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
bd00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
bd10: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
bd20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bd30: 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69  , OP_OpenTemp, i
bd40: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 61 73  Parm, 0);.    as
bd50: 73 65 72 74 28 20 6e 41 64 64 72 3d 3d 30 20 29  sert( nAddr==0 )
bd60: 3b 0a 20 20 20 20 61 41 64 64 72 5b 6e 41 64 64  ;.    aAddr[nAdd
bd70: 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  r++] = sqlite3Vd
bd80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
bd90: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50 61  tNumColumns, iPa
bda0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73  rm, 0);.    eDes
bdb0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
bdc0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
bdd0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
bde0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
bdf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
be00: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
be10: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
be20: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
be30: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
be40: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
be50: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
be60: 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
be70: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
be80: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
be90: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70         pPrior->p
bea0: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
beb0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  set;.        rc 
bec0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
bed0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
bee0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
bef0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
bf00: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
bf10: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
bf20: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
bf30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bf40: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
bf50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
bf60: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
bf70: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
bf80: 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
bf90: 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
bfa0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
bfb0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66  ;.        p->pOf
bfc0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
bfd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
bfe0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
bff0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
c000: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
c010: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
c020: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
c030: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c040: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c050: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c060: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
c070: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c080: 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20     /* For UNION 
c090: 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ALL ... ORDER BY
c0a0: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
c0b0: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
c0c0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
c0d0: 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
c0e0: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
c0f0: 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
c100: 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
c110: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
c120: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c130: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
c140: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  /.      int op =
c150: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20   0;      /* One 
c160: 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
c170: 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
c180: 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
c190: 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
c1a0: 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
c1b0: 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
c1c0: 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
c1d0: 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
c1e0: 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
c1f0: 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  t; /* Saved valu
c200: 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
c210: 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a  and p->nOffset *
c220: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
c230: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
c240: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
c250: 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 72  clause for the r
c260: 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ight SELECT */. 
c270: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
c280: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
c290: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
c2a0: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
c2b0: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
c2c0: 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20   eDest==priorOp 
c2d0: 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  && p->pOrderBy==
c2e0: 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20  0 && !p->pLimit 
c2f0: 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 29  && !p->pOffset )
c300: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
c310: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
c320: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
c330: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
c340: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
c350: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
c360: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
c370: 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a  ionTab = iParm;.
c380: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c390: 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
c3a0: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
c3b0: 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
c3c0: 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
c3d0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
c3e0: 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
c3f0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
c400: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
c410: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
c420: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
c430: 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20 20  >pOrderBy .     
c440: 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72     && matchOrder
c450: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
c460: 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
c470: 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29 20  y, unionTab, 1) 
c480: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
c490: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
c4a0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c4b0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
c4c0: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
c4d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c4e0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
c4f0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
c500: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21        if( p->op!
c510: 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20  =TK_ALL ){.     
c520: 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53       rc = multiS
c530: 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64 64  electOpenTempAdd
c540: 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  r(p, addr);.    
c550: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c560: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c570: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c580: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c5a0: 20 20 7d 0a 09 61 73 73 65 72 74 28 20 6e 41 64    }..assert( nAd
c5b0: 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72 29  dr<sizeof(aAddr)
c5c0: 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30 5d  /sizeof(aAddr[0]
c5d0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 41 64  ) );.        aAd
c5e0: 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71  dr[nAddr++] = sq
c5f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c600: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
c610: 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  ns, unionTab, 0)
c620: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c630: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c640: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
c650: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
c660: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
c670: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
c680: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
c690: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
c6a0: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
c6b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c6c0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69  rse, pPrior, pri
c6d0: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  orOp, unionTab, 
c6e0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
c6f0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c700: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c710: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c720: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c730: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
c740: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c750: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
c760: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
c770: 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
c780: 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
c790: 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
c7a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
c7b0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
c7c0: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
c7d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c7e0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
c7f0: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
c800: 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
c810: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
c820: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
c830: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
c840: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
c850: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
c860: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
c870: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
c880: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
c890: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
c8a0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
c8b0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
c8c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c8d0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c8e0: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
c8f0: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
c900: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
c910: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
c920: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
c930: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
c940: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
c950: 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
c960: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
c970: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
c980: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
c990: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
c9a0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
c9b0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  p->iOffset = -1;
c9c0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
c9d0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c9e0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c9f0: 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
ca00: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
ca10: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
ca20: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
ca30: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
ca40: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
ca50: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
ca60: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
ca70: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
ca80: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
ca90: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
caa0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
cab0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
cac0: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
cad0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
cae0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
caf0: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
cb00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
cb10: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
cb20: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
cb30: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
cb40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
cb50: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
cb60: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
cb70: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
cb80: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cb90: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
cba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cbb0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
cbc0: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
cbd0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
cbe0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
cbf0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
cc00: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
cc10: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cc20: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
cc30: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
cc40: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
cc50: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
cc60: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
cc70: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c      p->pOrderBy,
cca0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
ccb0: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
cce0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
ccf0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
cd00: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
cd10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
cd20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
cd30: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
cd40: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
cd50: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
cd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
cd80: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
cd90: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
cda0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
cdb0: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
cdc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cdd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cde0: 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
cdf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ce00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ce10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
ce20: 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  ERSECT: {.      
ce30: 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
ce40: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
ce50: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
ce60: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
ce70: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
ce80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
ce90: 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
cea0: 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
ceb0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
cec0: 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
ced0: 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
cee0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
cef0: 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
cf00: 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
cf10: 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
cf20: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
cf30: 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
cf40: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
cf50: 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
cf60: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
cf70: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
cf80: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
cf90: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
cfa0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
cfb0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 2d  lumn(pParse,p,p-
cfc0: 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31  >pOrderBy,tab1,1
cfd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
cfe0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
cff0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d000: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
d010: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d020: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d030: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 31 2c  _OpenTemp, tab1,
d040: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
d050: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54  multiSelectOpenT
d060: 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 29  empAddr(p, addr)
d070: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d080: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d090: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d0a0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d0b0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
d0c0: 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61  ( nAddr<sizeof(a
d0d0: 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64  Addr)/sizeof(aAd
d0e0: 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20  dr[0]) );.      
d0f0: 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d  aAddr[nAddr++] =
d100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d110: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
d120: 6c 75 6d 6e 73 2c 20 74 61 62 31 2c 20 30 29 3b  lumns, tab1, 0);
d130: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d140: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
d150: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
d160: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
d170: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
d180: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
d190: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
d1a0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d1b0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
d1c0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
d1d0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  1, 0, 0, 0, aff)
d1e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d1f0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d200: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d210: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d220: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
d230: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
d240: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d250: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
d260: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
d270: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d280: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61   OP_OpenTemp, ta
d290: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  b2, 0);.      rc
d2a0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70   = multiSelectOp
d2b0: 65 6e 54 65 6d 70 41 64 64 72 28 70 2c 20 61 64  enTempAddr(p, ad
d2c0: 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dr);.      if( r
d2d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d2e0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d2f0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
d310: 65 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f  ert( nAddr<sizeo
d320: 66 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28  f(aAddr)/sizeof(
d330: 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20  aAddr[0]) );.   
d340: 20 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b     aAddr[nAddr++
d350: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
d360: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
d370: 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 32 2c 20  mColumns, tab2, 
d380: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  0);.      p->pPr
d390: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
d3a0: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
d3b0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
d3c0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
d3d0: 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
d3e0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
d3f0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
d400: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d410: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52  ct(pParse, p, SR
d420: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30  T_Union, tab2, 0
d430: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
d440: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d450: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71  pPrior;.      sq
d460: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d470: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
d480: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
d490: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
d4a0: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
d4b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d4c0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
d4d0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d4e0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d4f0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
d500: 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
d510: 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
d520: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
d530: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
d540: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
d550: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
d570: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
d580: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e  k ){.        gen
d590: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
d5a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
d5b0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
d5c0: 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
d5d0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d5e0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
d5f0: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
d600: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d620: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
d630: 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
d640: 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
d650: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
d660: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
d670: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
d680: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d690: 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30  _RowKey, tab1, 0
d6a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d6b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d6c0: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
d6d0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  iCont);.      rc
d6e0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
d6f0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
d700: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
d710: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
d740: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
d750: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d770: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
d780: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
d790: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d7a0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
d7b0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
d7c0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
d7d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d7e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d7f0: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
d800: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d810: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
d820: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
d830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d840: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d850: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d870: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
d880: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
d890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d8a0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
d8b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
d8c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
d8d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
d8e0: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
d8f0: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
d900: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
d910: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
d920: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
d930: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
d940: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
d950: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
d960: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
d970: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
d980: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
d990: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
d9a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d9b0: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
d9c0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
d9d0: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
d9e0: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
d9f0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
da00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
da10: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
da20: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
da30: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
da40: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
da50: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
da60: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
da70: 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
da80: 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20  les.  */.  nCol 
da90: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
daa0: 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 41 64  pr;.  while( nAd
dab0: 64 72 3e 30 20 29 7b 0a 20 20 20 20 6e 41 64 64  dr>0 ){.    nAdd
dac0: 72 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r--;.    sqlite3
dad0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
dae0: 61 41 64 64 72 5b 6e 41 64 64 72 5d 2c 20 6e 43  aAddr[nAddr], nC
daf0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
db00: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
db10: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
db20: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
db30: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
db40: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
db50: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
db60: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
db70: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
db80: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
db90: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
dba0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
dbb0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
dbc0: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
dbd0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
dbe0: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
dbf0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
dc00: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
dc10: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
dc20: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
dc30: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
dc40: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
dc50: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
dc60: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
dc70: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
dc80: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
dc90: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
dca0: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
dcb0: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
dcc0: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
dcd0: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
dce0: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
dcf0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
dd00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
dd10: 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65  OrderBy || (pOpe
dd20: 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54 65  nTemp && pOpenTe
dd30: 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20  mp->nId>0) ){.  
dd40: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
dd70: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
dd80: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
dd90: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
dda0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
ddb0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ddc0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
ddd0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 3d 20 26  >ppOpenTemp == &
dde0: 70 4f 70 65 6e 54 65 6d 70 20 29 3b 0a 20 20 20  pOpenTemp );.   
ddf0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
de00: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
de10: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
de20: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
de30: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
de40: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
de50: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
de60: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
de70: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
de80: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
de90: 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  o->enc = pParse-
dea0: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4b  >db->enc;.    pK
deb0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
dec0: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
ded0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
dee0: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  ){.      pKeyInf
def0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  o->aColl[i] = mu
df00: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
df10: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
df20: 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79 49        if( !pKeyI
df30: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
df40: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
df50: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  o->aColl[i] = pP
df60: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
df70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
df80: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
df90: 20 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 69 3c   pOpenTemp && i<
dfa0: 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3b 20  pOpenTemp->nId; 
dfb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
dfc0: 70 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f 50  p3type = (i==0?P
dfd0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
dfe0: 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  F:P3_KEYINFO);. 
dff0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
e000: 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b 69 5d 2e  pOpenTemp->a[i].
e010: 69 64 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  idx;.      sqlit
e020: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
e030: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29  , addr, (char *)
e040: 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74 79 70 65  pKeyInfo, p3type
e050: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
e060: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
e070: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
e080: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 72  prList_item *pOr
e090: 64 65 72 42 79 54 65 72 6d 20 3d 20 70 2d 3e 70  derByTerm = p->p
e0a0: 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
e0b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e0c0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
e0d0: 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42 79 54 65   i++, pOrderByTe
e0e0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
e0f0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
e100: 64 65 72 42 79 54 65 72 6d 2d 3e 70 45 78 70 72  derByTerm->pExpr
e110: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
e120: 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65 72 42 79  zName = pOrderBy
e130: 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Term->zName;.   
e140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e150: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
e160: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  N && pExpr->iCol
e170: 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  umn<nCol );.    
e180: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
e190: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 20  pExpr->pColl ); 
e1a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
e1b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
e1c0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
e1d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
e1e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e  llSeq(pParse, zN
e1f0: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
e200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e210: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
e220: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
e230: 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
e240: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
e250: 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e 65 72     }.      gener
e260: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
e270: 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  se, p, v, p->pEL
e280: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
e290: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d  t, iParm);.    }
e2a0: 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70 65 6e  ..    if( !pOpen
e2b0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Temp ){.      /*
e2c0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   This happens fo
e2d0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
e2e0: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
e2f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
e300: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  yInfo);.    }.  
e310: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
e320: 65 6e 64 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e  end:.  if( pOpen
e330: 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Temp ){.    sqli
e340: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
e350: 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a  pOpenTemp);.  }.
e360: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
e370: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
e380: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
e390: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e3a0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
e3b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e3c0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61  T_VIEW./*.** Sca
e3d0: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
e3e0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
e3f0: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
e400: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
e410: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
e420: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
e430: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
e440: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
e450: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
e460: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
e470: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
e480: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
e490: 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
e4a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e4b0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
e4c0: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
e4d0: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
e4e0: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
e4f0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
e500: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
e510: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
e520: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
e530: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
e540: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
e550: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
e560: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
e570: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
e580: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
e590: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
e5a0: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
e5b0: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
e5c0: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
e5d0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
e5e0: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
e5f0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
e600: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
e610: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
e620: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
e630: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
e640: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
e650: 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a  ,ExprList*);  /*
e660: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
e670: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
e680: 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  stSelect(Select 
e690: 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
e6a0: 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64   *);  /* Forward
e6b0: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
e6c0: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
e6d0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
e6e0: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
e6f0: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
e700: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
e710: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
e720: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
e730: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
e740: 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
e750: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
e760: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
e770: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
e780: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e790: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
e7a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
e7b0: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
e7c0: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
e7d0: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
e7e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e7f0: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
e800: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
e810: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
e820: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
e830: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
e840: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
e850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
e860: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
e870: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
e880: 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
e890: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
e8a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
e8b0: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
e8c0: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
e8d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
e8e0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
e8f0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
e900: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
e910: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
e920: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
e930: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e940: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
e950: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
e960: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
e970: 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69  istDup(pNew->pLi
e980: 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  st);.      pExpr
e990: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
e9a0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
e9b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
e9c0: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
e9d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
e9e0: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
e9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
ea00: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f  nCopy(&pExpr->to
ea10: 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
ea20: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
ea30: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
ea40: 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
ea50: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78  span);.      pEx
ea60: 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  pr->pSelect = sq
ea70: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
ea80: 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
ea90: 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
eaa0: 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
eab0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
eac0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
ead0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
eae0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
eaf0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
eb00: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
eb10: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
eb20: 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70 72  ubstSelect(pExpr
eb30: 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
eb40: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
eb50: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45  substExprList(pE
eb60: 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
eb70: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
eb80: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
eb90: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
eba0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
ebb0: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
ebc0: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
ebd0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
ebe0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
ebf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
ec00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
ec10: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
ec20: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
ec30: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ec40: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ec50: 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
ec60: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
ec70: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
ec80: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20  *pEList){.  if( 
ec90: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
eca0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
ecb0: 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
ecc0: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
ecd0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
ece0: 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
ecf0: 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
ed00: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
ed10: 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
ed20: 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
ed30: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61  (p->pHaving, iTa
ed40: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
ed50: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68  substExpr(p->pWh
ed60: 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
ed70: 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ist);.}.#endif /
ed80: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
ed90: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
eda0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
edb0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
edc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
edd0: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
ede0: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
edf0: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
ee00: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
ee10: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
ee20: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
ee30: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
ee40: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
ee50: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
ee60: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
ee70: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
ee80: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
ee90: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
eea0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
eeb0: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
eec0: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
eed0: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
eee0: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
eef0: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
ef00: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
ef10: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
ef20: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
ef30: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
ef40: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
ef50: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
ef60: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
ef70: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
ef80: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
ef90: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
efa0: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
efb0: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
efc0: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
efd0: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
efe0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
eff0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
f000: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
f010: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
f020: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
f030: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
f040: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
f050: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
f060: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
f070: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
f080: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
f090: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
f0a0: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
f0b0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
f0c0: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
f0d0: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
f0e0: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
f0f0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
f100: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
f110: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
f120: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
f130: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
f140: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
f150: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
f160: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
f170: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
f180: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
f190: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
f1a0: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
f1b0: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
f1c0: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
f1d0: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
f1e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f1f0: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
f200: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
f210: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
f220: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
f230: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
f240: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
f250: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f260: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
f270: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
f280: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f290: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
f2a0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f2b0: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
f2c0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
f2d0: 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
f2e0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
f2f0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
f300: 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
f310: 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
f320: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
f330: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
f340: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
f350: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
f360: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
f370: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
f380: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
f390: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
f3a0: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
f3b0: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
f3c0: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
f3d0: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
f3e0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
f3f0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
f400: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
f410: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
f420: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
f430: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
f440: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
f450: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
f460: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
f470: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
f480: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
f490: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f4a0: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
f4b0: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f4c0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
f4d0: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
f4e0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
f4f0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
f500: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
f510: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
f520: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
f530: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
f540: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
f550: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
f560: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
f570: 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
f580: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
f590: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
f5a0: 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
f5b0: 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
f5c0: 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
f5d0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
f5e0: 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
f5f0: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
f600: 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
f610: 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
f620: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
f630: 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
f640: 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49  et #350).**.** I
f650: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
f660: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
f670: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
f680: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
f690: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
f6a0: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
f6b0: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
f6c0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
f6d0: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
f6e0: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
f6f0: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
f700: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
f710: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
f720: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
f730: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
f740: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
f750: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
f760: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
f770: 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
f780: 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
f790: 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
f7a0: 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
f7b0: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
f7c0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
f7d0: 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
f7e0: 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
f7f0: 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
f800: 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
f810: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
f820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f830: 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
f840: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
f860: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
f870: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
f880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f890: 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
f8a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f8b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
f8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
f8d0: 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
f8e0: 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
f8f0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
f900: 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
f910: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
f920: 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
f930: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
f940: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
f950: 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
f960: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
f970: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
f980: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
f990: 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
f9a0: 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
f9b0: 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
f9c0: 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
f9d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
f9e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
f9f0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
fa00: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
fa10: 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
fa20: 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
fa30: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
fa40: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
fa50: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
fa60: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
fa70: 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
fa80: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
fa90: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
faa0: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
fab0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
fac0: 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
fad0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
fae0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
faf0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
fb00: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
fb10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fb20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
fb30: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
fb40: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
fb50: 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
fb60: 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
fb70: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
fb80: 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
fb90: 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
fba0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
fbb0: 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
fbc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fbd0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
fbe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
fbf0: 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
fc00: 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
fc10: 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
fc20: 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
fc30: 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
fc40: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
fc50: 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
fc60: 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
fc70: 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
fc80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
fc90: 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
fca0: 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
fcb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
fcc0: 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
fcd0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
fce0: 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 28  ubSrc );.  if( (
fcf0: 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
fd00: 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 20 70 53  p->pLimit) || pS
fd10: 75 62 2d 3e 70 4f 66 66 73 65 74 20 7c 7c 20 0a  ub->pOffset || .
fd20: 20 20 20 20 20 20 28 70 53 75 62 2d 3e 70 4c 69        (pSub->pLi
fd30: 6d 69 74 20 26 26 20 69 73 41 67 67 29 20 29 20  mit && isAgg) ) 
fd40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
fd50: 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
fd60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
fd70: 66 28 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  f( pSub->isDisti
fd80: 6e 63 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  nct && (pSrc->nS
fd90: 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
fda0: 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
fdb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
fdc0: 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
fdd0: 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
fde0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
fdf0: 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
fe00: 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
fe10: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
fe20: 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
fe30: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
fe40: 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
fe50: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
fe60: 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
fe70: 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
fe80: 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
fe90: 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
fea0: 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
feb0: 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
fec0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
fed0: 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
fee0: 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
fef0: 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
ff00: 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
ff10: 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
ff20: 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
ff30: 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
ff40: 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
ff50: 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
ff60: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
ff70: 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
ff80: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
ff90: 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
ffa0: 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
ffb0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
ffc0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
ffd0: 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
ffe0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
fff0: 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
10000 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
10010 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
10020 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
10030 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
10040 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
10050 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
10060 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
10070 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
10080 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
10090 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
100a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
100b0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
100c0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
100d0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
100e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
100f0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
10100 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
10110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
10120 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
10130 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
10140 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
10150 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
10160 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
10170 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
10180 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
10190 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
101a0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
101b0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
101c0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
101d0 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
101e0 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
101f0 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
10200 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
10210 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
10220 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
10230 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
10240 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
10250 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
10260 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
10270 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
10280 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
10290 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
102a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
102b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
102c0 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
102d0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
102e0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
102f0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
10300 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
10310 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
10320 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
10330 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
10340 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
10350 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
10360 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
10370 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
10380 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
10390 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
103a0 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
103b0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
103c0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
103d0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
103e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
103f0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
10400 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
10410 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
10420 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
10430 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
10440 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
10450 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
10460 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
10470 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
10480 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
10490 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
104a0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ->iCursor;.  {. 
104b0 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
104c0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
104d0 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
104e0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
104f0 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69  ntype;..    sqli
10500 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
10510 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  , pSubitem->pTab
10520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
10530 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  e(pSubitem->zDat
10540 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
10550 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
10560 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
10570 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
10580 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
10590 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
105a0 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
105b0 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20  = nSubSrc - 1;. 
105c0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
105d0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
105e0 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71         pSrc = sq
105f0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
10600 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  nd(pSrc, 0, 0);.
10610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
10620 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
10630 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
10640 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e  nSrc-1; i-extra>
10650 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20  =iFrom; i--){.  
10660 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d        pSrc->a[i]
10670 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74   = pSrc->a[i-ext
10680 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra];.      }.   
10690 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
106a0 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
106b0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
106c0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
106d0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
106e0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
106f0 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
10700 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
10710 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
10720 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63  >a[iFrom+nSubSrc
10730 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  -1].jointype = j
10740 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
10750 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
10760 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
10770 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
10780 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
10790 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
107a0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
107b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
107c0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
107d0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
107e0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
107f0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
10800 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
10810 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
10820 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10850 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
10860 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
10870 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
10880 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10890 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
108a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
108b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
108c0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
108d0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
108e0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
108f0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
10900 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
10910 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
10920 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
10930 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
10940 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
10950 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
10960 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  /.  substExprLis
10970 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  t(p->pEList, iPa
10980 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10990 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  st);.  pList = p
109a0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
109b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
109c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
109d0 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
109e0 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
109f0 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
10a00 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
10a10 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
10a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
10a30 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
10a40 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45  sqliteStrNDup(pE
10a50 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78  xpr->span.z, pEx
10a60 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20  pr->span.n);.   
10a70 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41   }.  }.  if( isA
10a80 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  gg ){.    substE
10a90 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
10aa0 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
10ab0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
10ac0 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
10ad0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
10ae0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10af0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70   }.  if( pSub->p
10b00 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61  OrderBy ){.    a
10b10 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
10b20 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
10b30 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
10b40 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70  >pOrderBy;.    p
10b50 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
10b60 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
10b70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
10b80 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
10b90 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  p->pOrderBy, iPa
10ba0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
10bb0 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
10bc0 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
10bd0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
10be0 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
10bf0 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73  >pWhere);.  }els
10c00 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  e{.    pWhere = 
10c10 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62  0;.  }.  if( sub
10c20 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
10c30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
10c40 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ving==0 );.    p
10c50 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70  ->pHaving = p->p
10c60 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57  Where;.    p->pW
10c70 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
10c80 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
10c90 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
10ca0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
10cb0 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
10cc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
10cd0 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c  (p->pHaving, sql
10ce0 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62  ite3ExprDup(pSub
10cf0 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20  ->pHaving));.   
10d00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
10d10 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  upBy==0 );.    p
10d20 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
10d30 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
10d40 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b  pSub->pGroupBy);
10d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
10d60 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
10d70 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
10d80 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
10d90 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
10da0 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68  e3ExprAnd(p->pWh
10db0 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
10dc0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  }..  /* The flat
10dd0 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
10de0 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
10df0 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
10e00 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  he.  ** outer qu
10e10 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
10e20 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69   .  */.  p->isDi
10e30 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
10e40 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e  stinct || pSub->
10e50 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f  isDistinct;..  /
10e60 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e  *.  ** SELECT ..
10e70 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
10e80 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
10e90 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
10ea0 53 45 54 20 79 3b 0a 20 20 2a 2f 0a 20 20 69 66  SET y;.  */.  if
10eb0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
10ec0 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  {.    p->pLimit 
10ed0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
10ee0 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
10ef0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
10f00 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
10f10 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
10f20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
10f30 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
10f40 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
10f50 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
10f60 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72  e(pSub);.  retur
10f70 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
10f80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10f90 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  W */../*.** Anal
10fa0 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
10fb0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
10fc0 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  in as an argumen
10fd0 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
10fe0 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69  * is a simple mi
10ff0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
11000 72 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e  ry.  If it is an
11010 64 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e  d this query can
11020 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64   be.** satisfied
11030 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
11040 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69  seek to the begi
11050 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20  nning or end of 
11060 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65  an index,.** the
11070 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  n generate the c
11080 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ode for this SEL
11090 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31  ECT and return 1
110a0 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  .  If this is no
110b0 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d  t a .** simple m
110c0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
110d0 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ery, then return
110e0 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70   0;.**.** A simp
110f0 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  ly min() or max(
11100 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69  ) query looks li
11110 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
11120 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20    SELECT min(a) 
11130 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20  FROM table;.**  
11140 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20    SELECT max(a) 
11150 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a  FROM table;.**.*
11160 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20  * The query may 
11170 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67  have only a sing
11180 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20  le table in its 
11190 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20  FROM argument.  
111a0 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20  There.** can be 
111b0 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  no GROUP BY or H
111c0 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63  AVING or WHERE c
111d0 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73  lauses.  The res
111e0 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20  ult set must.** 
111f0 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  be the min() or 
11200 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c  max() of a singl
11210 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
11220 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75  table.  The colu
11230 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e  mn.** in the min
11240 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
11250 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64  tion must be ind
11260 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exed..**.** The 
11270 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
11280 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74  is routine are t
11290 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73  he same as for s
112a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a  qlite3Select()..
112b0 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65  ** See the heade
112c0 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61  r comment on tha
112d0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  t routine for ad
112e0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
112f0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
11300 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78  int simpleMinMax
11310 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
11320 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
11330 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
11340 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70  Parm){.  Expr *p
11350 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  Expr;.  int iCol
11360 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
11370 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
11380 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64    int base;.  Vd
11390 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65  be *v;.  int see
113a0 6b 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b  kOp;.  int cont;
113b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
113c0 69 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69  ist, *pList, eLi
113d0 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
113e0 72 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74  rList_item eList
113f0 49 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20  Item;.  SrcList 
11400 2a 70 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65  *pSrc;..  /* Che
11410 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
11420 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
11430 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
11440 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
11450 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
11460 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
11470 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
11480 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
11490 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
114a0 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
114b0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28  = p->pSrc;.  if(
114c0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
114d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c   return 0;.  pEL
114e0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
114f0 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
11500 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
11510 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45   0;.  pExpr = pE
11520 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11530 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
11540 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
11550 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
11560 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
11570 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
11580 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
11590 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
115a0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
115b0 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
115c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
115d0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
115e0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
115f0 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  in",3)==0 ){.   
11600 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77   seekOp = OP_Rew
11610 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ind;.  }else if(
11620 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
11630 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
11640 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
11650 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
11660 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
11670 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11680 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    pExpr = pList-
11690 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
116a0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
116b0 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
116c0 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
116d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
116e0 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
116f0 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
11700 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20  we get to here, 
11710 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65  it means the que
11720 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ry is of the cor
11730 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20  rect form..  ** 
11740 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
11750 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e  re we have an in
11760 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64  dex and make pId
11770 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  x point to the. 
11780 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
11790 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d  index.  If the m
117a0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
117b0 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50   on an INTEGER P
117c0 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20  RIMARY.  ** key 
117d0 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78  column, no index
117e0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
117f0 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c   set pIdx to NUL
11800 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75  L.  If no.  ** u
11810 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66  sable index is f
11820 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ound, return 0..
11830 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c    */.  if( iCol<
11840 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20  0 ){.    pIdx = 
11850 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11860 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11870 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11880 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
11890 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  r);.    for(pIdx
118a0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
118b0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
118c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
118d0 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
118e0 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn>=1 );.      
118f0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
11900 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70  mn[0]==iCol && p
11910 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
11920 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62  ll[0]==pColl ) b
11930 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11940 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65  if( pIdx==0 ) re
11950 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
11960 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
11970 6e 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69  n types if we wi
11980 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20  ll be using the 
11990 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a  callback.  This.
119a0 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69    ** step is ski
119b0 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  pped if the outp
119c0 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61  ut is going to a
119d0 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f   table or a memo
119e0 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68  ry cell..  ** Th
119f0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68  e column names h
11a00 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11a10 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
11a20 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
11a30 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  on..  */.  v = s
11a40 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11a50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
11a60 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
11a70 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
11a80 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
11a90 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
11aa0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
11ab0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
11ac0 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
11ad0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
11ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11af0 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50   OP_OpenTemp, iP
11b00 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  arm, 0);.    sql
11b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11b20 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
11b30 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  s, iParm, 1);.  
11b40 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69  }..  /* Generati
11b50 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20  ng code to find 
11b60 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d  the min or the m
11b70 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61  ax.  Basically a
11b80 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  ll we have.  ** 
11b90 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68  to do is find th
11ba0 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c  e first or the l
11bb0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
11bc0 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20   chosen index.  
11bd0 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28  If.  ** the min(
11be0 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
11bf0 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
11c00 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66  MARY KEY, then f
11c10 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  ind the first.  
11c20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79  ** or last entry
11c30 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
11c40 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
11c50 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
11c60 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ma(pParse, pTab-
11c70 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20  >iDb);.  base = 
11c80 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
11c90 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  or;.  computeLim
11ca0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
11cb0 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53  se, p);.  if( pS
11cc0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
11cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
11ce0 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65  e3OpenTableForRe
11cf0 61 64 69 6e 67 28 76 2c 20 62 61 73 65 2c 20 70  ading(v, base, p
11d00 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74  Tab);.  }.  cont
11d10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
11d20 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66  keLabel(v);.  if
11d30 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
11d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d50 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73  p(v, seekOp, bas
11d60 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
11d70 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75      /* Even thou
11d80 67 68 20 74 68 65 20 63 75 72 73 6f 72 20 75 73  gh the cursor us
11d90 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69  ed to open the i
11da0 6e 64 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f  ndex here is clo
11db0 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f  sed.    ** as so
11dc0 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76  on as a single v
11dd0 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72 65  alue has been re
11de0 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f  ad from it, allo
11df0 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75  cate it.    ** u
11e00 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54  sing (pParse->nT
11e10 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74  ab++) to prevent
11e20 20 74 68 65 20 63 75 72 73 6f 72 20 69 64 20 66   the cursor id f
11e30 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a  rom being .    *
11e40 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73 20 69  * reused. This i
11e50 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20  s important for 
11e60 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68  statements of th
11e70 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22  e form .    ** "
11e80 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45  INSERT INTO x SE
11e90 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20  LECT max() FROM 
11ea0 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  x"..    */.    i
11eb0 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 69 49 64  nt iIdx;.    iId
11ec0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
11ed0 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
11ee0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11ef0 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44  nteger, pIdx->iD
11f00 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
11f10 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
11f20 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20  OpenRead, iIdx, 
11f30 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20  pIdx->tnum,.    
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11f50 63 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79  char*)&pIdx->key
11f60 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
11f70 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f  );.    if( seekO
11f80 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a  p==OP_Rewind ){.
11f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11fa0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
11fb0 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
11fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11fd0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
11fe0 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 1, 0);.      
11ff0 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76 65  seekOp = OP_Move
12000 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Gt;.    }.    sq
12010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12020 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c 20  , seekOp, iIdx, 
12030 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
12040 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
12050 64 78 52 6f 77 69 64 2c 20 69 49 64 78 2c 20 30  dxRowid, iIdx, 0
12060 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12070 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
12080 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ose, iIdx, 0);. 
12090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
120a0 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
120b0 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 0a  , base, 0);.  }.
120c0 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d 20    eList.nExpr = 
120d0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c 69  1;.  memset(&eLi
120e0 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  stItem, 0, sizeo
120f0 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a 20  f(eListItem));. 
12100 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69 73   eList.a = &eLis
12110 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e 61  tItem;.  eList.a
12120 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [0].pExpr = pExp
12130 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  r;.  selectInner
12140 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
12150 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  &eList, 0, 0, 0,
12160 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
12170 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20 30  m, cont, cont, 0
12180 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12190 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
121a0 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
121b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
121c0 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
121d0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
121e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
121f0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
12200 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
12210 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
12220 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
12230 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
12240 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
12250 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
12260 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
12270 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
12280 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
12290 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
122a0 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
122b0 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
122c0 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
122d0 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
122e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
122f0 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
12300 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
12310 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
12320 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43  GroupBy(.  NameC
12330 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
12340 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
12350 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
12360 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45  tatement. */.  E
12370 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
12380 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
12390 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
123a0 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
123b0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
123c0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
123d0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
123e0 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
123f0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
12400 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
12410 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
12420 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
12430 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
12440 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
12450 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20  LECT */.  Parse 
12460 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
12470 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68  Parse;     /* Th
12480 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
12490 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
124a0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29  assert( pEList )
124b0 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
124c0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
124d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
124e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
124f0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
12500 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  l;.    Expr *pE 
12510 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
12520 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
12530 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
12540 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
12550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
12560 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
12570 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
12580 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12590 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
125a0 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72       pE = pOrder
125b0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
125c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
125d0 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31  pEList->a[iCol-1
125e0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
125f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12600 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12610 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
12620 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e     "%s BY column
12630 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
12640 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
12650 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
12660 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
12670 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c  %d", zType, iCol
12680 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
12690 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
126a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
126b0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
126c0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
126d0 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20  s(pNC, pE) ){.  
126e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
126f0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
12700 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
12710 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20 73  t(pE) ){.      s
12720 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12730 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
12740 20 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d 75   "%s BY terms mu
12750 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69 6e  st not be non-in
12760 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 22  teger constants"
12770 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  , zType);.      
12780 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
12790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
127a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
127b0 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61  utine resolves a
127c0 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e  ny names used in
127d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
127e0 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69  of the.** suppli
127f0 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ed SELECT statem
12800 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45  ent. If the SELE
12810 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
12820 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69  ng resolved.** i
12830 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20  s a sub-select, 
12840 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73  then pOuterNC is
12850 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12860 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a  e NameContext .*
12870 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  * of the parent 
12880 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73  SELECT..*/.int s
12890 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
128a0 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lve(.  Parse *pP
128b0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
128c0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
128d0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
128e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
128f0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
12900 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
12910 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
12920 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
12930 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61   /* The outer na
12940 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20  me context. May 
12950 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20  be NULL. */.){. 
12960 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
12970 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  t;          /* R
12980 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
12990 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
129a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
129b0 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20  r-loop variable 
129c0 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65  used in multiple
129d0 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d   places */.  Nam
129e0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
129f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
12a00 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f   name-context */
12a10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72  ..  /* If this r
12a20 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62  outine has run b
12a30 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d  efore, return im
12a40 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  mediately. */.  
12a50 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  if( p->isResolve
12a60 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
12a70 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20   !pOuterNC );.  
12a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12a90 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52  OK;.  }.  p->isR
12aa0 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20  esolved = 1;..  
12ab0 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76 65  /* If there have
12ac0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72   already been er
12ad0 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rors, do nothing
12ae0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  . */.  if( pPars
12af0 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  e->nErr>0 ){.   
12b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12b10 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
12b20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c 65  Prepare the sele
12b30 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ct statement. Th
12b40 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c  is call will all
12b50 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  ocate all cursor
12b60 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20  s.  ** required 
12b70 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61  to handle the ta
12b80 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  bles and subquer
12b90 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
12ba0 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
12bb0 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
12bc0 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  t(pParse, p) ){.
12bd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12be0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
12bf0 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65  /* Resolve the e
12c00 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
12c10 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
12c20 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73  ET clauses. Thes
12c30 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61  e.  ** are not a
12c40 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20  llowed to refer 
12c50 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f  to any names, so
12c60 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e   pass an empty N
12c70 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f  ameContext..  */
12c80 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
12c90 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 68 61  pParse;.  sNC.ha
12ca0 73 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43 2e  sAgg = 0;.  sNC.
12cb0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 4e 43 2e  nErr = 0;.  sNC.
12cc0 6e 52 65 66 20 3d 20 30 3b 0a 20 20 73 4e 43 2e  nRef = 0;.  sNC.
12cd0 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20 73 4e  pEList = 0;.  sN
12ce0 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a  C.allowAgg = 0;.
12cf0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
12d00 20 30 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20   0;.  sNC.pNext 
12d10 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
12d20 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
12d30 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d  es(&sNC, p->pLim
12d40 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c  it) ||.      sql
12d50 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
12d60 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f  ames(&sNC, p->pO
12d70 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65  ffset) ){.    re
12d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12d90 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  R;.  }..  /* Set
12da0 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61   up the local na
12db0 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  me-context to pa
12dc0 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76  ss to ExprResolv
12dd0 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a  eNames() to.  **
12de0 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   resolve the exp
12df0 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20  ression-list..  
12e00 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67  */.  sNC.allowAg
12e10 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72  g = 1;.  sNC.pSr
12e20 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  cList = p->pSrc;
12e30 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70  .  sNC.pNext = p
12e40 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 4e  OuterNC;..  /* N
12e50 61 6d 65 43 6f 6e 74 65 78 74 2e 6e 44 65 70 74  ameContext.nDept
12e60 68 20 73 74 6f 72 65 73 20 74 68 65 20 64 65 70  h stores the dep
12e70 74 68 20 6f 66 20 72 65 63 75 72 73 69 6f 6e 20  th of recursion 
12e80 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 20  for this query. 
12e90 46 6f 72 0a 20 20 2a 2a 20 61 6e 20 6f 75 74 65  For.  ** an oute
12ea0 72 20 71 75 65 72 79 20 28 65 2e 67 2e 20 53 45  r query (e.g. SE
12eb0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
12ec0 74 65 5f 6d 61 73 74 65 72 29 20 74 68 69 73 20  te_master) this 
12ed0 69 73 20 31 2e 20 46 6f 72 0a 20 20 2a 2a 20 61  is 1. For.  ** a
12ee0 20 73 75 62 71 75 65 72 79 20 69 74 20 69 73 20   subquery it is 
12ef0 32 2e 20 46 6f 72 20 61 20 73 75 62 71 75 65 72  2. For a subquer
12f00 79 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 2c  y of a subquery,
12f10 20 33 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 0a   3. And so on. .
12f20 20 20 2a 2a 20 50 61 72 73 65 2e 6e 4d 61 78 44    ** Parse.nMaxD
12f30 65 70 74 68 20 69 73 20 74 68 65 20 6d 61 78 69  epth is the maxi
12f40 6d 75 6d 20 64 65 70 74 68 20 66 6f 72 20 61 6e  mum depth for an
12f50 79 20 73 75 62 71 75 65 72 79 20 72 65 73 6f 6c  y subquery resol
12f60 76 65 64 20 73 6f 0a 20 20 2a 2a 20 66 61 72 2e  ved so.  ** far.
12f70 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
12f80 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
12f90 75 6d 62 65 72 20 6f 66 20 61 67 67 72 65 67 61  umber of aggrega
12fa0 74 65 20 63 6f 6e 74 65 78 74 73 0a 20 20 2a 2a  te contexts.  **
12fb0 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75 6e   required at run
12fc0 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43  time..  */.  sNC
12fd0 2e 6e 44 65 70 74 68 20 3d 20 28 70 4f 75 74 65  .nDepth = (pOute
12fe0 72 4e 43 3f 70 4f 75 74 65 72 4e 43 2d 3e 6e 44  rNC?pOuterNC->nD
12ff0 65 70 74 68 2b 31 3a 31 29 3b 0a 20 20 69 66 28  epth+1:1);.  if(
13000 20 73 4e 43 2e 6e 44 65 70 74 68 3e 70 50 61 72   sNC.nDepth>pPar
13010 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68 20 29 7b  se->nMaxDepth ){
13020 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 61  .    pParse->nMa
13030 78 44 65 70 74 68 20 3d 20 73 4e 43 2e 6e 44 65  xDepth = sNC.nDe
13040 70 74 68 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  pth;.  }..  /* R
13050 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
13060 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
13070 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
13080 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21  >pEList;.  if( !
13090 70 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20  pEList ) return 
130a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
130b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
130c0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
130d0 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
130e0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
130f0 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
13100 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
13110 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a  es(&sNC, pX) ){.
13120 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13130 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
13140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
13150 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65  ere are no aggre
13160 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
13170 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  n the result-set
13180 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  , and no GROUP B
13190 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  Y .  ** expressi
131a0 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  on, do not allow
131b0 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61   aggregates in a
131c0 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ny of the other 
131d0 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
131e0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  /.  assert( !p->
131f0 69 73 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70  isAgg );.  if( p
13200 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e  ->pGroupBy || sN
13210 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C.hasAgg ){.    
13220 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  p->isAgg = 1;.  
13230 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61  }else{.    sNC.a
13240 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d  llowAgg = 0;.  }
13250 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49  ..  /* If a HAVI
13260 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  NG clause is pre
13270 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65  sent, then there
13280 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50   must be a GROUP
13290 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   BY clause..  */
132a0 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
132b0 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42  g && !p->pGroupB
132c0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
132d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
132e0 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61   "a GROUP BY cla
132f0 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
13300 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b  before HAVING");
13310 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13320 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
13330 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70 72   /* Add the expr
13340 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74  ession list to t
13350 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  he name-context 
13360 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74  before parsing t
13370 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78  he.  ** other ex
13380 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
13390 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
133a0 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  t. This is so th
133b0 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  at.  ** expressi
133c0 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
133d0 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63   clause (etc.) c
133e0 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70 72  an refer to expr
133f0 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20  essions by.  ** 
13400 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72  aliases in the r
13410 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a  esult set..  **.
13420 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74    ** Minor point
13430 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  : If this is the
13440 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
13450 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20  expression will 
13460 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75  be.  ** re-evalu
13470 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65  ated for each re
13480 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20  ference to it.. 
13490 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74   */.  sNC.pEList
134a0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
134b0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
134c0 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
134d0 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a  , p->pWhere) ||.
134e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
134f0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
13500 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20  NC, p->pHaving) 
13510 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73  ||.      process
13520 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e  OrderGroupBy(&sN
13530 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  C, p->pOrderBy, 
13540 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20  "ORDER") ||.    
13550 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
13560 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70  oupBy(&sNC, p->p
13570 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22  GroupBy, "GROUP"
13580 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
13590 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
135a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
135b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
135c0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
135d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
135e0 74 72 75 63 74 20 69 73 20 75 73 65 64 20 62 79  truct is used by
135f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
13600 0a 2a 2a 20 74 6f 20 73 61 76 65 20 61 67 67 72  .** to save aggr
13610 65 67 61 74 65 20 72 65 6c 61 74 65 64 20 69 6e  egate related in
13620 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
13630 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 0a  he Parse object.
13640 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
13650 6f 66 20 65 61 63 68 20 63 61 6c 6c 20 61 6e 64  of each call and
13660 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 20 61   to restore it a
13670 74 20 74 68 65 20 65 6e 64 2e 20 53 65 65 0a 2a  t the end. See.*
13680 2a 20 73 61 76 65 41 67 67 72 65 67 61 74 65 49  * saveAggregateI
13690 6e 66 6f 28 29 20 61 6e 64 20 72 65 73 74 6f 72  nfo() and restor
136a0 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 29  eAggregateInfo()
136b0 2e 0a 2a 2f 20 0a 73 74 72 75 63 74 20 41 67 67  ..*/ .struct Agg
136c0 72 65 67 61 74 65 49 6e 66 6f 20 7b 0a 20 20 69  regateInfo {.  i
136d0 6e 74 20 6e 41 67 67 3b 0a 20 20 41 67 67 45 78  nt nAgg;.  AggEx
136e0 70 72 20 2a 61 41 67 67 3b 0a 7d 3b 0a 74 79 70  pr *aAgg;.};.typ
136f0 65 64 65 66 20 73 74 72 75 63 74 20 41 67 67 72  edef struct Aggr
13700 65 67 61 74 65 49 6e 66 6f 20 41 67 67 72 65 67  egateInfo Aggreg
13710 61 74 65 49 6e 66 6f 3b 0a 0a 2f 2a 20 0a 2a 2a  ateInfo;../* .**
13720 20 43 6f 70 79 20 61 67 67 72 65 67 61 74 65 20   Copy aggregate 
13730 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74  related informat
13740 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 50 61 72  ion from the Par
13750 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
13760 69 6e 74 6f 20 74 68 65 20 41 67 67 72 65 67 61  into the Aggrega
13770 74 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  teInfo structure
13780 2e 20 5a 65 72 6f 20 74 68 65 20 61 67 67 72 65  . Zero the aggre
13790 67 61 74 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20  gate related.** 
137a0 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 50 61  values in the Pa
137b0 72 73 65 20 73 74 72 75 63 74 2e 0a 2a 2f 0a 73  rse struct..*/.s
137c0 74 61 74 69 63 20 76 6f 69 64 20 73 61 76 65 41  tatic void saveA
137d0 67 67 72 65 67 61 74 65 49 6e 66 6f 28 50 61 72  ggregateInfo(Par
137e0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 72  se *pParse, Aggr
137f0 65 67 61 74 65 49 6e 66 6f 20 2a 70 49 6e 66 6f  egateInfo *pInfo
13800 29 7b 0a 20 20 70 49 6e 66 6f 2d 3e 61 41 67 67  ){.  pInfo->aAgg
13810 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
13820 0a 20 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 20 3d  .  pInfo->nAgg =
13830 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 0a 20   pParse->nAgg;. 
13840 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20   pParse->aAgg = 
13850 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67  0;.  pParse->nAg
13860 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
13870 43 6f 70 79 20 61 67 67 72 65 67 61 74 65 20 72  Copy aggregate r
13880 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  elated informati
13890 6f 6e 20 66 72 6f 6d 20 74 68 65 20 41 67 67 72  on from the Aggr
138a0 65 67 61 74 65 49 6e 66 6f 20 73 74 72 75 63 74  egateInfo struct
138b0 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  .** back into th
138c0 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
138d0 65 2e 20 54 68 65 20 61 67 67 72 65 67 61 74 65  e. The aggregate
138e0 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61   related informa
138f0 74 69 6f 6e 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  tion.** currentl
13900 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
13910 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
13920 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  is deleted..*/.s
13930 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f  tatic void resto
13940 72 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28  reAggregateInfo(
13950 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
13960 67 67 72 65 67 61 74 65 49 6e 66 6f 20 2a 70 49  ggregateInfo *pI
13970 6e 66 6f 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  nfo){.  sqliteFr
13980 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67 29  ee(pParse->aAgg)
13990 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67  ;.  pParse->aAgg
139a0 20 3d 20 70 49 6e 66 6f 2d 3e 61 41 67 67 3b 0a   = pInfo->aAgg;.
139b0 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
139c0 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 3b 0a 7d 0a   pInfo->nAgg;.}.
139d0 20 20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74    ./*.** Generat
139e0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 67  e code for the g
139f0 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  iven SELECT stat
13a00 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
13a10 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
13a20 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
13a30 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
13a40 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c  ng on the.** val
13a50 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  ue of eDest and 
13a60 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
13a70 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20 20   eDest Value    
13a80 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
13a90 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
13aa0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
13ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
13ad0 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b      SRT_Callback
13ae0 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 63      Invoke the c
13af0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63 68  allback for each
13b00 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
13b10 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  lt..**.**     SR
13b20 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53 74  T_Mem         St
13b30 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c 74  ore first result
13b40 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
13b50 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
13b60 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
13b70 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
13b80 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 69   keys of table i
13b90 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
13ba0 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
13bb0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
13bc0 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
13bd0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
13be0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
13bf0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
13c00 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
13c10 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
13c20 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
13c30 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
13c40 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
13c50 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
13c60 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
13c70 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f 76  * The table abov
13c80 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e  e is incomplete.
13c90 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44 69    Additional eDi
13ca0 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62 65  st value have be
13cb0 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20   added.** since 
13cc0 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73  this comment was
13cd0 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20 74   written.  See t
13ce0 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
13cf0 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  op() function fo
13d00 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20  r.** a complete 
13d10 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 61  listing of the a
13d20 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
13d30 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72   eDest and their
13d40 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a   meanings..**.**
13d50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
13d60 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
13d70 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
13d80 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
13d90 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
13da0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
13db0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
13dc0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
13dd0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
13de0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13df0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
13e00 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
13e10 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
13e20 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
13e30 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
13e40 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a  to do that..**.*
13e50 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70  * The pParent, p
13e60 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70  arentTab, and *p
13e70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73  ParentAgg fields
13e80 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69   are filled in i
13e90 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54  f this.** SELECT
13ea0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20   is a subquery. 
13eb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13ec0 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65  y try to combine
13ed0 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20   this SELECT.** 
13ee0 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20  with its parent 
13ef0 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  to form a single
13f00 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e   flat query.  In
13f10 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69   so doing, it mi
13f20 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68  ght.** change th
13f30 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66  e parent query f
13f40 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67  rom a non-aggreg
13f50 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67  ate to an aggreg
13f60 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f  ate query..** Fo
13f70 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74  r that reason, t
13f80 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c  he pParentAgg fl
13f90 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ag is passed as 
13fa0 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74  a pointer, so it
13fb0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67  .** can be chang
13fc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ed..**.** Exampl
13fd0 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69  e 1:   The meani
13fe0 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e  ng of the pParen
13ff0 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  t parameter..**.
14000 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
14010 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c  ROM t1 JOIN (SEL
14020 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20  ECT x, count(*) 
14030 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33  FROM t2) JOIN t3
14040 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20  ;.**    \       
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
14060 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
14070 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   _______/       
14080 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20   /.**     \     
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f   /.**      \____
140d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
140e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
140f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
14100 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  /.**.** This rou
14110 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
14120 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14130 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20  ry first.   For 
14140 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50  that call,.** pP
14150 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55  arent will be NU
14160 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20  LL.  During the 
14170 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
14180 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74  e outer query, t
14190 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  his .** routine 
141a0 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
141b0 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20  ively to handle 
141c0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46  the subquery.  F
141d0 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
141e0 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e  .** call, pParen
141f0 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  t will point to 
14200 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
14210 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75    Because the su
14220 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65  bquery is.** the
14230 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
14240 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  in a three-way j
14250 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54  oin, the parentT
14260 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ab parameter wil
14270 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32  l.** be 1 (the 2
14280 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d  nd value of a 0-
14290 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a  indexed array.).
142a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
142b0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
142c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
142d0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
142e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
142f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14300 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
14310 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
14320 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65  oded. */.  int e
14330 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
14340 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
14350 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
14360 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
14370 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m,             /
14380 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75 73  * A parameter us
14390 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74 20  ed by the eDest 
143a0 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
143b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  */.  Select *pPa
143c0 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41  rent,       /* A
143d0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f  nother SELECT fo
143e0 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20  r which this is 
143f0 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  a sub-query */. 
14400 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20   int parentTab, 
14410 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14420 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72   in pParent->pSr
14430 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20  c of this query 
14440 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e  */.  int *pParen
14450 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54  tAgg,       /* T
14460 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75  rue if pParent u
14470 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
14480 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  nctions */.  cha
14490 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20  r *aff          
144a0 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
144b0 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
144c0 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
144d0 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  g */.){.  int i;
144e0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
144f0 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76 3b  Info;.  Vdbe *v;
14500 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
14510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14520 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
14530 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
14540 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
14550 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f   *pEList;      /
14560 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
14570 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
14580 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
14590 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
145a0 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
145b0 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
145c0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
145d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
145e0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
145f0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
14600 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
14610 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ;    /* The ORDE
14620 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  R BY clause.  Ma
14630 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
14640 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
14650 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
14660 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
14670 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
14680 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
14690 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
146a0 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
146b0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
146c0 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20  nt isDistinct;  
146d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
146e0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
146f0 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
14700 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
14710 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct;          /* 
14720 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72  Table to use for
14730 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
14740 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
14750 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
14760 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
14770 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
14780 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 72 65 67 61  ion */.  Aggrega
14790 74 65 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  teInfo sAggInfo;
147a0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
147b0 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c  malloc_failed ||
147c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
147d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   p==0 ) return 1
147e0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
147f0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14800 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
14810 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
14820 6e 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  n 1;..#ifndef SQ
14830 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
14840 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
14850 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
14860 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
14870 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
14880 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
14890 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
148a0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
148b0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
148c0 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
148d0 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20  , iParm, aff);. 
148e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 61 76   }.#endif..  sav
148f0 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 70  eAggregateInfo(p
14900 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
14910 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
14920 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
14930 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  f( eDest==SRT_Un
14940 69 6f 6e 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ion || eDest==SR
14950 54 5f 45 78 63 65 70 74 20 7c 7c 20 65 44 65 73  T_Except || eDes
14960 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
14970 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  {.    p->pOrderB
14980 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 0;.  }.  if(
14990 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
149a0 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c  solve(pParse, p,
149b0 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
149c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
149d0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
149e0 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
149f0 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
14a00 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
14a10 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
14a20 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
14a30 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
14a40 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
14a50 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
14a60 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
14a70 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
14a80 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d  aving;.  isAgg =
14a90 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44   p->isAgg;.  isD
14aa0 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
14ab0 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73  istinct;.  pELis
14ac0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
14ad0 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
14ae0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
14af0 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f  ;..  /* .  ** Do
14b00 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70   not even attemp
14b10 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  t to generate an
14b20 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76  y code if we hav
14b30 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20  e already seen. 
14b40 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72   ** errors befor
14b50 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  e this routine s
14b60 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tarts..  */.  if
14b70 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  ( pParse->nErr>0
14b80 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
14b90 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
14ba0 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
14bb0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
14bc0 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
14bd0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
14be0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
14bf0 0a 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74  .  assert( eDest
14c00 21 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  !=SRT_Exists || 
14c10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
14c20 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
14c30 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
14c40 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d 53  .  if( (eDest==S
14c50 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
14c60 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45 4c  =SRT_Set) && pEL
14c70 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b 0a  ist->nExpr>1 ){.
14c80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14c90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
14ca0 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
14cb0 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
14cc0 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
14cd0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
14ce0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
14cf0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
14d00 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
14d10 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  f..  /* ORDER BY
14d20 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
14d30 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
14d40 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
14d50 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
14d60 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a 20  ase SRT_Union:. 
14d70 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
14d80 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  pt:.    case SRT
14d90 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20 20  _Discard:.      
14da0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
14db0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
14dc0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72  efault:.      br
14dd0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  eak;.  }..  /* B
14de0 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
14df0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
14e00 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14e10 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14e20 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
14e30 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65  t_end;..  /* Ide
14e40 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
14e50 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
14e60 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
14e70 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
14e80 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
14e90 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
14ea0 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
14eb0 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
14ec0 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
14ed0 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
14ee0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
14ef0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
14f00 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
14f10 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
14f20 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14f30 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
14f40 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
14f50 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
14f60 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
14f70 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
14f80 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
14f90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
14fa0 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
14fb0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
14fc0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
14fd0 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
14fe0 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ontext = 0;.    
14ff0 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43  int needRestoreC
15000 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69 66 28  ontext;..    if(
15010 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
15020 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e  pSelect==0 ) con
15030 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
15040 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  TabList->a[i].zN
15050 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
15060 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
15070 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
15080 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  hContext;.      
15090 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
150a0 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73 74 2d  text = pTabList-
150b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
150c0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
150d0 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ntext = 1;.    }
150e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64  else{.      need
150f0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
15100 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
15110 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15120 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  se, pTabList->a[
15130 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  i].pSelect, SRT_
15140 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20 20  TempTable, .    
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
15160 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
15170 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67  sor, p, i, &isAg
15180 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  g, 0);.    if( n
15190 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
151a0 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  t ){.      pPars
151b0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
151c0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
151d0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
151e0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
151f0 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  c;.    pWhere = 
15200 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69  p->pWhere;.    i
15210 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 55 6e  f( eDest!=SRT_Un
15220 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d 53 52  ion && eDest!=SR
15230 54 5f 45 78 63 65 70 74 20 26 26 20 65 44 65 73  T_Except && eDes
15240 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t!=SRT_Discard )
15250 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
15260 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
15270 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70      }.    pGroup
15280 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
15290 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20  ;.    pHaving = 
152a0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20  p->pHaving;.    
152b0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
152c0 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  isDistinct;.  }.
152d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
152e0 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
152f0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
15300 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
15310 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
15320 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
15330 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
15340 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
15350 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
15360 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
15370 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
15380 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
15390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
153a0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
153b0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
153c0 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
153d0 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
153e0 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
153f0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
15400 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
15410 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
15420 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
15430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15440 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
15450 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e  Parent && pParen
15460 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c  tAgg &&.      fl
15470 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
15480 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
15490 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
154a0 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
154b0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
154c0 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
154d0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
154e0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
154f0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
15500 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
15510 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20  clause, resolve 
15520 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
15530 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d  quences.  ** nam
15540 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
15550 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  n explicitly spe
15560 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  cified..  */.  i
15570 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
15580 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
15590 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
155a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
155b0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a 4e  OrderBy->a[i].zN
155c0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ame ){.        p
155d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
155e0 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20 20  xpr->pColl = .  
155f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15600 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
15610 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
15620 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 29  >a[i].zName, -1)
15630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15640 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
15650 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f  nErr ){.      go
15660 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
15670 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
15680 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
15690 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69    */.  computeLi
156a0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
156b0 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49  rse, p);..  /* I
156c0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
156d0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
156e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
156f0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
15700 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
15710 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65  t==SRT_TempTable
15720 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15730 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
15740 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c 20  penTemp, iParm, 
15750 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
15760 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
15770 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
15780 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
15790 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  pr);.  }..  /* D
157a0 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
157b0 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65   aggregate expre
157c0 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
157d0 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f  f( isAgg || pGro
157e0 75 70 42 79 20 29 7b 0a 20 20 20 20 4e 61 6d 65  upBy ){.    Name
157f0 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
15800 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
15810 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
15820 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
15830 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
15840 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
15850 69 73 74 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ist;..    assert
15860 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d  ( pParse->nAgg==
15870 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20 3d  0 );.    isAgg =
15880 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
15890 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
158a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
158b0 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
158c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
158d0 73 4e 43 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  sNC, pEList->a[i
158e0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
158f0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
15900 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
15910 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75   }.    if( pGrou
15920 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  pBy ){.      for
15930 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
15940 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
15950 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
15960 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
15970 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 47  regates(&sNC, pG
15980 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
15990 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
159a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
159b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
159c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
159d0 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71 6c  ( pHaving && sql
159e0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
159f0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
15a00 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
15a10 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
15a20 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
15a30 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
15a40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
15a50 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
15a60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
15a70 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
15a80 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
15a90 4e 43 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  NC, pOrderBy->a[
15aa0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
15ab0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
15ac0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
15ad0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
15ae0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
15af0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a 20  the aggregator. 
15b00 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20   */.  if( isAgg 
15b10 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20  ){.    int addr 
15b20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15b30 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73 65  Op(v, OP_AggRese
15b40 74 2c 20 28 70 47 72 6f 75 70 42 79 3f 30 3a 31  t, (pGroupBy?0:1
15b50 29 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 29  ), pParse->nAgg)
15b60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15b70 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69  <pParse->nAgg; i
15b80 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  ++){.      FuncD
15b90 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 20  ef *pFunc;.     
15ba0 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70 50   if( (pFunc = pP
15bb0 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
15bc0 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e 63  unc)!=0 && pFunc
15bd0 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
15be0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45  {.        int nE
15bf0 78 70 72 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  xpr = 0;.#ifdef 
15c00 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 20  SQLITE_SSE.     
15c10 20 20 20 45 78 70 72 20 2a 70 41 67 67 45 78 70     Expr *pAggExp
15c20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  r = pParse->aAgg
15c30 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15c40 20 20 20 69 66 28 20 70 41 67 67 45 78 70 72 20     if( pAggExpr 
15c50 26 26 20 70 41 67 67 45 78 70 72 2d 3e 70 4c 69  && pAggExpr->pLi
15c60 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
15c70 6e 45 78 70 72 20 3d 20 70 41 67 67 45 78 70 72  nExpr = pAggExpr
15c80 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
15c90 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
15ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15cb0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
15cc0 67 49 6e 69 74 2c 20 6e 45 78 70 72 2c 20 69 2c  gInit, nExpr, i,
15cd0 20 28 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50   (char*)pFunc, P
15ce0 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  3_FUNCDEF);.    
15cf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
15d00 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
15d10 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 69 7a      int sz = siz
15d20 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 70  eof(KeyInfo) + p
15d30 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2a 73  GroupBy->nExpr*s
15d40 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
15d50 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
15d60 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20  pKey = (KeyInfo 
15d70 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  *)sqliteMalloc(s
15d80 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  z);.      if( 0=
15d90 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  =pKey ){.       
15da0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15dc0 70 4b 65 79 2d 3e 65 6e 63 20 3d 20 70 50 61 72  pKey->enc = pPar
15dd0 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
15de0 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
15df0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
15e00 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
15e10 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
15e20 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
15e30 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
15e40 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
15e50 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15e60 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
15e70 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
15e80 28 20 21 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69  ( !pKey->aColl[i
15e90 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ] ){.          p
15ea0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
15eb0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
15ec0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  tColl;.        }
15ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15ee0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15ef0 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
15f00 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  r *)pKey, P3_KEY
15f10 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
15f20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15f30 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
15f40 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c  mory cell to NUL
15f50 4c 20 66 6f 72 20 53 52 54 5f 4d 65 6d 20 6f 72  L for SRT_Mem or
15f60 20 30 20 66 6f 72 20 53 52 54 5f 45 78 69 73 74   0 for SRT_Exist
15f70 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  s.  */.  if( eDe
15f80 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
15f90 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
15fa0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15fb0 64 62 65 41 64 64 4f 70 28 76 2c 20 65 44 65 73  dbeAddOp(v, eDes
15fc0 74 3d 3d 53 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f  t==SRT_Mem ? OP_
15fd0 4e 75 6c 6c 20 3a 20 4f 50 5f 49 6e 74 65 67 65  Null : OP_Intege
15fe0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
15ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16000 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
16010 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
16020 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f   /* Open a tempo
16030 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75 73  rary table to us
16040 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
16050 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
16060 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
16070 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
16080 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
16090 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64 65      openTempInde
160a0 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69 73  x(pParse, p, dis
160b0 74 69 6e 63 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  tinct);.  }else{
160c0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
160d0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  -1;.  }..  /* Be
160e0 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
160f0 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49   scan.  */.  pWI
16100 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
16110 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
16120 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
16130 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16150 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20 26 70  GroupBy ? 0 : &p
16160 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
16170 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
16180 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
16190 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
161a0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69  ard inner loop i
161b0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 65 61  f we are not dea
161c0 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a 20 61  ling with.  ** a
161d0 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f 0a 20  ggregates.  */. 
161e0 20 69 66 28 20 21 69 73 41 67 67 20 29 7b 0a 20   if( !isAgg ){. 
161f0 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
16200 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
16210 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
16220 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
16230 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
16250 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69 43  Parm, pWInfo->iC
16260 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d  ontinue, pWInfo-
16270 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29 7b  >iBreak, aff) ){
16280 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  .       goto sel
16290 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
162a0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
162b0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
162c0 61 67 67 72 65 67 61 74 65 73 2c 20 74 68 65 6e  aggregates, then
162d0 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   do the special 
162e0 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a 20 70  aggregate.  ** p
162f0 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20 20 2a  rocessing.  .  *
16300 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 41 67  /.  else{.    Ag
16310 67 45 78 70 72 20 2a 70 41 67 67 3b 0a 20 20 20  gExpr *pAgg;.   
16320 20 69 6e 74 20 6c 62 6c 31 20 3d 20 30 3b 0a 20   int lbl1 = 0;. 
16330 20 20 20 70 50 61 72 73 65 2d 3e 66 69 6c 6c 41     pParse->fillA
16340 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  gg = 1;.    if( 
16350 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
16360 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72    for(i=0; i<pGr
16370 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
16380 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
16390 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
163a0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
163b0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
163c0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61   }.      /* No a
163d0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
163e0 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
163f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d  e following OP_M
16400 61 6b 65 52 65 63 6f 72 64 20 0a 20 20 20 20 20  akeRecord .     
16410 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20 64   ** because we d
16420 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f  o not need to do
16430 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f 66   any coercion of
16440 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a 20   datatypes. */. 
16450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16460 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
16470 52 65 63 6f 72 64 2c 20 70 47 72 6f 75 70 42 79  Record, pGroupBy
16480 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
16490 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
164a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
164b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
164c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
164d0 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62 6c  AggFocus, 0, lbl
164e0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
164f0 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61 72  r(i=0, pAgg=pPar
16500 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61 72  se->aAgg; i<pPar
16510 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20 70  se->nAgg; i++, p
16520 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Agg++){.      if
16530 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20  ( pAgg->isAgg ) 
16540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16550 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
16560 70 50 61 72 73 65 2c 20 70 41 67 67 2d 3e 70 45  pParse, pAgg->pE
16570 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
16580 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16590 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69 29  OP_AggSet, 0, i)
165a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
165b0 73 65 2d 3e 66 69 6c 6c 41 67 67 20 3d 20 30 3b  se->fillAgg = 0;
165c0 0a 20 20 20 20 69 66 28 20 6c 62 6c 31 3c 30 20  .    if( lbl1<0 
165d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
165e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
165f0 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d  (v, lbl1);.    }
16600 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 41  .    for(i=0, pA
16610 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67 3b  gg=pParse->aAgg;
16620 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
16630 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20   i++, pAgg++){. 
16640 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
16650 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a       int nExpr;.
16660 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
16670 44 65 66 3b 0a 20 20 20 20 20 20 69 66 28 20 21  Def;.      if( !
16680 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f  pAgg->isAgg ) co
16690 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
166a0 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e  sert( pAgg->pFun
166b0 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
166c0 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75 6e  sert( pAgg->pFun
166d0 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a 20  c->xStep!=0 );. 
166e0 20 20 20 20 20 70 44 65 66 20 3d 20 70 41 67 67       pDef = pAgg
166f0 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70  ->pFunc;.      p
16700 45 20 3d 20 70 41 67 67 2d 3e 70 45 78 70 72 3b  E = pAgg->pExpr;
16710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16720 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  E!=0 );.      as
16730 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b  sert( pE->op==TK
16740 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
16750 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73  .      nExpr = s
16760 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
16770 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
16780 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  E->pList);.     
16790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
167a0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
167b0 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   i, 0);.      if
167c0 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
167d0 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 43  Seq ){.        C
167e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
167f0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  0;.        int j
16800 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
16810 30 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  0; !pColl && j<n
16820 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
16830 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
16840 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
16850 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
16860 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
16870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16880 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
16890 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
168a0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
168b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
168c0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c  beOp3(v, OP_Coll
168d0 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Seq, 0, 0, (char
168e0 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c   *)pColl, P3_COL
168f0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
16900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16910 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 75 6e  Op3(v, OP_AggFun
16920 63 2c 20 30 2c 20 6e 45 78 70 72 2c 20 28 63 68  c, 0, nExpr, (ch
16930 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e  ar*)pDef, P3_FUN
16940 43 44 45 46 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  CDEF);.    }.  }
16950 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
16960 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
16970 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
16980 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
16990 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  );..  /* If we a
169a0 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  re processing ag
169b0 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65 65  gregates, we nee
169c0 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73 65  d to set up a se
169d0 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f  cond loop.  ** o
169e0 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ver all of the a
169f0 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73 20  ggregate values 
16a00 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 6d  and process them
16a10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41  ..  */.  if( isA
16a20 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 6e  gg ){.    int en
16a30 64 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64  dagg = sqlite3Vd
16a40 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16a50 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67 67      int startagg
16a60 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20 3d  ;.    startagg =
16a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a80 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74 2c  p(v, OP_AggNext,
16a90 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20 20   0, endagg);.   
16aa0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
16ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16ac0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16ad0 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74 61   pHaving, starta
16ae0 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  gg, 1);.    }.  
16af0 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e 65    if( selectInne
16b00 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
16b10 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70   pEList, 0, 0, p
16b20 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63  OrderBy, distinc
16b30 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20 20  t, eDest,.      
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
16b50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20 65  arm, startagg, e
16b60 6e 64 61 67 67 2c 20 61 66 66 29 20 29 7b 0a 20  ndagg, aff) ){. 
16b70 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
16b80 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
16b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ba0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16bb0 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20 73  startagg);.    s
16bc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16bd0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67 67  eLabel(v, endagg
16be0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16bf0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
16c00 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  op, 0, 0);.  }..
16c10 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
16c20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
16c30 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
16c40 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
16c50 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
16c60 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
16c70 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
16c80 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
16c90 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
16ca0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
16cb0 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
16cc0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
16cd0 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d  est, iParm);.  }
16ce0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16cf0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
16d00 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
16d10 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20 68  a subquery, we h
16d20 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65  ave now converte
16d30 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  d the subquery i
16d40 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  nto a.  ** tempo
16d50 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20  rary table.  So 
16d60 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 71 75  delete the subqu
16d70 65 72 79 20 73 74 72 75 63 74 75 72 65 20 66 72  ery structure fr
16d80 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20  om the parent.  
16d90 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
16da0 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d  is subquery from
16db0 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
16dc0 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f   again and to fo
16dd0 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  rce the.  ** the
16de0 20 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70   use of the temp
16df0 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a  orary table..  *
16e00 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
16e10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16e20 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53  Parent->pSrc->nS
16e30 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a  rc>parentTab );.
16e40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
16e50 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
16e60 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d  entTab].pSelect=
16e70 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =p );.    sqlite
16e80 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29  3SelectDelete(p)
16e90 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70  ;.    pParent->p
16ea0 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
16eb0 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20  ].pSelect = 0;. 
16ec0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16ed0 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
16ee0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
16ef0 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
16f00 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
16f10 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
16f20 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
16f30 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
16f40 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
16f50 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
16f60 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
16f70 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
16f80 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
16f90 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
16fa0 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
16fb0 5f 65 6e 64 3a 0a 20 20 72 65 73 74 6f 72 65 41  _end:.  restoreA
16fc0 67 67 72 65 67 61 74 65 49 6e 66 6f 28 70 50 61  ggregateInfo(pPa
16fd0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
16fe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.