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

Artifact 79bd7f97345ee4291e7f4d469307b185eb2cba8f:


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 36 30  select.c,v 1.260
0200: 20 32 30 30 35 2f 30 39 2f 30 35 20 32 30 3a 30   2005/09/05 20:0
0210: 36 3a 34 39 20 64 72 68 20 45 78 70 20 24 0a 2a  6:49 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 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0820: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
0830: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0840: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
0850: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0860: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20  addrOpenVirt[2] 
0870: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0880: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0890: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
08a0: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
08b0: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
08c0: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
08d0: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
08e0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
08f0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0900: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0910: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0920: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0930: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0940: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0950: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0960: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0970: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0980: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0990: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
09a0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
09b0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
09c0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
09d0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
09e0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
09f0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0a00: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0a10: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0a20: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0a30: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0a40: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0a50: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a70: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a80: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0a90: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0aa0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0ab0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0ac0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0ad0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0ae0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0af0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0b00: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0b10: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0b20: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0b30: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0b40: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0b50: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b60: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b70: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b80: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0b90: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0ba0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0bb0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0bc0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0bd0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0be0: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0bf0: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0c00: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0c10: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c20: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0c30: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c40: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
0c50: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
0c60: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
0c70: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
0c80: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
0c90: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
0ca0: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
0cb0: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
0cc0: 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65  j=0; j<sizeof(ke
0cd0: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0ce0: 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b  eywords[0]); j++
0cf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
0d00: 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e  n==keywords[j].n
0d10: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
0d20: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
0d30: 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  mp(p->z, keyword
0d40: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
0d50: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
0d60: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
0d70: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
0d80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0da0: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
0db0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0dc0: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
0dd0: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
0de0: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
0df0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0e00: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
0e10: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
0e20: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
0e30: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
0e40: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
0e50: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
0e60: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
0e70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
0e80: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
0e90: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
0ea0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0eb0: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
0ec0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
0ed0: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
0ee0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0ef0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
0f00: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0f10: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
0f20: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
0f30: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
0f40: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
0f50: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
0f70: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
0f80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0f90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0fa0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
0fb0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
0fc0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
0fd0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
0fe0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0ff0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
1000: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
1010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1020: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
1030: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1040: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1050: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1060: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1070: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1090: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
10a0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
10b0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
10c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
10e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10f0: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1100: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
1110: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
1120: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1130: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
1140: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
1150: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
1160: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1170: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
1180: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
1190: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
11a0: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a   *z){.  p->z = z
11b0: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65  ;.  p->n = strle
11c0: 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d  n(z);.  p->dyn =
11d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
11e0: 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
11f0: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64  n node for an id
1200: 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 68  entifier with th
1210: 65 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a  e name of zName.
1220: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
1230: 63 72 65 61 74 65 49 64 45 78 70 72 28 63 6f 6e  createIdExpr(con
1240: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1250: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1260: 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d    setToken(&dumm
1270: 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  y, zName);.  ret
1280: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
1290: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
12a0: 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  mmy);.}.../*.** 
12b0: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
12c0: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
12d0: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
12e0: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
12f0: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
1300: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
1310: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
1320: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
1330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1340: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e  WhereTerm(.  con
1350: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1360: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1370: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1380: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1390: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
13a0: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
13b0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
13c0: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
13d0: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
13e0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
13f0: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
1400: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
1410: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
1420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1430: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
1440: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
1450: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1460: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  L */.  Expr **pp
1470: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1480: 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c  /* Add the equal
1490: 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73  ity term to this
14a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
14b0: 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20  {.  Expr *pE1a, 
14c0: 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20  *pE1b, *pE1c;.  
14d0: 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32  Expr *pE2a, *pE2
14e0: 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72  b, *pE2c;.  Expr
14f0: 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20   *pE;..  pE1a = 
1500: 63 72 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f  createIdExpr(zCo
1510: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 63 72 65  l);.  pE2a = cre
1520: 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b  ateIdExpr(zCol);
1530: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d  .  if( zAlias1==
1540: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31  0 ){.    zAlias1
1550: 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b   = pTab1->zName;
1560: 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 63 72  .  }.  pE1b = cr
1570: 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61  eateIdExpr(zAlia
1580: 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  s1);.  if( zAlia
1590: 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s2==0 ){.    zAl
15a0: 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e  ias2 = pTab2->zN
15b0: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20  ame;.  }.  pE2b 
15c0: 3d 20 63 72 65 61 74 65 49 64 45 78 70 72 28 7a  = createIdExpr(z
15d0: 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20  Alias2);.  pE1c 
15e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
15f0: 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61  _DOT, pE1b, pE1a
1600: 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73  , 0);.  pE2c = s
1610: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
1620: 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30  T, pE2b, pE2a, 0
1630: 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65  );.  pE = sqlite
1640: 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70 45 31  3Expr(TK_EQ, pE1
1650: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 45  c, pE2c, 0);.  E
1660: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1670: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  E, EP_FromJoin);
1680: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c  .  *ppExpr = sql
1690: 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70 45  ite3ExprAnd(*ppE
16a0: 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, pE);.}../*.
16b0: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
16c0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
16d0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
16e0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
16f0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
1700: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
1710: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
1720: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
1730: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
1740: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
1750: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
1760: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1770: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1780: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1790: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
17a0: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
17b0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
17c0: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
17d0: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
17e0: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
17f0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
1800: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
1810: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
1820: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
1830: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
1840: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
1850: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
1860: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1870: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1880: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
1890: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
18a0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69  (Expr *p){.  whi
18b0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
18c0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
18d0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
18e0: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
18f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d  >pLeft);.    p =
1900: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
1910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1920: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
1930: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
1940: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
1950: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1960: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1970: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1980: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1990: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
19a0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
19b0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
19c0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
19d0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
19e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
19f0: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
1a00: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
1a10: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
1a20: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
1a30: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
1a40: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
1a50: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
1a60: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
1a70: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
1a80: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
1a90: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
1aa0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
1ab0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
1ac0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
1ad0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
1ae0: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
1af0: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
1b00: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
1b10: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
1b20: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
1b30: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
1b40: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
1b50: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
1b60: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1b70: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
1b80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b90: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1ba0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
1bb0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1bc0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
1bd0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
1be0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
1bf0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
1c20: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1c30: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
1c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c60: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
1c70: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c80: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
1c90: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
1ca0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
1cb0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1cc0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
1cd0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
1ce0: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
1cf0: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1d00: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
1d10: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
1d20: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
1d30: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
1d40: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
1d50: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
1d60: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
1d70: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
1d80: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
1d90: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
1da0: 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  t->pTab;..    if
1db0: 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c  ( pLeftTab==0 ||
1dc0: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20   pRightTab==0 ) 
1dd0: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
1de0: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
1df0: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
1e00: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
1e10: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
1e20: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
1e30: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
1e40: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
1e50: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
1e70: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
1e80: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
1e90: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c  f( pLeft->pOn ||
1ea0: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
1eb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ec0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ed0: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
1ee0: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
1ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
1f00: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1f10: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
1f20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1f30: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
1f40: 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43  ; j<pLeftTab->nC
1f50: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1f60: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1f70: 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pLeftTab->aCol[j
1f80: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1f90: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
1fa0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
1fb0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1fc0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
1fd0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
1fe0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2010: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2020: 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57  ->zAlias, &p->pW
2030: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
2040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2050: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
2060: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2070: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
2080: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
2090: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
20a0: 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70  >pOn && pLeft->p
20b0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
20c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20d0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
20e0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
20f0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
2100: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
2110: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
2120: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2130: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
2140: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
2150: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2160: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
2170: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
2180: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
2190: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21a0: 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20   pLeft->pOn ){. 
21b0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
21c0: 28 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20  (pLeft->pOn);.  
21d0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
21e0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
21f0: 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66 74 2d  ->pWhere, pLeft-
2200: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65  >pOn);.      pLe
2210: 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ft->pOn = 0;.   
2220: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2230: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
2240: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2250: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
2260: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
2270: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2280: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
2290: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
22a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
22b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
22c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
22d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
22e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
22f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
2300: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2310: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
2320: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
2330: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
2340: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
2350: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
2360: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
2370: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
2380: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
2390: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
23a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
23b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
23c0: 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ft->pUsing ){.  
23d0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
23e0: 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e  t = pLeft->pUsin
23f0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
2400: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
2410: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2420: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73  ar *zName = pLis
2430: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
2440: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
2450: 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c  nIndex(pLeftTab,
2460: 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c   zName)<0 || col
2470: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2480: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  ab, zName)<0 ){.
2490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24b0: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
24c0: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
24d0: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
24e0: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
24f0: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
2500: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
2510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2530: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a    addWhereTerm(z
2540: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2550: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2580: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2590: 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65 72  Alias, &p->pWher
25a0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
25b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
25c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
25d0: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
25e0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
25f0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
2600: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
2610: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2620: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
2630: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
2640: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2650: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2660: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
2670: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2680: 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73  te(p->pSrc);.  s
2690: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26a0: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 73  (p->pWhere);.  s
26b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
26c0: 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  lete(p->pGroupBy
26d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
26e0: 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69 6e  Delete(p->pHavin
26f0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
2700: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
2710: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2720: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2730: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73 71  p->pPrior);.  sq
2740: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2750: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
2760: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2770: 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 73  p->pOffset);.  s
2780: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2790: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
27a0: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
27b0: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
27c0: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
27d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
27e0: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
27f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2800: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
2810: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 56  Parse *pParse, V
2820: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
2830: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 73   *pOrderBy){.  s
2840: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2850: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2860: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2870: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2880: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
2890: 64 65 72 42 79 2d 3e 69 54 61 62 2c 20 30 29 3b  derBy->iTab, 0);
28a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
28b0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
28c0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
28d0: 2b 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  + 1, 0);.  sqlit
28e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
28f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f  P_MakeRecord, pO
2900: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20  rderBy->nExpr + 
2910: 32 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  2, 0);.  sqlite3
2920: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2930: 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65  IdxInsert, pOrde
2940: 72 42 79 2d 3e 69 54 61 62 2c 20 30 29 3b 0a 7d  rBy->iTab, 0);.}
2950: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
2960: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2970: 65 20 4f 46 46 53 45 54 20 61 6e 64 20 4c 49 4d  e OFFSET and LIM
2980: 49 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  IT.*/.static voi
2990: 64 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a 20  d codeLimiter(. 
29a0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
29b0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
29c0: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
29d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
29e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
29f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2a00: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
2a10: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
2a20: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2a30: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
2a40: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ent record */.  
2a50: 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20  int iBreak,     
2a60: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2a70: 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a  o end the loop *
2a80: 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20  /.  int nPop    
2a90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2aa0: 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20  of times to pop 
2ab0: 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69  stack when jumpi
2ac0: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ng */.){.  if( p
2ad0: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b 0a  ->iOffset>=0 ){.
2ae0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
2af0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2b00: 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20  tAddr(v) + 3;.  
2b10: 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61    if( nPop>0 ) a
2b20: 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  ddr++;.    sqlit
2b30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2b40: 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f  P_MemIncr, p->iO
2b50: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
2b60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2b70: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
2b80: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
2b90: 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e  );.    if( nPop>
2ba0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2bb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2bc0: 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b  P_Pop, nPop, 0);
2bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2be0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2bf0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
2c00: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
2c10: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
2c20: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
2c30: 73 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  s"));.  }.  if( 
2c40: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a  p->iLimit>=0 ){.
2c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c60: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
2c70: 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  cr, p->iLimit, i
2c80: 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
2c90: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65  Comment((v, "# e
2ca0: 78 69 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 72  xit when LIMIT r
2cb0: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a 7d  eached"));.  }.}
2cc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2cd0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
2ce0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
2cf0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
2d00: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
2d10: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
2d20: 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f  f srcTab and nCo
2d30: 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65  lumn are both ze
2d40: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ro, then the pEL
2d50: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
2d60: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
2d70: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
2d80: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
2d90: 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c  is row.  If nCol
2da0: 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61  umn>0.** then da
2db0: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
2dc0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
2dd0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
2de0: 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64   to get the.** d
2df0: 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63  atatypes for eac
2e00: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  h column..*/.sta
2e10: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e  tic int selectIn
2e20: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
2e30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2e40: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2e50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
2e60: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
2e70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
2e80: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
2e90: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2ea0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
2eb0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
2ec0: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
2ed0: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
2ee0: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
2ef0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
2f00: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
2f10: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2f20: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
2f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f40: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2f50: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
2f60: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2f70: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
2f80: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  * If not NULL, s
2f90: 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e  ort results usin
2fa0: 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20  g this key */.  
2fb0: 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20  int distinct,   
2fc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d          /* If >=
2fd0: 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73  0, make sure res
2fe0: 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63  ults are distinc
2ff0: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  t */.  int eDest
3000: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3010: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
3020: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
3030: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  An argument to t
3060: 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  he disposal meth
3070: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  od */.  int iCon
3080: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
3090: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
30a0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
30b0: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
30c0: 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20  iBreak,         
30d0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
30e0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
30f0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
3100: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
3130: 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  if eDest is SRT_
3140: 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64  Union */.){.  Vd
3150: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
3160: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
3170: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
3180: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
3190: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
31a0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
31b0: 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76  sent */..  if( v
31c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
31d0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
31e0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  !=0 );..  /* If 
31f0: 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49  there was a LIMI
3200: 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  T clause on the 
3210: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3220: 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68  , then do the ch
3230: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
3240: 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75  if this row shou
3250: 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ld be output..  
3260: 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  */.  hasDistinct
3270: 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26   = distinct>=0 &
3280: 26 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  & pEList && pELi
3290: 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69  st->nExpr>0;.  i
32a0: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  f( pOrderBy==0 &
32b0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
32c0: 7b 0a 20 20 20 20 63 6f 64 65 4c 69 6d 69 74 65  {.    codeLimite
32d0: 72 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  r(v, p, iContinu
32e0: 65 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  e, iBreak, 0);. 
32f0: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
3300: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
3310: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
3320: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
3330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3340: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
3350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3360: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
3370: 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20  srcTab, i);.    
3380: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
3390: 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d  Column = pEList-
33a0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c 69  >nExpr;.    sqli
33b0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
33c0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
33d0: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  st);.  }..  /* I
33e0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
33f0: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
3400: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
3410: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
3420: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
3430: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
3440: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
3450: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
3460: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
3470: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
3480: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
3490: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 4c 69      int n = pELi
34a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 23 69 66 20 4e  st->nExpr;.#if N
34b0: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
34c0: 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 33 56  NCT.    sqlite3V
34d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
34e0: 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e  sNull, -pEList->
34f0: 6e 45 78 70 72 2c 20 73 71 6c 69 74 65 33 56 64  nExpr, sqlite3Vd
3500: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3510: 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  +7);.#endif.    
3520: 2f 2a 20 44 65 6c 69 62 65 72 61 74 65 6c 79 20  /* Deliberately 
3530: 6c 65 61 76 65 20 74 68 65 20 61 66 66 69 6e 69  leave the affini
3540: 74 79 20 73 74 72 69 6e 67 20 6f 66 66 20 6f 66  ty string off of
3550: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
3560: 20 20 20 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65 63     ** OP_MakeRec
3570: 6f 72 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ord */.    sqlit
3580: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3590: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d 6e  P_MakeRecord, -n
35a0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
35b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
35c0: 5f 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74 69  _Distinct, disti
35d0: 6e 63 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  nct, sqlite3Vdbe
35e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
35f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
3610: 70 2c 20 6e 2b 31 2c 20 30 29 3b 0a 20 20 20 20  p, n+1, 0);.    
3620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3630: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
3640: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
3650: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
3660: 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e  "# skip indistin
3670: 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ct records"));. 
3680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3690: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
36a0: 65 72 74 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  ert, distinct, 0
36b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  );.    if( pOrde
36c0: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
36d0: 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20 70  codeLimiter(v, p
36e0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72  , iContinue, iBr
36f0: 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  eak, nColumn);. 
3700: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74     }.  }..  swit
3710: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 23 69 66  ch( eDest ){.#if
3720: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3730: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
3740: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
3750: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
3760: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
3770: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
3780: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
3790: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
37a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
37b0: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
37c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37d0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
37e0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c  rd, nColumn, NUL
37f0: 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43  L_ALWAYS_DISTINC
3800: 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
3810: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
3820: 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41   -1, aff, P3_STA
3830: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
3840: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3850: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
3860: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
3870: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3880: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
3890: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
38a0: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
38b0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
38c0: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
38d0: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
38e0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
38f0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
3900: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
3910: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
3920: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3930: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
3940: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
3950: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
3960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3970: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3980: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
3990: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
39a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
39b0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
39c0: 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29   aff, P3_STATIC)
39d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
39e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
39f0: 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20  otFound, iParm, 
3a00: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
3a10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3a20: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50  v, OP_Delete, iP
3a30: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
3a40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3a50: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  if..    /* Store
3a60: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
3a70: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
3a80: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
3a90: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
3aa0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
3ab0: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
3ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3ad0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3ae0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3af0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
3b00: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
3b10: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
3b20: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
3b30: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
3b40: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3b50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3b60: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
3b70: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
3b80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3b90: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
3ba0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3bb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3bc0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
3bd0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
3be0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3bf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3c00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
3c10: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
3c20: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
3c30: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
3c40: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
3c50: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
3c60: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
3c70: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
3c80: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
3c90: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
3ca0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
3cb0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
3cc0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
3cd0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
3ce0: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
3cf0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
3d00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3d10: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  );.      int add
3d20: 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  r2;..      asser
3d30: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
3d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3d50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
3d60: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31  tNull, -1, addr1
3d70: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
3d80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3d90: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
3da0: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
3db0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3dc0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
3dd0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
3de0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  By ){.        /*
3df0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
3e00: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
3e10: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
3e20: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
3e30: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
3e40: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
3e50: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
3e60: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
3e70: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
3e80: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
3e90: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
3ea0: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
3eb0: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
3ec0: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
3ed0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
3ee0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
3ef0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
3f00: 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b  e, v, pOrderBy);
3f10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3f20: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d        char aff =
3f30: 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78 46   (iParm>>16)&0xF
3f40: 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  F;.        aff =
3f50: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
3f60: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
3f70: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
3f80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3f90: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
3fa0: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
3fb0: 20 26 61 66 66 2c 20 31 29 3b 0a 20 20 20 20 20   &aff, 1);.     
3fc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3fd0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
3fe0: 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30  ert, (iParm&0x00
3ff0: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
4000: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4010: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
4020: 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65 33  , addr2, sqlite3
4030: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4040: 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  v));.      break
4050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4060: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
4070: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
4080: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
4090: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
40a0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
40b0: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
40c0: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
40d0: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
40e0: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
40f0: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
4100: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4110: 54 5f 45 78 69 73 74 73 3a 0a 20 20 20 20 63 61  T_Exists:.    ca
4120: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
4130: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
4140: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
4150: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
4160: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4170: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4180: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
4190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
41a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41b0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
41c0: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
41d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
41e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
41f0: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
4200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4210: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4220: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
4230: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4240: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64   */..    /* Send
4250: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
4260: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
4270: 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f  on or to a subro
4280: 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20  utine.  In the. 
4290: 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20     ** case of a 
42a0: 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  subroutine, the 
42b0: 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c  subroutine itsel
42c0: 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  f is responsible
42d0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70   for.    ** popp
42e0: 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f  ing the data fro
42f0: 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  m the stack..   
4300: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4310: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20  _Subroutine:.   
4320: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
4330: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
4340: 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20 20  _Sorter: {.     
4350: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4360: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4370: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4380: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
4390: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  umn, 0);.       
43a0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
43b0: 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65  pParse, v, pOrde
43c0: 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rBy);.      }els
43d0: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
43e0: 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20  _Subroutine ){. 
43f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4410: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
4420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4430: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4440: 73 74 21 3d 53 52 54 5f 53 6f 72 74 65 72 20 29  st!=SRT_Sorter )
4450: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4460: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4470: 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75  _Callback, nColu
4480: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  mn, 0);.      }.
4490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44a0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
44b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
44c0: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
44d0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
44e0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
44f0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
4500: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
4510: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
4520: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
4530: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
4540: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
4550: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
4560: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
4570: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
4580: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
4590: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
45a0: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
45b0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
45c0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
45d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
45e0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
45f0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4600: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4610: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4620: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4630: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4640: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
4650: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4660: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
4670: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
4680: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
4690: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
46a0: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
46b0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
46c0: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
46d0: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
46e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
46f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
4700: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
4710: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
4720: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
4730: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
4740: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
4750: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
4760: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
4770: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
4780: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
4790: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
47a0: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
47b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
47c0: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
47d0: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
47e0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
47f0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
4800: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
4810: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
4820: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
4830: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
4840: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
4850: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
4860: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72  ure is obtain fr
4870: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
4880: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
4890: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
48a0: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
48b0: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
48c0: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
48d0: 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74  ** freed.  Add t
48e0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
48f0: 74 75 72 65 20 74 6f 20 74 68 65 20 50 33 20 66  ture to the P3 f
4900: 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64  ield of an opcod
4910: 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45  e using.** P3_KE
4920: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73  YINFO_HANDOFF is
4930: 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f   the usual way o
4940: 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74  f dealing with t
4950: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  his..*/.static K
4960: 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46  eyInfo *keyInfoF
4970: 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73  romExprList(Pars
4980: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
4990: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
49a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
49b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
49c0: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
49d0: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
49e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
49f0: 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
4a00: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
4a10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
4a20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4a30: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20   sizeof(*pInfo) 
4a40: 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
4a50: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
4a60: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
4a70: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
4a80: 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29 26 70  rder = (char*)&p
4a90: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70  Info->aColl[nExp
4aa0: 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  r];.    pInfo->n
4ab0: 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20  Field = nExpr;. 
4ac0: 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20     pInfo->enc = 
4ad0: 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 66 6f 72  db->enc;.    for
4ae0: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
4af0: 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69  t->a; i<nExpr; i
4b00: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
4b10: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
4b20: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
4b30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
4b40: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
4b50: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
4b60: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
4b70: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
4b80: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
4b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
4ba0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
4bb0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
4bc0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
4bd0: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
4be0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
4bf0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
4c00: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
4c10: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
4c20: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
4c30: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
4c40: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
4c50: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
4c60: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
4c70: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
4c80: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
4c90: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
4ca0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
4cb0: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
4cc0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
4cd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
4ce0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
4cf0: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
4d00: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
4d10: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
4d20: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
4d30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4d40: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
4d50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
4d60: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a  ect *p,       /*
4d70: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
4d80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20  ement */.  Vdbe 
4d90: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47  *v,         /* G
4da0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4db0: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
4dc0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
4dd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4de0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
4df0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
4e00: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4e10: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
4e20: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
4e30: 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f  Parm        /* O
4e40: 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65  ptional paramete
4e50: 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
4e60: 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20  h eDest */.){.  
4e70: 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65  int brk = sqlite
4e80: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4e90: 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20  );.  int cont = 
4ea0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4eb0: 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61  abel(v);.  int a
4ec0: 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  ddr;.  int iTab;
4ed0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
4ee0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
4ef0: 72 42 79 3b 0a 0a 20 20 69 66 28 20 65 44 65 73  rBy;..  if( eDes
4f00: 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20  t==SRT_Sorter ) 
4f10: 72 65 74 75 72 6e 3b 0a 20 20 69 54 61 62 20 3d  return;.  iTab =
4f20: 20 70 4f 72 64 65 72 42 79 2d 3e 69 54 61 62 3b   pOrderBy->iTab;
4f30: 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71  .  addr = 1 + sq
4f40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4f50: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
4f60: 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4c 69 6d   brk);.  codeLim
4f70: 69 74 65 72 28 76 2c 20 70 2c 20 63 6f 6e 74 2c  iter(v, p, cont,
4f80: 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69   brk, 0);.  sqli
4f90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4fa0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
4fb0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
4fc0: 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28   + 1);.  switch(
4fd0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
4fe0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4ff0: 20 20 63 61 73 65 20 53 52 54 5f 54 65 6d 70 54    case SRT_TempT
5000: 61 62 6c 65 3a 20 7b 0a 20 20 20 20 20 20 73 71  able: {.      sq
5010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5020: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
5030: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
5040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5050: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
5060: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5070: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5080: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5090: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
50a0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
50b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
50c0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
50d0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
50e0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
50f0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5100: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5110: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
5120: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5130: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
5140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5150: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
5160: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5180: 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
5190: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
51a0: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
51b0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
51c0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
51d0: 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53 54  1, 0, "n", P3_ST
51e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
51f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5200: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28   OP_IdxInsert, (
5210: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
5220: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
5230: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5240: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 0a 20  se SRT_Exists:. 
5250: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
5260: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5270: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
52a0: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
52b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
52c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
52d0: 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20 20  to, 0, brk);.   
52e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
52f0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
5300: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20  SRT_Callback:.  
5310: 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f    case SRT_Subro
5320: 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
5330: 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
5340: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5350: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 70  OP_Integer, p->p
5360: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29  EList->nExpr, 0)
5370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5380: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
5390: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
53a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
53b0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
53c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
53d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
53e0: 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20  n, -1-i, i);.   
53f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
5400: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
5410: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
5420: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5430: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
5440: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
5450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5470: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
5480: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
5490: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
54a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
54b0: 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  op, 2, 0);.     
54c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
54d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
54e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
54f0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
5500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5510: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5520: 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20  abel(v, cont);. 
5530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5540: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
5550: 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c  ab, addr);.  sql
5560: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5570: 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 7d 0a  abel(v, brk);.}.
5580: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
5590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
55a0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
55b0: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
55c0: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
55d0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
55e0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
55f0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
5600: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
5610: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ler..**.** If th
5620: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
5630: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
5640: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
5650: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
5660: 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e  om.** the origin
5670: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
5680: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
5690: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
56a0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20   column..** .** 
56b0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
56c0: 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70 72  type for an expr
56d0: 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65 72  ession is either
56e0: 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43 20 6f   TEXT, NUMERIC o
56f0: 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20 64 65  r ANY..** The de
5700: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
5710: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
5720: 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a   is INTEGER..*/.
5730: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5740: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 4e 61  r *columnType(Na
5750: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
5760: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5770: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
5780: 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66  e;.  int j;.  if
5790: 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e  ( pExpr==0 || pN
57a0: 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  C->pSrcList==0 )
57b0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
57c0: 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72 61   The TK_AS opera
57d0: 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  tor can only occ
57e0: 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59 2c 20  ur in ORDER BY, 
57f0: 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49 4e 47  GROUP BY, HAVING
5800: 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d 49 54  ,.  ** and LIMIT
5810: 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74 20 70   clauses.  But p
5820: 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65 73 20  Expr originates 
5830: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
5840: 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45 4c 45  t of a.  ** SELE
5850: 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20 63 61  CT.  So pExpr ca
5860: 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20  n never contain 
5870: 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72 2e 0a  an AS operator..
5880: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
5890: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20  Expr->op!=TK_AS 
58a0: 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
58b0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
58c0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
58d0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
58e0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ab = 0;.      in
58f0: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
5900: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 77  iColumn;.      w
5910: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
5920: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
5930: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
5940: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
5950: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
5960: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
5970: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
5980: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
5990: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
59a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
59b0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
59c0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
59d0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
59e0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  .pTab;.        }
59f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5a00: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
5a10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5a20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
5a30: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
5a40: 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20   /* FIX ME:.    
5a50: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
5a60: 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61  occurs if you ha
5a70: 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ve something lik
5a80: 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b  e "SELECT new.x;
5a90: 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20  " inside.       
5aa0: 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20   ** a trigger.  
5ab0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
5ac0: 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65  if you reference
5ad0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65   the special "ne
5ae0: 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  w".        ** ta
5af0: 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ble in the resul
5b00: 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63  t set of a selec
5b10: 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61  t.  We do not ha
5b20: 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20  ve a good way.  
5b30: 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64        ** to find
5b40: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c   the actual tabl
5b50: 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20  e type, so call 
5b60: 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73  it "TEXT".  This
5b70: 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20   is really.     
5b80: 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20     ** something 
5b90: 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20  of a bug, but I 
5ba0: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
5bb0: 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20  to fix it..     
5bc0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
5bd0: 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20   This code does 
5be0: 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20  not produce the 
5bf0: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d  correct answer -
5c00: 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74   it just prevent
5c10: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  s.        ** a s
5c20: 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69  egfault.  See ti
5c30: 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20  cket #1229..    
5c40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a      */.        z
5c50: 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20  Type = "TEXT";. 
5c60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
5c80: 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20  rt( pTab );.    
5c90: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
5ca0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
5cb0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
5cc0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
5cd0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
5ce0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
5cf0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
5d00: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
5d10: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
5d20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5d30: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
5d40: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
5d50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5d60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
5d70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5d80: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
5d90: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
5da0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
5db0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
5dc0: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
5dd0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73  pSelect;.      s
5de0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 45  NC.pSrcList = pE
5df0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  xpr->pSelect->pS
5e00: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
5e10: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
5e20: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
5e30: 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e 70 45  ype(&sNC, pS->pE
5e40: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
5e50: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
5e60: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5e70: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
5e80: 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a   zType = 0;.  }.
5e90: 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70    .  return zTyp
5ea0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
5eb0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
5ec0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
5ed0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
5ee0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
5ef0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
5f00: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
5f10: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
5f20: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
5f30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5f40: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
5f50: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
5f60: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
5f70: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
5f80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
5f90: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
5fa0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
5fb0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
5fc0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5fd0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5fe0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
5ff0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
6000: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
6010: 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  abList;.  for(i=
6020: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
6030: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
6040: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
6050: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
6060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
6070: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
6080: 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  sNC, p);.    if(
6090: 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74   zType==0 ) cont
60a0: 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68 65  inue;.    /* The
60b0: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
60c0: 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66  it's own copy of
60d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
60e0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a 20  , in case the . 
60f0: 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20     ** schema is 
6100: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
6110: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
6120: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
6130: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6140: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
6150: 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  , i+pEList->nExp
6160: 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e  r, zType, strlen
6170: 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a  (zType));.  }.}.
6180: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
6190: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
61a0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
61b0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
61c0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
61d0: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
61e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
61f0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
6200: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
6210: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
6220: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
6230: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
6240: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
6250: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
6260: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
6270: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
6280: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
6290: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
62a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
62b0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
62c0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
62d0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
62e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
62f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
6300: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
6310: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6320: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
6330: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
6340: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6350: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
6360: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
6370: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
6380: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
6390: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
63a0: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
63b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
63c0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
63d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
63e0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
63f0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
6400: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
6410: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
6420: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
6430: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
6440: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6450: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
6460: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
6470: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
6480: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
6490: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
64a0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
64b0: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
64c0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
64d0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
64e0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
64f0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
6500: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
6510: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
6520: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
6530: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
6540: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
6550: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
6560: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
6570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6580: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
6590: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
65a0: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
65b0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
65c0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
65d0: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
65e0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
65f0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
6600: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
6610: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
6620: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
6630: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
6640: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
6650: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
6660: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
6670: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
6680: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
6690: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
66a0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
66b0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
66c0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
66d0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
66e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
66f0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
6700: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
6710: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
6720: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
6730: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
6740: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
6750: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
6760: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
6770: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
6780: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
6790: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
67a0: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
67b0: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
67c0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
67d0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
67e0: 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e  me(v, i, p->span
67f0: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
6800: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6810: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73  fullNames || (!s
6820: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61  hortNames && pTa
6830: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
6840: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
6850: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
6860: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
6870: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
6880: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  pTabList->a[j].z
6890: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69  Alias;.        i
68a0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
68b0: 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d  zTab==0 ) zTab =
68c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
68e0: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a  String(&zName, z
68f0: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
6900: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
6910: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6920: 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 50  e(v, i, zName, P
6930: 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
6940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6950: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
6960: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43 6f  olName(v, i, zCo
6970: 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29  l, strlen(zCol))
6980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6990: 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  lse if( p->span.
69a0: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
69b0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
69c0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
69d0: 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a  (v, i, p->span.z
69e0: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
69f0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64      /* sqlite3Vd
6a00: 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28  beCompressSpace(
6a10: 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20  v, addr); */.   
6a20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
6a30: 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20  ar zName[30];.  
6a40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
6a50: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
6a60: 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  pTabList==0 );. 
6a70: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61       sprintf(zNa
6a80: 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  me, "column%d", 
6a90: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  i+1);.      sqli
6aa0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6ab0: 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  e(v, i, zName, 0
6ac0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
6ad0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
6ae0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
6af0: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
6b00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6b10: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6b20: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
6b30: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
6b40: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
6b50: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
6b60: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
6b70: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
6b80: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
6b90: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
6ba0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
6bb0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
6bc0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
6bd0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
6be0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
6bf0: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
6c00: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
6c10: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
6c20: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
6c30: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
6c40: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
6c50: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
6c60: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
6c70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
6c80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6c90: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
6ca0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
6cb0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
6cc0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
6cd0: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
6ce0: 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63  mt(Parse*, Selec
6cf0: 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  t*);../*.** Give
6d00: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
6d10: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
6d20: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
6d30: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
6d40: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
6d50: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
6d60: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
6d70: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
6d80: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
6d90: 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  se, char *zTabNa
6da0: 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  me, Select *pSel
6db0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
6dc0: 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Tab;.  int i, j;
6dd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
6de0: 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  ist;.  Column *a
6df0: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  Col, *pCol;..  i
6e00: 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
6e10: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6e20: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
6e30: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
6e40: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
6e50: 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ve(pParse, pSele
6e60: 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65  ct, 0) ){.    re
6e70: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
6e80: 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ab = sqliteMallo
6e90: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
6ea0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
6eb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6ec0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e  0;.  }.  pTab->n
6ed0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
6ee0: 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d  >zName = zTabNam
6ef0: 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70  e ? sqliteStrDup
6f00: 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a  (zTabName) : 0;.
6f10: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
6f20: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54  ct->pEList;.  pT
6f30: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73  ab->nCol = pELis
6f40: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65  t->nExpr;.  asse
6f50: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
6f60: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c   );.  pTab->aCol
6f70: 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = aCol = sqlite
6f80: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70  Malloc( sizeof(p
6f90: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
6fa0: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f  ab->nCol );.  fo
6fb0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
6fc0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
6fd0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
6fe0: 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a    Expr *p, *pR;.
6ff0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
7000: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
7010: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73  ;.    char *zBas
7020: 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63  ename;.    int c
7030: 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74  nt;.    NameCont
7040: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20  ext sNC;.    .  
7050: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
7060: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
7070: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
7080: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
7090: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
70a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
70b0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
70c0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
70d0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
70e0: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
70f0: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
7100: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
7110: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
7120: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
7130: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
7140: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
7150: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
7160: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
7170: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
7180: 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20  StrDup(zName);. 
7190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
71a0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20  op==TK_DOT .    
71b0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52            && (pR
71c0: 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26  =p->pRight)!=0 &
71d0: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  & pR->token.z &&
71e0: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20   pR->token.z[0] 
71f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
7200: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66  columns of the f
7210: 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73  rom A.B use B as
7220: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
7230: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7240: 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20  e3MPrintf("%T", 
7250: 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pR->token);.   
7260: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
7270: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
7280: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
7290: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
72a0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
72b0: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
72c0: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
72d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
72e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
72f0: 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  , &p->span);.   
7300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
7310: 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69   If all else fai
7320: 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61  ls, make up a na
7330: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
7340: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
7350: 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  tf("column%d", i
7360: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
7370: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
7380: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
7390: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
73a0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
73b0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
73c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
73d0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62  eteTable(0, pTab
73e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
73f0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
7400: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
7410: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
7420: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
7430: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
7440: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
7450: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
7460: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
7470: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
7480: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 42 61 73  .    */.    zBas
7490: 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  ename = zName;. 
74a0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
74b0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
74c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
74d0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
74e0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
74f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
7500: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
7510: 25 73 3a 25 64 22 2c 20 7a 42 61 73 65 6e 61 6d  %s:%d", zBasenam
7520: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
7530: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
7540: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
7550: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
7560: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
7570: 42 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65 20  Basename!=zName 
7580: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
7590: 72 65 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b 0a  ree(zBasename);.
75a0: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
75b0: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a  zName = zName;..
75c0: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74      /* Get the t
75d0: 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66  ypename, type af
75e0: 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c  finity, and coll
75f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
7600: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  or the.    ** co
7610: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
7620: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
7630: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
7640: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
7650: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
7660: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  .    zType = sql
7670: 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e  iteStrDup(column
7680: 54 79 70 65 28 26 73 4e 43 2c 20 70 29 29 3b 0a  Type(&sNC, p));.
7690: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
76a0: 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f  = zType;.    pCo
76b0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
76c0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
76d0: 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  y(p);.    pCol->
76e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
76f0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
7700: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 21  e, p);.    if( !
7710: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20  pCol->pColl ){. 
7720: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c       pCol->pColl
7730: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
7740: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
7750: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65    }.  pTab->iPKe
7760: 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  y = -1;.  return
7770: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
7780: 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54  Prepare a SELECT
7790: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
77a0: 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69  rocessing by doi
77b0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
77c0: 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a  .** things:.**.*
77d0: 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
77e0: 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
77f0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
7800: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
7810: 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
7820: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
7830: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
7840: 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
7850: 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
7860: 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
7870: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
7880: 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
7890: 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
78a0: 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
78b0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
78c0: 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
78d0: 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
78e0: 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
78f0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
7900: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
7910: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
7920: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
7930: 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
7940: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
7950: 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
7960: 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
7970: 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
7980: 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
7990: 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
79a0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
79b0: 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
79c0: 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
79d0: 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69  ing up the presi
79e0: 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
79f0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
7a00: 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
7a10: 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
7a20: 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
7a30: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
7a40: 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
7a50: 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
7a60: 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
7a70: 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
7a80: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
7a90: 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
7aa0: 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
7ab0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
7ac0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
7ad0: 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
7ae0: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
7af0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
7b00: 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
7b10: 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
7b20: 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
7b30: 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
7b40: 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
7b50: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
7b60: 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
7b70: 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
7b80: 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
7b90: 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
7ba0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
7bb0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
7bc0: 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d  here are problem
7bd0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
7be0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
7bf0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
7c00: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
7c10: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65  tatic int prepSe
7c20: 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a  lectStmt(Parse *
7c30: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
7c40: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
7c50: 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74  k, rc;.  SrcList
7c60: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
7c70: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
7c80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
7c90: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7ca0: 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
7cb0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
7cc0: 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Src==0 || sqlite
7cd0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
7ce0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 54  ) return 1;.  pT
7cf0: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
7d00: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
7d10: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
7d20: 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
7d30: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
7d40: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
7d50: 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
7d60: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7d70: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
7d80: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
7d90: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
7da0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
7db0: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a  rse, p->pSrc);..
7dc0: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
7dd0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
7de0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7df0: 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
7e00: 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
7e10: 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
7e20: 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
7e30: 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
7e40: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
7e50: 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
7e60: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
7e70: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
7e80: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
7e90: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
7ea0: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
7eb0: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
7ec0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
7ed0: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 69   pFrom++){.    i
7ee0: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
7ef0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
7f00: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
7f10: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
7f20: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
7f30: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
7f40: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
7f50: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
7f60: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
7f70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
7f80: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
7f90: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
7fa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7fb0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
7fc0: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
7fd0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7fe0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
7ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
8000: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
8010: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
8020: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
8030: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
8040: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
8050: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
8060: 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  f("sqlite_subque
8070: 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
8080: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
8090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
80a0: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
80b0: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
80c0: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
80d0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
80e0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
80f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46  elect(pParse, pF
8100: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72  rom->zAlias, pFr
8110: 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
8120: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
8130: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8140: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
8150: 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61 6e     /* The isTran
8160: 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69 63  sient flag indic
8170: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
8180: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
8190: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
81a0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
81b0: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
81c0: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
81d0: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
81e0: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
81f0: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
8200: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
8210: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
8220: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
8230: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
8240: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
8250: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54 72        pTab->isTr
8260: 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23 65 6e  ansient = 1;.#en
8270: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
8280: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
8290: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
82a0: 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
82b0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
82c0: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
82d0: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
82e0: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
82f0: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
8300: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
8310: 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f 6d  ble(pParse,pFrom
8320: 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
8330: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
8340: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
8350: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
8360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8370: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
8380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8390: 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66 28  T_VIEW.      if(
83a0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
83b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
83c0: 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
83d0: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
83e0: 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
83f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
8400: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
8410: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
8420: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
8430: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8450: 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53   /* If pFrom->pS
8460: 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e  elect!=0 it mean
8470: 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
8480: 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20 20   with a.        
8490: 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20 61  ** view within a
84a0: 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45   view.  The SELE
84b0: 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61 73  CT structure has
84c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
84d0: 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20        ** copied 
84e0: 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69 65  by the outer vie
84f0: 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70  w so we can skip
8500: 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20 68   the copy step h
8510: 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ere.        ** i
8520: 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77  n the inner view
8530: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8540: 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e       if( pFrom->
8550: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
8560: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
8570: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
8580: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d 3e  SelectDup(pTab->
8590: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
85a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
85b0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
85c0: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
85d0: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
85e0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
85f0: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
8600: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
8610: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
8620: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
8630: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
8640: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
8650: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
8660: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
8670: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
8680: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
8690: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
86a0: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
86b0: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
86c0: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
86d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
86e0: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
86f0: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
8700: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
8710: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
8720: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
8730: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
8740: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
8750: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
8760: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
8770: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
8780: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
8790: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
87a0: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
87b0: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
87c0: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
87d0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
87e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
87f0: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
8800: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
8810: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
8820: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
8830: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
8840: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
8850: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
8860: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
8870: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
8880: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
8890: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
88a0: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
88b0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
88c0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
88d0: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
88e0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
88f0: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
8900: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
8910: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
8920: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
8930: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
8940: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
8950: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
8960: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
8970: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
8980: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
8990: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
89a0: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
89b0: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
89c0: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
89d0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
89e0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
89f0: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
8a00: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
8a10: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
8a20: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8a30: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
8a40: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
8a50: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
8a60: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
8a70: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
8a80: 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
8a90: 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
8aa0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
8ab0: 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)!=0 &&.       
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8ad0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
8ae0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
8af0: 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
8b00: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
8b10: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
8b20: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
8b30: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
8b40: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
8b50: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
8b60: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
8b70: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
8b80: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
8b90: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
8ba0: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
8bb0: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
8bc0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
8bd0: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
8be0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8bf0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
8c00: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
8c10: 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ew, a[k].pExpr, 
8c20: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  0);.        pNew
8c30: 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
8c40: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
8c50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
8c60: 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
8c70: 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
8c80: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 0;.      }el
8c90: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
8ca0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
8cb0: 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
8cc0: 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
8cd0: 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
8ce0: 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
8cf0: 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
8d00: 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
8d10: 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
8d20: 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
8d30: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8d40: 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  TName;          
8d50: 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
8d60: 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
8d70: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
8d80: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
8d90: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
8da0: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69     zTName = sqli
8db0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
8dc0: 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  (&pE->pLeft->tok
8dd0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  en);.        }el
8de0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
8df0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
8e00: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
8e10: 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
8e20: 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
8e30: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
8e40: 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
8e50: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
8e60: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
8e70: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8e80: 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
8e90: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
8ea0: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
8eb0: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
8ec0: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
8ed0: 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
8ee0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
8ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8f00: 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
8f10: 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20  (zTabName==0 || 
8f20: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c  zTabName[0]==0 |
8f30: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
8f40: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43      sqlite3StrIC
8f50: 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
8f60: 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  ame)!=0) ){.    
8f70: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8f90: 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
8fa0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
8fb0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
8fc0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
8fd0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
8fe0: 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20 2a  pExpr, *pLeft, *
8ff0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
9000: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
9010: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
9020: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
9030: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
9050: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
9060: 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c   *pLeft = &pTabL
9070: 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20  ist->a[i-1];.   
9080: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
9090: 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  pLeft->jointype 
90a0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
90b0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
90d0: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70  mnIndex(pLeft->p
90e0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
90f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9100: 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
9110: 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
9120: 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
9130: 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
9140: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
9150: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
9160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9170: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9180: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9190: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
91a0: 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
91b0: 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a  pLeft->pUsing, z
91c0: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
91e0: 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
91f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
9200: 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
9210: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
9220: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
9230: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
9240: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
9250: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
9260: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9270: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9290: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
92a0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
92b0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
92c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
92d0: 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ht==0 ) break;. 
92e0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
92f0: 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b  ken(&pRight->tok
9300: 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  en, zName);.    
9310: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
9320: 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d  Name && (longNam
9330: 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
9340: 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20  nSrc>1) ){.     
9350: 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
9360: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
9370: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
9380: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9390: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  r = sqlite3Expr(
93a0: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
93b0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
93c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
93d0: 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pr==0 ) break;. 
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
93f0: 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f  Token(&pLeft->to
9400: 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  ken, zTabName);.
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
9420: 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73  tToken(&pExpr->s
9430: 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69  pan, sqlite3MPri
9440: 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61  ntf("%s.%s", zTa
9450: 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a  bName, zName));.
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9470: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
9480: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
9490: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
94a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
94b0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
94c0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
94d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
94e0: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
94f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9500: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9510: 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
9520: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
9530: 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74  >span = pExpr->t
9540: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
9550: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
9560: 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
9570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9580: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
9590: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77  rListAppend(pNew
95a0: 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d  , pExpr, &pExpr-
95b0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  >span);.        
95c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
95d0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
95e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
95f0: 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70  ppend(pNew, pExp
9600: 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  r, &pRight->toke
9610: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
9620: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
9630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9640: 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
9650: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9660: 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
9670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9680: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
9690: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
96a0: 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
96b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
96c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
96d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
96e0: 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
96f0: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
9700: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
9710: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
9720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9730: 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  ree(zTName);.   
9740: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
9750: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9760: 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20  lete(pEList);.  
9770: 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
9780: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
9790: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
97a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
97b0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
97c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
97d0: 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65  ssociates entrie
97e0: 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  s in an ORDER BY
97f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9800: 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73   with.** columns
9810: 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46   in a result.  F
9820: 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59  or each ORDER BY
9830: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
9840: 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68   opcode of.** th
9850: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
9860: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
9870: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
9880: 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f   iColumn value o
9890: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
98a0: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
98b0: 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e  d in with column
98c0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
98d0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
98e0: 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
98f0: 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20   node is filled 
9900: 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61  with iTable para
9910: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  meter..**.** If 
9920: 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20  there are prior 
9930: 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20  SELECT clauses, 
9940: 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73  they are process
9950: 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74  ed first.  A mat
9960: 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c  ch.** in an earl
9970: 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73  ier SELECT takes
9980: 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72   precedence over
9990: 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e   a later SELECT.
99a0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79  .**.** Any entry
99b0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
99c0: 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20  atch is flagged 
99d0: 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  as an error.  Th
99e0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
99f0: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
9a00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9a10: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
9a20: 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
9a30: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
9a40: 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c   /* A place to l
9a50: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
9a60: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
9a70: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
9a80: 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73   /* Match to res
9a90: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ult columns of t
9aa0: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
9ab0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
9ac0: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
9ad0: 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74  RDER BY values t
9ae0: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
9af0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
9b00: 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
9b10: 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74       /* Insert t
9b20: 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61  his value in iTa
9b30: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
9b40: 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20  tComplete       
9b50: 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20   /* If TRUE all 
9b60: 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d  ORDER BYs must m
9b70: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
9b80: 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74   nErr = 0;.  int
9b90: 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73   i, j;.  ExprLis
9ba0: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
9bb0: 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20  ( pSelect==0 || 
9bc0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
9bd0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75  turn 1;.  if( mu
9be0: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
9bf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
9c00: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9c10: 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  +){ pOrderBy->a[
9c20: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20  i].done = 0; }. 
9c30: 20 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c   }.  if( prepSel
9c40: 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
9c50: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
9c60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
9c70: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  if( pSelect->pPr
9c80: 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  ior ){.    if( m
9c90: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
9ca0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c  umn(pParse, pSel
9cb0: 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72  ect->pPrior, pOr
9cc0: 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30  derBy, iTable, 0
9cd0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
9ce0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
9cf0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
9d00: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72  t->pEList;.  for
9d10: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
9d20: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9d30: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f     Expr *pE = pO
9d40: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
9d50: 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  pr;.    int iCol
9d60: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
9d70: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
9d80: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
9d90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
9da0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
9db0: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
9dc0: 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
9dd0: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
9de0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
9df0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9e00: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
9e10: 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f  ORDER BY positio
9e20: 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62  n %d should be b
9e30: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
9e40: 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  ,.          iCol
9e50: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
9e60: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
9e70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9e90: 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65  f( !mustComplete
9ea0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9eb0: 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d     iCol--;.    }
9ec0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43  .    for(j=0; iC
9ed0: 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74  ol<0 && j<pEList
9ee0: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
9ef0: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
9f00: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28  >a[j].zName && (
9f10: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c  pE->op==TK_ID ||
9f20: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49   pE->op==TK_STRI
9f30: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  NG) ){.        c
9f40: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61  har *zName, *zLa
9f50: 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  bel;.        zNa
9f60: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  me = pEList->a[j
9f70: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
9f80: 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65   zLabel = sqlite
9f90: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26  3NameFromToken(&
9fa0: 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pE->token);.    
9fb0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62      assert( zLab
9fc0: 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  el!=0 );.       
9fd0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9fe0: 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65  Cmp(zName, zLabe
9ff0: 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  l)==0 ){ .      
a000: 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20      iCol = j;.  
a010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a020: 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65  sqliteFree(zLabe
a030: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
a040: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
a050: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
a060: 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61  re(pE, pEList->a
a070: 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [j].pExpr) ){.  
a080: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
a090: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a0a0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
a0b0: 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20  .      pE->op = 
a0c0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
a0d0: 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69   pE->iColumn = i
a0e0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  Col;.      pE->i
a0f0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
a100: 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d        pE->iAgg =
a110: 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64 65   -1;.      pOrde
a120: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
a130: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
a140: 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74  ( iCol<0 && must
a150: 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20  Complete ){.    
a160: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a170: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
a180: 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d    "ORDER BY term
a190: 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20   number %d does 
a1a0: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65  not match any re
a1b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b  sult column", i+
a1c0: 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  1);.      nErr++
a1d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a1e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a1f0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
a200: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
a210: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a220: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
a230: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
a240: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
a250: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
a260: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a270: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
a280: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
a290: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
a2a0: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
a2b0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
a2c0: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
a2d0: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
a2e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
a2f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a300: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
a310: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
a320: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
a330: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
a340: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ->db);.  }.  ret
a350: 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn v;.}../*.** 
a360: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
a370: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
a380: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
a390: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
a3a0: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
a3b0: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
a3c0: 6e 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64 20  ns.  nLimit and 
a3d0: 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  nOffset hold the
a3e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
a3f0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
a400: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
a410: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
a420: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
a430: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
a440: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
a450: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
a460: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
a470: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
a480: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
a490: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
a4a0: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
a4b0: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
a4c0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
a4d0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
a4e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
a4f0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
a500: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
a510: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
a520: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
a530: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a540: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
a550: 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20 61  lues if iLimit a
a560: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
a570: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
a580: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
a590: 65 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64  ed by nLimit and
a5a0: 20 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   nOffset.  iLimi
a5b0: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
a5c0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
a5d0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
a5e0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
a5f0: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
a600: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
a610: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
a620: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
a630: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
a640: 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66  nLimit>=0 or nOf
a650: 66 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c 69  fset>0 do the li
a660: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
a670: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
a680: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
a690: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
a6a0: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
a6b0: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
a6c0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
a6d0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
a6e0: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
a6f0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
a700: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
a710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
a720: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
a730: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
a740: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
a750: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
a760: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
a770: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
a780: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
a790: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
a7a0: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
a7b0: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
a7c0: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
a7d0: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
a7e0: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
a7f0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
a800: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
a810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
a820: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
a830: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
a840: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65  nMem++;.    Vdbe
a850: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
a860: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a870: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
a880: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
a890: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a8a0: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8c0: 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  p(v, OP_MustBeIn
a8d0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  t, 0, 0);.    sq
a8e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a8f0: 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30  , OP_Negative, 0
a900: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a910: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a920: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
a930: 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d   1);.    VdbeCom
a940: 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49  ment((v, "# LIMI
a950: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
a960: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d    p->iLimit = iM
a970: 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  em;.  }.  if( p-
a980: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
a990: 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
a9a0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56  e->nMem++;.    V
a9b0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
a9c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a9d0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
a9e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
a9f0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
aa00: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  se, p->pOffset);
aa10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
aa20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
aa30: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
aa40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
aa50: 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
aa60: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
aa70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
aa80: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
aa90: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  Mem, 1);.    Vdb
aaa0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
aab0: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
aac0: 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  );.    p->iOffse
aad0: 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a  t = iMem;.  }.}.
aae0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
aaf0: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
ab00: 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69  to use for sorti
ab10: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
ab20: 69 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67  id createSorting
ab30: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
ab40: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
ab50: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
ab60: 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65  By){.  if( pOrde
ab70: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  rBy ){.    int a
ab80: 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ddr;.    assert(
ab90: 20 70 4f 72 64 65 72 42 79 2d 3e 69 54 61 62 3d   pOrderBy->iTab=
aba0: 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  =0 );.    pOrder
abb0: 42 79 2d 3e 69 54 61 62 20 3d 20 70 50 61 72 73  By->iTab = pPars
abc0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61  e->nTab++;.    a
abd0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
abe0: 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70  eAddOp(pParse->p
abf0: 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Vdbe, OP_OpenVir
ac00: 74 75 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tual,.          
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 54 61 62    pOrderBy->iTab
ac30: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
ac40: 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r+1);.    assert
ac50: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  ( p->addrOpenVir
ac60: 74 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  t[2] == -1 );.  
ac70: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72    p->addrOpenVir
ac80: 74 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d  t[2] = addr;.  }
ac90: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
aca0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
acb0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
acc0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
acd0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
ace0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
acf0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
ad00: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
ad10: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
ad20: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
ad30: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
ad40: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
ad50: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
ad60: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
ad70: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
ad80: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
ad90: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
ada0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
adb0: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
adc0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
add0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
ade0: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
adf0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ae00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
ae10: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
ae20: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
ae30: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
ae40: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
ae50: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
ae60: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
ae70: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
ae80: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
ae90: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
aea0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
aeb0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
aec0: 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d    }.  if( pRet==
aed0: 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  0 ){.    pRet = 
aee0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
aef0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
af00: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
af10: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
af20: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
af30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
af40: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
af50: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
af60: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
af70: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
af80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
af90: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
afa0: 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73   a query that is
afb0: 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f   really the unio
afc0: 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63  n.** or intersec
afd0: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d  tion of two or m
afe0: 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
aff0: 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20  ries..**.** "p" 
b000: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
b010: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
b020: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
b030: 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
b040: 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
b050: 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
b060: 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
b070: 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
b080: 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
b090: 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
b0a0: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
b0b0: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
b0c0: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
b0d0: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
b0e0: 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
b0f0: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
b100: 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
b110: 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
b120: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
b130: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
b140: 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
b150: 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
b160: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
b170: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
b180: 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
b190: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
b1a0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
b1b0: 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
b1c0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
b1d0: 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
b1e0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
b1f0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
b200: 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
b210: 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
b220: 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b240: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b250: 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
b260: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
b270: 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
b280: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
b290: 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
b2a0: 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
b2b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
b2c0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
b2d0: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
b2e0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
b2f0: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
b300: 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
b310: 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
b320: 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
b330: 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
b340: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
b350: 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
b360: 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
b370: 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
b380: 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
b390: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
b3a0: 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
b3b0: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
b3c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b3d0: 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
b3e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b3f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b400: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
b410: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
b420: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
b430: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
b440: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
b450: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
b460: 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20         /* \___  
b470: 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73 75  Store query resu
b480: 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65 64  lts as specified
b490: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f              /* /
b4b0: 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74 77       by these tw
b4c0: 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20  o parameters.   
b4d0: 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20        */.  char 
b4e0: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
b4f0: 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
b500: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
b510: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
b520: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
b530: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
b540: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
b550: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
b560: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
b570: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
b580: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
b590: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
b5a0: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
b5b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b5c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b5d0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
b5e0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b600: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
b610: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
b620: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
b630: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
b640: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b650: 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61   on p */.  int a
b660: 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20  SetP2[2];       
b670: 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65   /* Set P2 value
b680: 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20   of these op to 
b690: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
b6a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50  s */.  int nSetP
b6b0: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  2 = 0;       /* 
b6c0: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
b6d0: 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64  in aSetP2[] used
b6e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
b6f0: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
b700: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
b710: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
b720: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
b730: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
b740: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
b750: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
b760: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
b770: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
b780: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
b790: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
b7a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
b7b0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
b7c0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
b7d0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
b7e0: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
b7f0: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
b800: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
b810: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
b820: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
b830: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28  ghtmost );.  if(
b840: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
b850: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
b860: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b870: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
b880: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
b890: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
b8a0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
b8b0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
b8c0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
b8d0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
b8e0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
b8f0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
b900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
b910: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
b920: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
b930: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
b940: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
b950: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
b960: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
b970: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
b980: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
b990: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
b9a0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
b9b0: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
b9c0: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
b9d0: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
b9e0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
b9f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ba00: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
ba10: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
ba20: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ba30: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
ba40: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
ba50: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
ba60: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
ba70: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ry.  */.  if( eD
ba80: 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
ba90: 6c 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  le ){.    assert
baa0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
bab0: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
bac0: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
bad0: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
bae0: 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32  ]) );.    aSetP2
baf0: 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c  [nSetP2++] = sql
bb00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bb10: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
bb20: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
bb30: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
bb40: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
bb50: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
bb60: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
bb70: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
bb80: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64  nts..  */.  pOrd
bb90: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
bba0: 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  By;.  switch( p-
bbb0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
bbc0: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
bbd0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
bbe0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
bbf0: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
bc00: 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
bc10: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
bc20: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
bc30: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
bc40: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
bc50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
bc60: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
bc70: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
bc80: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
bc90: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
bca0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
bcb0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bcc0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
bcd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
bce0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
bcf0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
bd00: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
bd10: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
bd20: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
bd30: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  fset;.        p-
bd40: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
bd50: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
bd60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
bd70: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
bd80: 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
bd90: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
bda0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
bdb0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
bdc0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
bdd0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
bde0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bdf0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
be00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
be10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
be20: 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
be30: 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
be40: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
be50: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
be60: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
be70: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
be80: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
be90: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
bea0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
beb0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
bec0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
bed0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
bee0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20     int op = 0;  
bef0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
bf00: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
bf10: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
bf20: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
bf30: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
bf40: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
bf50: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
bf60: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
bf70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
bf80: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
bf90: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
bfa0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
bfb0: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
bfc0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
bfd0: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d      priorOp = p-
bfe0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52  >op==TK_ALL ? SR
bff0: 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e  T_Table : SRT_Un
c000: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65  ion;.      if( e
c010: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
c020: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
c030: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70  !p->pLimit && !p
c040: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
c050: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
c060: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
c070: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
c080: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
c090: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
c0a0: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
c0b0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
c0c0: 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20  b = iParm;.     
c0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c0e0: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
c0f0: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
c100: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
c110: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
c120: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
c130: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
c140: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c150: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
c160: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
c170: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
c180: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
c190: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
c1a0: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 2c 20 75  , p, pOrderBy, u
c1b0: 6e 69 6f 6e 54 61 62 2c 31 29 20 29 7b 0a 20 20  nionTab,1) ){.  
c1c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
c1d0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
c1e0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c1f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c200: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c210: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c220: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 75 6e  _OpenVirtual, un
c230: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
c240: 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d      if( priorOp=
c250: 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20  =SRT_Table ){.  
c260: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c270: 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53  nSetP2<sizeof(aS
c280: 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65  etP2)/sizeof(aSe
c290: 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20  tP2[0]) );.     
c2a0: 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74       aSetP2[nSet
c2b0: 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20  P2++] = addr;.  
c2c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c2d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c2e0: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30  ->addrOpenVirt[0
c2f0: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
c300: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
c310: 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Virt[0] = addr;.
c320: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69            p->pRi
c330: 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72  ghtmost->usesVir
c340: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
c350: 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65 53  .        createS
c360: 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
c370: 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29  se, p, pOrderBy)
c380: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c390: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c3a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
c3b0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
c3c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
c3d0: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
c3e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
c3f0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
c400: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
c410: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c420: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69  rse, pPrior, pri
c430: 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  orOp, unionTab, 
c440: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
c450: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c460: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c470: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c480: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c490: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
c4a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c4b0: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
c4c0: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
c4d0: 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
c4e0: 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
c4f0: 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
c500: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
c510: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
c520: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
c530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c540: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
c550: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
c560: 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
c570: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
c580: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
c590: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
c5a0: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
c5b0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
c5c0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
c5d0: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
c5e0: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
c5f0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
c600: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
c610: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c620: 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e  se, p, op, union
c630: 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  Tab, 0, 0, 0, af
c640: 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  f);.      p->pPr
c650: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
c660: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
c670: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
c680: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c690: 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  ete(p->pLimit);.
c6a0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
c6b0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
c6c0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
c6d0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
c6e0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
c6f0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d    p->iOffset = -
c700: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  1;.      if( rc 
c710: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c720: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c730: 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
c740: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
c750: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
c760: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
c770: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
c780: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
c790: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
c7a0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20   need..      */ 
c7b0: 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
c7c0: 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c  eDest!=priorOp |
c7d0: 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72  | unionTab!=iPar
c7e0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  m ){.        int
c7f0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
c800: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
c810: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
c820: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
c830: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
c840: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
c850: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
c860: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
c870: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
c880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c890: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
c8a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c8b0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
c8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c8d0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
c8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c8f0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
c900: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
c910: 6b 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  k);.        comp
c920: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
c930: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
c940: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
c950: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c960: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
c970: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
c980: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
c990: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
c9a0: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
c9b0: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20        pOrderBy, 
c9e0: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
c9f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
ca20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ca30: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
ca40: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
ca50: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
ca60: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
ca70: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
ca80: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
ca90: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
caa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cab0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
cac0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
cad0: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
cae0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
caf0: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
cb00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cb10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cb20: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
cb30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cb40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cb50: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
cb60: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
cb70: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
cb80: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
cb90: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
cba0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
cbb0: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
cbc0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
cbd0: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
cbe0: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
cbf0: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
cc00: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
cc10: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
cc20: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
cc30: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
cc40: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
cc50: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
cc60: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
cc70: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
cc80: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
cc90: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
cca0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
ccb0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
ccc0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
ccd0: 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63  pOrderBy && matc
cce0: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
ccf0: 28 70 50 61 72 73 65 2c 70 2c 70 4f 72 64 65 72  (pParse,p,pOrder
cd00: 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20  By,tab1,1) ){.  
cd10: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
cd20: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
cd30: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
cd40: 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65 61 74     }.      creat
cd50: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  eSortingIndex(pP
cd60: 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42  arse, p, pOrderB
cd70: 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20  y);..      addr 
cd80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cd90: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
cda0: 74 75 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  tual, tab1, 0);.
cdb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cdc0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d  >addrOpenVirt[0]
cdd0: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
cde0: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
cdf0: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
ce00: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
ce10: 75 73 65 73 56 69 72 74 20 3d 20 31 3b 0a 20 20  usesVirt = 1;.  
ce20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
ce30: 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
ce40: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
ce50: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
ce60: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
ce70: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
ce80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
ce90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
cea0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53  Parse, pPrior, S
ceb0: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20  RT_Union, tab1, 
cec0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
ced0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
cee0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
cef0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
cf00: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
cf10: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
cf20: 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
cf30: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
cf40: 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
cf50: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
cf60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cf70: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61  _OpenVirtual, ta
cf80: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
cf90: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
cfa0: 6e 56 69 72 74 5b 31 5d 20 3d 3d 20 2d 31 20 29  nVirt[1] == -1 )
cfb0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
cfc0: 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20 61 64 64  penVirt[1] = add
cfd0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
cfe0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
cff0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
d000: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
d010: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
d020: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
d030: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d040: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
d050: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d060: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
d070: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
d080: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d090: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
d0a0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
d0b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
d0c0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
d0d0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
d0e0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
d0f0: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
d100: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d110: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d120: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d130: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d140: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d150: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
d160: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
d170: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
d180: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
d190: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
d1a0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d1b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
d1c0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
d1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
d1e0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
d1f0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
d200: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
d210: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
d220: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d230: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
d240: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
d250: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d270: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
d280: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
d290: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
d2a0: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
d2b0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
d2c0: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
d2d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d2e0: 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29  RowKey, tab1, 0)
d2f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d300: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d310: 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
d320: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Cont);.      rc 
d330: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
d340: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
d350: 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d  pEList, tab1, p-
d360: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
d390: 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74  derBy, -1, eDest
d3a0: 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20  , iParm, .      
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42         iCont, iB
d3d0: 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  reak, 0);.      
d3e0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d3f0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
d400: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d410: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
d420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d430: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d440: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
d450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d460: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
d470: 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
d480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d490: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
d4a0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
d4b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d4c0: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
d4d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d4e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d4f0: 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
d500: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d510: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
d520: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
d530: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
d540: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
d550: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
d560: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
d570: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
d580: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d590: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
d5a0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
d5b0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
d5c0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
d5d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
d5e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d5f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
d600: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
d610: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
d620: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
d630: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
d640: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
d650: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
d660: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
d670: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
d680: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d690: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
d6a0: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
d6b0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
d6c0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a  emporary tables.
d6d0: 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d    */.  nCol = p-
d6e0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
d6f0: 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20    while( nSetP2 
d700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d710: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53  beChangeP2(v, aS
d720: 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20  etP2[--nSetP2], 
d730: 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nCol);.  }..  /*
d740: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
d750: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
d760: 64 20 62 79 20 65 69 74 68 65 72 20 74 68 65 20  d by either the 
d770: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
d780: 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74  or.  ** by any t
d790: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
d7a0: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
d7b0: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
d7c0: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
d7d0: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
d7e0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
d7f0: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
d800: 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a  es.  Invoke the.
d810: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72    ** ORDER BY pr
d820: 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68 65 72  ocessing if ther
d830: 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
d840: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
d850: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
d860: 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
d870: 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
d880: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
d890: 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
d8a0: 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
d8b0: 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
d8c0: 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
d8d0: 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
d8e0: 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
d8f0: 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
d900: 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
d910: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
d920: 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
d930: 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
d940: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  d..  */.  if( pO
d950: 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65  rderBy || p->use
d960: 73 56 69 72 74 20 29 7b 0a 20 20 20 20 69 6e 74  sVirt ){.    int
d970: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d990: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d9a0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
d9b0: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
d9c0: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
d9d0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
d9e0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
d9f0: 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
da10: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
da20: 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
da30: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
da40: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 0a  llSeq **apColl;.
da50: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43      CollSeq **aC
da60: 6f 70 79 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  opy;..    assert
da70: 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
da80: 3d 70 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  =p );.    pKeyIn
da90: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo = sqliteMallo
daa0: 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  c(sizeof(*pKeyIn
dab0: 66 6f 29 2b 6e 43 6f 6c 2a 32 2a 73 69 7a 65 6f  fo)+nCol*2*sizeo
dac0: 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43  f(CollSeq*) + nC
dad0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b  ol);.    if( !pK
dae0: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
daf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
db00: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
db10: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
db20: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49      }..    pKeyI
db30: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73  nfo->enc = pPars
db40: 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20  e->db->enc;.    
db50: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
db60: 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f   = nCol;..    fo
db70: 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
db80: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
db90: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
dba0: 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
dbb0: 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
dbc0: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
dbd0: 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
dbe0: 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
dbf0: 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
dc00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
dc10: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
dc20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
dc30: 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
dc40: 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
dc50: 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
dc60: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
dc70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
dc80: 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
dc90: 70 65 6e 56 69 72 74 5b 69 5d 3b 0a 20 20 20 20  penVirt[i];.    
dca0: 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
dcb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
dcc0: 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
dcd0: 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
dce0: 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
dcf0: 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
dd00: 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
dd10: 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
dd20: 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
dd30: 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
dd40: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
dd50: 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
dd60: 70 65 6e 56 69 72 74 5b 31 5d 3c 30 20 29 3b 0a  penVirt[1]<0 );.
dd70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
dd80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dd90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
dda0: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
ddb0: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
ddc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ddd0: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
dde0: 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
ddf0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
de00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
de10: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
de20: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
de30: 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20  st_item *pOTerm 
de40: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  = pOrderBy->a;. 
de50: 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d       int nExpr =
de60: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
de70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
de80: 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72  ;.      u8 *pSor
de90: 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 61  tOrder;..      a
dea0: 43 6f 70 79 20 3d 20 28 43 6f 6c 6c 53 65 71 2a  Copy = (CollSeq*
deb0: 2a 29 26 70 4b 65 79 49 6e 66 6f 5b 31 5d 3b 0a  *)&pKeyInfo[1];.
dec0: 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72        pSortOrder
ded0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
dee0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
def0: 61 43 6f 70 79 5b 6e 45 78 70 72 5d 3b 0a 20 20  aCopy[nExpr];.  
df00: 20 20 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79      memcpy(aCopy
df10: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
df20: 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  l, nCol*sizeof(C
df30: 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 20  ollSeq*));.     
df40: 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   apColl = pKeyIn
df50: 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20  fo->aColl;.     
df60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
df70: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
df80: 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f  , pOTerm++, apCo
df90: 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72  ll++, pSortOrder
dfa0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
dfb0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65 72  r *pExpr = pOTer
dfc0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
dfd0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
dfe0: 70 4f 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  pOTerm->zName;. 
dff0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e000: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e010: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43  UMN && pExpr->iC
e020: 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20  olumn<nCol );.  
e030: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20        if( zName 
e040: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70  ){.          *ap
e050: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
e060: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
e070: 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a  se, zName, -1);.
e080: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e090: 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
e0a0: 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e   = aCopy[pExpr->
e0b0: 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20  iColumn];.      
e0c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f    }.        *pSo
e0d0: 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d  rtOrder = pOTerm
e0e0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
e0f0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
e100: 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
e110: 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==p );.      ass
e120: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
e130: 56 69 72 74 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20  Virt[2]>=0 );.  
e140: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64      addr = p->ad
e150: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3b 0a 20  drOpenVirt[2];. 
e160: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e170: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
e180: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
e190: 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  pr+2);.      sql
e1a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
e1b0: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
e1c0: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
e1d0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
e1e0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
e1f0: 20 30 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61   0;.      genera
e200: 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
e210: 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69  e, p, v, p->pELi
e220: 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
e230: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a  , iParm);.    }.
e240: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e250: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
e260: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e270: 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
e280: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e290: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
e2a0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
e2b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e2c0: 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  IEW./*.** Scan t
e2d0: 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
e2e0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
e2f0: 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
e300: 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
e310: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
e320: 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
e330: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
e340: 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
e350: 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
e360: 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
e370: 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
e380: 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
e390: 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
e3a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
e3b0: 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
e3c0: 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
e3d0: 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
e3e0: 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
e3f0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
e400: 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
e410: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
e420: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
e430: 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
e440: 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
e450: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
e460: 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
e470: 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
e480: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
e490: 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
e4a0: 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
e4b0: 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
e4c0: 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
e4d0: 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
e4e0: 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
e4f0: 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
e500: 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
e510: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
e520: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
e530: 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
e540: 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78  ExprList*,int,Ex
e550: 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f  prList*);  /* Fo
e560: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
e570: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
e580: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 2c 20  elect(Select *, 
e590: 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
e5a0: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
e5b0: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
e5c0: 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72  d substExpr(Expr
e5d0: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61   *pExpr, int iTa
e5e0: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
e5f0: 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45  EList){.  if( pE
e600: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
e610: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
e620: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
e630: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
e640: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
e650: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
e660: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
e670: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
e680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e690: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
e6a0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
e6b0: 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
e6c0: 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
e6d0: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
e6e0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
e6f0: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
e700: 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
e710: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
e720: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69       pNew = pELi
e730: 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
e740: 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
e750: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
e760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
e770: 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
e780: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e790: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
e7a0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
e7b0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
e7c0: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65  xprDup(pNew->pLe
e7d0: 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ft);.      asser
e7e0: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
e7f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
e800: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
e810: 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77  ite3ExprDup(pNew
e820: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
e830: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e840: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
e850: 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d    pExpr->pList =
e860: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e870: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29  Dup(pNew->pList)
e880: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
e890: 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54  Table = pNew->iT
e8a0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70  able;.      pExp
e8b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65  r->iColumn = pNe
e8c0: 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  w->iColumn;.    
e8d0: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
e8e0: 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20  pNew->iAgg;.    
e8f0: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
e900: 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  py(&pExpr->token
e910: 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b  , &pNew->token);
e920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
e930: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
e940: 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61  span, &pNew->spa
e950: 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  n);.      pExpr-
e960: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
e970: 65 33 53 65 6c 65 63 74 44 75 70 28 70 4e 65 77  e3SelectDup(pNew
e980: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
e990: 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d    pExpr->flags =
e9a0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20   pNew->flags;.  
e9b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
e9c0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
e9d0: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c  ->pLeft, iTable,
e9e0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
e9f0: 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
ea00: 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
ea10: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
ea20: 74 53 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70  tSelect(pExpr->p
ea30: 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
ea40: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
ea50: 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72  stExprList(pExpr
ea60: 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
ea70: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
ea80: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
ea90: 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
eaa0: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
eab0: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
eac0: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  *pEList){.  int 
ead0: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
eae0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
eaf0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
eb00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
eb10: 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74   substExpr(pList
eb20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
eb30: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
eb40: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
eb50: 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c   substSelect(Sel
eb60: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ect *p, int iTab
eb70: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
eb80: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20  List){.  if( !p 
eb90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
eba0: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
ebb0: 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
ebc0: 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
ebd0: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
ebe0: 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
ebf0: 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
ec00: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
ec10: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ec20: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70 2d  ;.  substExpr(p-
ec30: 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
ec40: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
ec50: 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
ec60: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ec70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
ec80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ec90: 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
eca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ecb0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69  T_VIEW./*.** Thi
ecc0: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
ecd0: 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
ece0: 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
ecf0: 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
ed00: 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
ed10: 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
ed20: 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
ed30: 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
ed40: 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
ed50: 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
ed60: 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
ed70: 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
ed80: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
ed90: 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
eda0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
edb0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
edc0: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
edd0: 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
ede0: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
edf0: 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
ee00: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
ee10: 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
ee20: 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
ee30: 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
ee40: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
ee50: 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
ee60: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
ee70: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
ee80: 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
ee90: 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
eea0: 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
eeb0: 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
eec0: 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
eed0: 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
eee0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
eef0: 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
ef00: 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
ef10: 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
ef20: 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
ef30: 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
ef40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ef50: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
ef60: 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
ef70: 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
ef80: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
ef90: 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
efa0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
efb0: 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
efc0: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
efd0: 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
efe0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
eff0: 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
f000: 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
f010: 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
f020: 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
f030: 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
f040: 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
f050: 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
f060: 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
f070: 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
f080: 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
f090: 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
f0a0: 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
f0b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
f0c0: 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
f0d0: 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
f0e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
f0f0: 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
f100: 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
f110: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
f120: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
f130: 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
f140: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
f150: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f160: 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
f170: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f180: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
f190: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
f1a0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f1b0: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
f1c0: 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
f1d0: 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a  outer join, or.*
f1e0: 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62  *        the sub
f1f0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
f200: 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69  elf a join.  (Ti
f210: 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a  cket #306).**.**
f220: 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
f230: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
f240: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
f250: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
f260: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
f270: 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
f280: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
f290: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f2a0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
f2b0: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
f2c0: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
f2d0: 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
f2e0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
f2f0: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
f300: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
f310: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
f320: 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
f330: 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
f340: 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
f350: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
f360: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
f370: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
f380: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f390: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
f3a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
f3b0: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
f3c0: 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
f3d0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f3e0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
f3f0: 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
f400: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
f410: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f420: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
f430: 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
f440: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
f450: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
f460: 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
f470: 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
f480: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
f490: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
f4a0: 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
f4b0: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
f4c0: 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75   (12)  The subqu
f4d0: 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
f4e0: 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
f4f0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f  EFT OUTER JOIN o
f500: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
f510: 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
f520: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28  WHERE clause.  (
f530: 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20  added by ticket 
f540: 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  #350).**.** In t
f550: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
f560: 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
f570: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
f580: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
f590: 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
f5a0: 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
f5b0: 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
f5c0: 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
f5d0: 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
f5e0: 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
f5f0: 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
f600: 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
f610: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
f620: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
f630: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
f640: 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
f650: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
f660: 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
f670: 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
f680: 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
f690: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
f6a0: 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
f6b0: 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
f6c0: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
f6d0: 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
f6e0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
f6f0: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
f700: 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
f710: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
f720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
f730: 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
f740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f750: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
f760: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f770: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
f780: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
f790: 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
f7a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
f7b0: 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
f7c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
f7d0: 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
f7e0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
f7f0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
f800: 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
f810: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
f820: 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
f830: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
f840: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
f850: 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
f860: 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
f870: 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
f880: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
f890: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
f8a0: 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
f8b0: 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
f8c0: 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
f8d0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
f8e0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
f8f0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
f900: 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
f910: 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
f920: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
f930: 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
f940: 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
f950: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
f960: 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
f970: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
f980: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
f990: 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
f9a0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
f9b0: 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
f9c0: 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
f9d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f9f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
fa00: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
fa30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
fa40: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
fa50: 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
fa60: 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
fa70: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
fa80: 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
fa90: 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
faa0: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
fab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
fac0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
fad0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
fae0: 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
faf0: 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
fb00: 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
fb10: 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
fb20: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
fb30: 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
fb40: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
fb50: 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
fb60: 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
fb70: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
fb80: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
fb90: 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
fba0: 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
fbb0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53  eturn 0;.  pSubS
fbc0: 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
fbd0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
fbe0: 72 63 20 29 3b 0a 20 20 69 66 28 20 28 70 53 75  rc );.  if( (pSu
fbf0: 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
fc00: 70 4c 69 6d 69 74 29 20 7c 7c 20 70 53 75 62 2d  pLimit) || pSub-
fc10: 3e 70 4f 66 66 73 65 74 20 7c 7c 20 0a 20 20 20  >pOffset || .   
fc20: 20 20 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74     (pSub->pLimit
fc30: 20 26 26 20 69 73 41 67 67 29 20 29 20 72 65 74   && isAgg) ) ret
fc40: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
fc50: 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
fc60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
fc70: 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
fc80: 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
fc90: 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
fca0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fcb0: 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  }.  if( p->isDis
fcc0: 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72  tinct && subquer
fcd0: 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
fce0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  0;.  if( p->pOrd
fcf0: 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
fd00: 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
fd10: 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  0;..  /* Restric
fd20: 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
fd30: 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
fd40: 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
fd50: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
fd60: 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
fd70: 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
fd80: 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
fd90: 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
fda0: 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
fdb0: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
fdc0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
fdd0: 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
fde0: 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
fdf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
fe00: 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
fe10: 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
fe20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
fe30: 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
fe40: 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
fe50: 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
fe60: 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
fe70: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
fe80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
fe90: 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69  Src->nSrc>1 && i
fea0: 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
feb0: 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
fec0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
fed0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
fee0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
fef0: 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
ff00: 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
ff10: 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
ff20: 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
ff30: 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
ff40: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
ff50: 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
ff60: 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
ff70: 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
ff80: 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
ff90: 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
ffa0: 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
ffb0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
ffc0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
ffd0: 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
ffe0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
fff0: 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
10000 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
10010 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
10020 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
10030 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
10040 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
10050 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
10060 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
10070 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
10080 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
10090 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
100a0 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
100b0 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
100c0 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f  INNER JOIN..  */
100d0 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  .  if( iFrom>0 &
100e0 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
100f0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
10100 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
10110 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65     && pSub->pWhe
10120 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
10130 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
10140 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
10150 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
10160 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
10170 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
10180 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
10190 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
101a0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
101b0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
101c0 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
101d0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
101e0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
101f0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
10200 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
10210 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
10220 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
10230 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
10240 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
10250 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
10260 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
10270 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
10280 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
10290 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
102a0 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
102b0 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
102c0 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
102d0 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
102e0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
102f0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
10300 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
10310 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
10320 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
10330 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
10340 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
10350 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
10360 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
10370 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
10380 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
10390 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
103a0 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
103b0 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
103c0 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
103d0 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
103e0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
103f0 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
10400 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
10410 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  Subitem->pTab);.
10420 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10430 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
10440 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
10450 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ree(pSubitem->zN
10460 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
10470 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  Free(pSubitem->z
10480 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
10490 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
104a0 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e     int extra = n
104b0 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  SubSrc - 1;.    
104c0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75    for(i=1; i<nSu
104d0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
104e0 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
104f0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
10500 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pSrc, 0, 0);.   
10510 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53     }.      p->pS
10520 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20  rc = pSrc;.     
10530 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
10540 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46  c-1; i-extra>=iF
10550 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  rom; i--){.     
10560 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20     pSrc->a[i] = 
10570 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d  pSrc->a[i-extra]
10580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10590 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
105a0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
105b0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
105c0 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
105d0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
105e0 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
105f0 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
10600 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
10610 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
10620 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d  iFrom+nSubSrc-1]
10630 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
10640 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  type;.  }..  /* 
10650 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
10660 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
10670 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
10680 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a  ssions for .  **
10690 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
106a0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
106b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
106c0 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c   ** .  ** Exampl
106d0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53  e:.  **.  **   S
106e0 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
106f0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
10700 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
10710 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
10720 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20  a>b;.  **   \   
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
10750 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
10760 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
10770 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  .  **    \______
10780 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
10790 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
107a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
107b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a  __________/.  **
107c0 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74  .  ** We look at
107d0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
107e0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
107f0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
10800 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a  lace we see.  **
10810 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
10820 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
10830 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
10840 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
10850 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20  e "y+10"..  */. 
10860 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
10870 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
10880 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
10890 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  ;.  pList = p->p
108a0 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
108b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
108c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
108d0 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28   *pExpr;.    if(
108e0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
108f0 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
10900 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
10910 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
10920 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
10930 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
10940 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70 72  iteStrNDup(pExpr
10950 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d  ->span.z, pExpr-
10960 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a  >span.n);.    }.
10970 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
10980 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
10990 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
109a0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
109b0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75  >pEList);.    su
109c0 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  bstExpr(p->pHavi
109d0 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
109e0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
109f0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
10a00 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65  erBy ){.    asse
10a10 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
10a20 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  =0 );.    p->pOr
10a30 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
10a40 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62  rderBy;.    pSub
10a50 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
10a60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70    }else if( p->p
10a70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
10a80 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
10a90 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
10aa0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
10ab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  ;.  }.  if( pSub
10ac0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
10ad0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
10ae0 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70 57  ExprDup(pSub->pW
10af0 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  here);.  }else{.
10b00 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
10b10 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65    }.  if( subque
10b20 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61  ryIsAgg ){.    a
10b30 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e  ssert( p->pHavin
10b40 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  g==0 );.    p->p
10b50 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65  Having = p->pWhe
10b60 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  re;.    p->pWher
10b70 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
10b80 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
10b90 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
10ba0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
10bb0 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
10bc0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d  qlite3ExprAnd(p-
10bd0 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69 74 65  >pHaving, sqlite
10be0 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  3ExprDup(pSub->p
10bf0 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73  Having));.    as
10c00 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
10c10 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
10c20 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
10c30 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 53 75  3ExprListDup(pSu
10c40 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  b->pGroupBy);.  
10c50 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
10c60 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
10c70 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
10c80 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
10c90 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
10ca0 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65  xprAnd(p->pWhere
10cb0 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a  , pWhere);.  }..
10cc0 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
10cd0 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
10ce0 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
10cf0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
10d00 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
10d10 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
10d20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69   */.  p->isDisti
10d30 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
10d40 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44  nct || pSub->isD
10d50 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20  istinct;..  /*. 
10d60 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
10d70 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
10d80 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
10d90 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
10da0 20 79 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70   y;.  */.  if( p
10db0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
10dc0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
10dd0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
10de0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
10df0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  0;.  }..  /* Fin
10e00 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
10e10 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
10e20 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
10e30 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
10e40 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
10e50 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
10e60 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Sub);.  return 1
10e70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10e80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
10e90 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
10ea0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10eb0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e 20  ement passed in 
10ec0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
10ed0 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
10ee0 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29  s a simple min()
10ef0 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
10f00 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 74    If it is and t
10f10 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62 65  his query can be
10f20 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75 73  .** satisfied us
10f30 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65 65  ing a single see
10f40 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
10f50 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e 20  ng or end of an 
10f60 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 67  index,.** then g
10f70 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
10f80 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
10f90 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 20   and return 1.  
10fa0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
10fb0 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e 28   .** simple min(
10fc0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
10fd0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 3b  , then return 0;
10fe0 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79 20  .**.** A simply 
10ff0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
11000 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  uery looks like 
11010 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
11020 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52 4f  ELECT min(a) FRO
11030 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20 53  M table;.**    S
11040 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52 4f  ELECT max(a) FRO
11050 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54  M table;.**.** T
11060 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61 76  he query may hav
11070 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  e only a single 
11080 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52 4f  table in its FRO
11090 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65  M argument.  The
110a0 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f 20  re.** can be no 
110b0 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
110c0 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61 75  NG or WHERE clau
110d0 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ses.  The result
110e0 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65 20   set must.** be 
110f0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
11100 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  () of a single c
11110 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
11120 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 0a  le.  The column.
11130 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29 20  ** in the min() 
11140 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
11150 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78 65  n must be indexe
11160 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
11170 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73 20  ameters to this 
11180 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65 20  routine are the 
11190 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c 69  same as for sqli
111a0 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 20  te3Select()..** 
111b0 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
111c0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72  omment on that r
111d0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
111e0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
111f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
11200 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
11210 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
11220 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
11230 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
11240 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  m){.  Expr *pExp
11250 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  r;.  int iCol;. 
11260 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11270 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
11280 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65 20  nt base;.  Vdbe 
11290 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f 70  *v;.  int seekOp
112a0 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20 20  ;.  int cont;.  
112b0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
112c0 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
112d0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
112e0 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
112f0 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
11300 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  rc;..  /* Check 
11310 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71  to see if this q
11320 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
11330 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
11340 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20  query.  Return. 
11350 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69   ** zero if it i
11360 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  s  not..  */.  i
11370 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c  f( p->pGroupBy |
11380 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20  | p->pHaving || 
11390 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
113a0 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
113b0 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53  ->pSrc;.  if( pS
113c0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
113d0 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74  turn 0;.  pEList
113e0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
113f0 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
11400 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
11410 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
11420 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
11430 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
11440 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
11450 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c  ) return 0;.  pL
11460 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
11470 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  st;.  if( pList=
11480 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78  =0 || pList->nEx
11490 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
114a0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
114b0 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
114c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
114d0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78 70  te3StrNICmp(pExp
114e0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
114f0 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
11500 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
11510 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
11520 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45  lite3StrNICmp(pE
11530 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
11540 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
11550 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
11560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
11570 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
11580 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
11590 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
115a0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
115b0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
115c0 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  .  iCol = pExpr-
115d0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62  >iColumn;.  pTab
115e0 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
115f0 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ab;..  /* If we 
11600 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20  get to here, it 
11610 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79 20  means the query 
11620 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
11630 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65  t form..  ** Che
11640 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
11650 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78  we have an index
11660 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70   and make pIdx p
11670 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  oint to the.  **
11680 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
11690 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28  ex.  If the min(
116a0 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e  ) or max() is on
116b0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
116c0 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c  ARY.  ** key col
116d0 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73  umn, no index is
116e0 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73 65   necessary so se
116f0 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20  t pIdx to NULL. 
11700 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62   If no.  ** usab
11710 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  le index is foun
11720 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  d, return 0..  *
11730 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  /.  if( iCol<0 )
11740 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a  {.    pIdx = 0;.
11750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c    }else{.    Col
11760 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
11770 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
11780 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
11790 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
117a0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
117b0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
117c0 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
117d0 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
117e0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
117f0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
11800 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64 78  0]==iCol && pIdx
11810 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11820 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65 61  0]==pColl ) brea
11830 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
11840 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
11850 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
11860 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
11870 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
11880 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
11890 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
118a0 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
118b0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
118c0 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
118d0 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
118e0 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63  cell..  ** The c
118f0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65  olumn names have
11900 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
11910 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63  nerated in the c
11920 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
11930 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
11940 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11950 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
11960 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
11970 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
11980 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
11990 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
119a0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
119b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
119c0 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62  est==SRT_TempTab
119d0 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
119e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
119f0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50  _OpenVirtual, iP
11a00 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
11a10 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
11a20 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
11a30 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
11a40 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
11a50 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
11a60 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
11a70 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
11a80 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
11a90 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
11aa0 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
11ab0 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
11ac0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
11ad0 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
11ae0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
11af0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
11b00 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
11b10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   */.  sqlite3Cod
11b20 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
11b30 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29  arse, pTab->iDb)
11b40 3b 0a 20 20 62 61 73 65 20 3d 20 70 53 72 63 2d  ;.  base = pSrc-
11b50 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
11b60 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11b70 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11b80 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  );.  if( pSrc->a
11b90 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  [0].pSelect==0 )
11ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  {.    sqlite3Ope
11bb0 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67  nTableForReading
11bc0 28 76 2c 20 62 61 73 65 2c 20 70 54 61 62 29 3b  (v, base, pTab);
11bd0 0a 20 20 7d 0a 20 20 63 6f 6e 74 20 3d 20 73 71  .  }.  cont = sq
11be0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11bf0 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 70 49 64  el(v);.  if( pId
11c00 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
11c10 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11c20 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
11c30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
11c40 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
11c50 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
11c60 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
11c70 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
11c80 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
11c90 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
11ca0 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
11cb0 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
11cc0 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
11cd0 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
11ce0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
11cf0 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
11d00 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
11d10 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
11d20 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
11d30 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
11d40 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
11d50 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
11d60 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
11d70 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
11d80 64 78 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70  dx;.    iIdx = p
11d90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
11da0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11db0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
11dc0 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
11dd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11de0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
11df0 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
11e00 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
11e10 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11e20 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c  )&pIdx->keyInfo,
11e30 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
11e40 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50    if( seekOp==OP
11e50 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20  _Rewind ){.     
11e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11e70 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
11e80 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11e90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11ea0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
11eb0 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f   0);.      seekO
11ec0 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20  p = OP_MoveGt;. 
11ed0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11ee0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
11ef0 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  kOp, iIdx, 0);. 
11f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11f10 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
11f20 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  id, iIdx, 0);.  
11f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11f40 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
11f50 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
11f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11f70 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73  , OP_MoveGe, bas
11f80 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69  e, 0);.  }.  eLi
11f90 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20  st.nExpr = 1;.  
11fa0 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65  memset(&eListIte
11fb0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69  m, 0, sizeof(eLi
11fc0 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73  stItem));.  eLis
11fd0 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d  t.a = &eListItem
11fe0 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70  ;.  eList.a[0].p
11ff0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
12000 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12010 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73  pParse, p, &eLis
12020 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
12030 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 63 6f  eDest, iParm, co
12040 6e 74 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20  nt, cont, 0);.  
12050 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
12060 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29  veLabel(v, cont)
12070 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12080 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
12090 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20  , base, 0);.  . 
120a0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
120b0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20  .** Analyze and 
120c0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
120d0 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61  P BY clause in a
120e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
120f0 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  t.  Return.** th
12100 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
12110 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41  rs seen..**.** A
12120 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
12130 4f 55 50 20 42 59 20 69 73 20 61 20 6c 69 73 74  OUP BY is a list
12140 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2e   of expressions.
12150 20 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73    If any express
12160 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74  ion.** is an int
12170 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74  eger constant, t
12180 68 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73  hen that express
12190 69 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20  ion is replaced 
121a0 62 79 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  by the.** corres
121b0 70 6f 6e 64 69 6e 67 20 65 6e 74 72 79 20 69 6e  ponding entry in
121c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
121d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
121e0 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
121f0 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  By(.  NameContex
12200 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e  t *pNC,     /* N
12210 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
12220 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12230 65 6e 74 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ent. */.  ExprLi
12240 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
12250 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
12260 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
12270 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73  se to be process
12280 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
12290 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
122a0 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20   Either "ORDER" 
122b0 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61  or "GROUP", as a
122c0 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b  ppropriate */.){
122d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
122e0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
122f0 4e 43 2d 3e 70 45 4c 69 73 74 3b 20 20 20 20 20  NC->pEList;     
12300 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
12310 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
12320 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
12330 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
12340 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ;     /* The res
12350 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
12360 45 4c 45 43 54 20 2a 2f 0a 20 20 61 73 73 65 72  ELECT */.  asser
12370 74 28 20 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  t( pEList );..  
12380 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
12390 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
123a0 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
123b0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
123c0 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
123d0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
123e0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
123f0 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
12400 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
12410 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
12420 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26      if( iCol>0 &
12430 26 20 69 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e  & iCol<=pEList->
12440 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
12450 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12460 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20 20 20  te(pE);.        
12470 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
12480 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
12490 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73  te3ExprDup(pELis
124a0 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78  t->a[iCol-1].pEx
124b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
124c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
124d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
124e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  , .           "%
124f0 73 20 42 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  s BY column numb
12500 65 72 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  er %d out of ran
12510 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22  ge - should be "
12520 0a 20 20 20 20 20 20 20 20 20 20 20 22 62 65 74  .           "bet
12530 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
12540 7a 54 79 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c  zType, iCol, pEL
12550 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
12560 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
12570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12580 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12590 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43  ResolveNames(pNC
125a0 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72  , pE) ){.      r
125b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
125c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
125d0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 29  prIsConstant(pE)
125e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
125f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12600 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 20  ,.          "%s 
12610 42 59 20 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f  BY terms must no
12620 74 20 62 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72  t be non-integer
12630 20 63 6f 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79   constants", zTy
12640 70 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pe);.      retur
12650 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
12660 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
12670 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12680 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61   resolves any na
12690 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  mes used in the 
126a0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
126b0 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45  e.** supplied SE
126c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
126d0 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  If the SELECT st
126e0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  atement being re
126f0 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73  solved.** is a s
12700 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  ub-select, then 
12710 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f  pOuterNC is a po
12720 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d  inter to the Nam
12730 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20  eContext .** of 
12740 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43  the parent SELEC
12750 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
12760 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a  3SelectResolve(.
12770 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12790 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
127a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
127b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
127c0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
127d0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
127e0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
127f0 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54   *pOuterNC  /* T
12800 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f  he outer name co
12810 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55  ntext. May be NU
12820 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  LL. */.){.  Expr
12830 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
12840 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
12850 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
12860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12870 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f        /* For-loo
12880 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20  p variable used 
12890 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
128a0 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  es */.  NameCont
128b0 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
128c0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65     /* Local name
128d0 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 0a 20 20 2f  -context */..  /
128e0 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
128f0 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
12900 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
12910 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
12920 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
12930 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
12940 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
12950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12960 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
12970 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
12980 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
12990 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
129a0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
129b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
129c0 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
129d0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
129e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
129f0 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
12a00 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
12a10 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
12a20 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
12a30 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
12a40 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
12a50 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
12a60 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
12a70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
12a80 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
12a90 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
12aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12ab0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
12ac0 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
12ad0 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
12ae0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
12af0 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
12b00 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
12b10 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
12b20 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
12b30 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
12b40 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  ntext..  */.  sN
12b50 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
12b60 65 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20  e;.  sNC.hasAgg 
12b70 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20  = 0;.  sNC.nErr 
12b80 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20  = 0;.  sNC.nRef 
12b90 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73  = 0;.  sNC.pELis
12ba0 74 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 61 6c 6c  t = 0;.  sNC.all
12bb0 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43  owAgg = 0;.  sNC
12bc0 2e 70 53 72 63 4c 69 73 74 20 3d 20 30 3b 0a 20  .pSrcList = 0;. 
12bd0 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
12be0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12bf0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
12c00 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c  NC, p->pLimit) |
12c10 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  |.      sqlite3E
12c20 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
12c30 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74  &sNC, p->pOffset
12c40 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12c50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
12c60 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  }..  /* Set up t
12c70 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  he local name-co
12c80 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f  ntext to pass to
12c90 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65   ExprResolveName
12ca0 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f  s() to.  ** reso
12cb0 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
12cc0 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  on-list..  */.  
12cd0 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  sNC.allowAgg = 1
12ce0 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
12cf0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e   = p->pSrc;.  sN
12d00 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72  C.pNext = pOuter
12d10 4e 43 3b 0a 0a 20 20 2f 2a 20 4e 61 6d 65 43 6f  NC;..  /* NameCo
12d20 6e 74 65 78 74 2e 6e 44 65 70 74 68 20 73 74 6f  ntext.nDepth sto
12d30 72 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  res the depth of
12d40 20 72 65 63 75 72 73 69 6f 6e 20 66 6f 72 20 74   recursion for t
12d50 68 69 73 20 71 75 65 72 79 2e 20 46 6f 72 0a 20  his query. For. 
12d60 20 2a 2a 20 61 6e 20 6f 75 74 65 72 20 71 75 65   ** an outer que
12d70 72 79 20 28 65 2e 67 2e 20 53 45 4c 45 43 54 20  ry (e.g. SELECT 
12d80 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
12d90 73 74 65 72 29 20 74 68 69 73 20 69 73 20 31 2e  ster) this is 1.
12da0 20 46 6f 72 0a 20 20 2a 2a 20 61 20 73 75 62 71   For.  ** a subq
12db0 75 65 72 79 20 69 74 20 69 73 20 32 2e 20 46 6f  uery it is 2. Fo
12dc0 72 20 61 20 73 75 62 71 75 65 72 79 20 6f 66 20  r a subquery of 
12dd0 61 20 73 75 62 71 75 65 72 79 2c 20 33 2e 20 41  a subquery, 3. A
12de0 6e 64 20 73 6f 20 6f 6e 2e 20 0a 20 20 2a 2a 20  nd so on. .  ** 
12df0 50 61 72 73 65 2e 6e 4d 61 78 44 65 70 74 68 20  Parse.nMaxDepth 
12e00 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  is the maximum d
12e10 65 70 74 68 20 66 6f 72 20 61 6e 79 20 73 75 62  epth for any sub
12e20 71 75 65 72 79 20 72 65 73 6f 6c 76 65 64 20 73  query resolved s
12e30 6f 0a 20 20 2a 2a 20 66 61 72 2e 20 54 68 69 73  o.  ** far. This
12e40 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
12e50 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
12e60 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 63 6f   of aggregate co
12e70 6e 74 65 78 74 73 0a 20 20 2a 2a 20 72 65 71 75  ntexts.  ** requ
12e80 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d 65 2e  ired at runtime.
12e90 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 6e 44 65 70  .  */.  sNC.nDep
12ea0 74 68 20 3d 20 28 70 4f 75 74 65 72 4e 43 3f 70  th = (pOuterNC?p
12eb0 4f 75 74 65 72 4e 43 2d 3e 6e 44 65 70 74 68 2b  OuterNC->nDepth+
12ec0 31 3a 31 29 3b 0a 20 20 69 66 28 20 73 4e 43 2e  1:1);.  if( sNC.
12ed0 6e 44 65 70 74 68 3e 70 50 61 72 73 65 2d 3e 6e  nDepth>pParse->n
12ee0 4d 61 78 44 65 70 74 68 20 29 7b 0a 20 20 20 20  MaxDepth ){.    
12ef0 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74  pParse->nMaxDept
12f00 68 20 3d 20 73 4e 43 2e 6e 44 65 70 74 68 3b 0a  h = sNC.nDepth;.
12f10 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
12f20 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72  e names in the r
12f30 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
12f40 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
12f50 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73  st;.  if( !pELis
12f60 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
12f70 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69  E_ERROR;.  for(i
12f80 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
12f90 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
12fa0 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74  xpr *pX = pEList
12fb0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
12fc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12fd0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
12fe0 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20  NC, pX) ){.     
12ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
13000 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
13010 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
13020 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  re no aggregate 
13030 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  functions in the
13040 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64   result-set, and
13050 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20   no GROUP BY .  
13060 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64  ** expression, d
13070 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72  o not allow aggr
13080 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66  egates in any of
13090 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
130a0 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ssions..  */.  a
130b0 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67  ssert( !p->isAgg
130c0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72   );.  if( p->pGr
130d0 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
130e0 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
130f0 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
13100 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
13110 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
13120 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
13130 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
13140 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
13150 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
13160 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
13170 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
13180 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  !p->pGroupBy ){.
13190 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
131a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47  Msg(pParse, "a G
131b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
131c0 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
131d0 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20  e HAVING");.    
131e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
131f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ROR;.  }..  /* A
13200 64 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  dd the expressio
13210 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61  n list to the na
13220 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72  me-context befor
13230 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20  e parsing the.  
13240 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ** other express
13250 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ions in the SELE
13260 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
13270 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20  is is so that.  
13280 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
13290 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
132a0 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65  se (etc.) can re
132b0 66 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f  fer to expressio
132c0 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73  ns by.  ** alias
132d0 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
132e0 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   set..  **.  ** 
132f0 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20  Minor point: If 
13300 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
13310 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
13320 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ssion will be.  
13330 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20  ** re-evaluated 
13340 66 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e  for each referen
13350 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20  ce to it..  */. 
13360 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d   sNC.pEList = p-
13370 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73  >pEList;.  if( s
13380 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13390 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
133a0 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20  pWhere) ||.     
133b0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
133c0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
133d0 2d 3e 70 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20  ->pHaving) ||.  
133e0 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72      processOrder
133f0 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d  GroupBy(&sNC, p-
13400 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
13410 52 22 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f  R") ||.      pro
13420 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
13430 28 26 73 4e 43 2c 20 70 2d 3e 70 47 72 6f 75 70  (&sNC, p->pGroup
13440 42 79 2c 20 22 47 52 4f 55 50 22 29 0a 20 20 29  By, "GROUP").  )
13450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13460 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
13470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13480 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  OK;.}../*.** An 
13490 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
134a0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
134b0 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
134c0 74 65 33 53 65 6c 65 63 74 28 29 0a 2a 2a 20 74  te3Select().** t
134d0 6f 20 73 61 76 65 20 61 67 67 72 65 67 61 74 65  o save aggregate
134e0 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61   related informa
134f0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 50 61  tion from the Pa
13500 72 73 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 74  rse object.** at
13510 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
13520 63 68 20 63 61 6c 6c 20 61 6e 64 20 74 6f 20 72  ch call and to r
13530 65 73 74 6f 72 65 20 69 74 20 61 74 20 74 68 65  estore it at the
13540 20 65 6e 64 2e 20 53 65 65 0a 2a 2a 20 73 61 76   end. See.** sav
13550 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 29  eAggregateInfo()
13560 20 61 6e 64 20 72 65 73 74 6f 72 65 41 67 67 72   and restoreAggr
13570 65 67 61 74 65 49 6e 66 6f 28 29 2e 0a 2a 2f 20  egateInfo()..*/ 
13580 0a 73 74 72 75 63 74 20 41 67 67 72 65 67 61 74  .struct Aggregat
13590 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20 6e 41  eInfo {.  int nA
135a0 67 67 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61  gg;.  AggExpr *a
135b0 41 67 67 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  Agg;.};.typedef 
135c0 73 74 72 75 63 74 20 41 67 67 72 65 67 61 74 65  struct Aggregate
135d0 49 6e 66 6f 20 41 67 67 72 65 67 61 74 65 49 6e  Info AggregateIn
135e0 66 6f 3b 0a 0a 2f 2a 20 0a 2a 2a 20 43 6f 70 79  fo;../* .** Copy
135f0 20 61 67 67 72 65 67 61 74 65 20 72 65 6c 61 74   aggregate relat
13600 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ed information f
13610 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 73 74  rom the Parse st
13620 72 75 63 74 75 72 65 0a 2a 2a 20 69 6e 74 6f 20  ructure.** into 
13630 74 68 65 20 41 67 67 72 65 67 61 74 65 49 6e 66  the AggregateInf
13640 6f 20 73 74 72 75 63 74 75 72 65 2e 20 5a 65 72  o structure. Zer
13650 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
13660 72 65 6c 61 74 65 64 0a 2a 2a 20 76 61 6c 75 65  related.** value
13670 73 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  s in the Parse s
13680 74 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  truct..*/.static
13690 20 76 6f 69 64 20 73 61 76 65 41 67 67 72 65 67   void saveAggreg
136a0 61 74 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ateInfo(Parse *p
136b0 50 61 72 73 65 2c 20 41 67 67 72 65 67 61 74 65  Parse, Aggregate
136c0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
136d0 70 49 6e 66 6f 2d 3e 61 41 67 67 20 3d 20 70 50  pInfo->aAgg = pP
136e0 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 70 49  arse->aAgg;.  pI
136f0 6e 66 6f 2d 3e 6e 41 67 67 20 3d 20 70 50 61 72  nfo->nAgg = pPar
13700 73 65 2d 3e 6e 41 67 67 3b 0a 20 20 70 50 61 72  se->nAgg;.  pPar
13710 73 65 2d 3e 61 41 67 67 20 3d 20 30 3b 0a 20 20  se->aAgg = 0;.  
13720 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
13730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
13740 61 67 67 72 65 67 61 74 65 20 72 65 6c 61 74 65  aggregate relate
13750 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
13760 6f 6d 20 74 68 65 20 41 67 67 72 65 67 61 74 65  om the Aggregate
13770 49 6e 66 6f 20 73 74 72 75 63 74 0a 2a 2a 20 62  Info struct.** b
13780 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 50 61 72  ack into the Par
13790 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  se structure. Th
137a0 65 20 61 67 67 72 65 67 61 74 65 20 72 65 6c 61  e aggregate rela
137b0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ted information.
137c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ** currently sto
137d0 72 65 64 20 69 6e 20 74 68 65 20 50 61 72 73 65  red in the Parse
137e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 64 65   structure is de
137f0 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
13800 20 76 6f 69 64 20 72 65 73 74 6f 72 65 41 67 67   void restoreAgg
13810 72 65 67 61 74 65 49 6e 66 6f 28 50 61 72 73 65  regateInfo(Parse
13820 20 2a 70 50 61 72 73 65 2c 20 41 67 67 72 65 67   *pParse, Aggreg
13830 61 74 65 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  ateInfo *pInfo){
13840 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
13850 61 72 73 65 2d 3e 61 41 67 67 29 3b 0a 20 20 70  arse->aAgg);.  p
13860 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 70 49  Parse->aAgg = pI
13870 6e 66 6f 2d 3e 61 41 67 67 3b 0a 20 20 70 50 61  nfo->aAgg;.  pPa
13880 72 73 65 2d 3e 6e 41 67 67 20 3d 20 70 49 6e 66  rse->nAgg = pInf
13890 6f 2d 3e 6e 41 67 67 3b 0a 7d 0a 20 20 0a 2f 2a  o->nAgg;.}.  ./*
138a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
138b0 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
138c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
138d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
138e0 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
138f0 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
13900 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
13910 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
13920 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d   eDest and iParm
13930 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73  ..**.**     eDes
13940 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65  t Value       Re
13950 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
13960 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13990 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
139a0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
139b0 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
139c0 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
139d0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
139e0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
139f0 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
13a00 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
13a10 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d  emory cell iParm
13a20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
13a30 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  et         Store
13a40 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
13a50 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   of table iParm.
13a60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
13a70 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
13a80 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
13a90 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
13aa0 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
13ab0 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
13ac0 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
13ad0 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74  sults from the t
13ae0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
13af0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
13b00 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
13b10 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
13b20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13b30 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65   iParm.**.** The
13b40 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20   table above is 
13b50 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64  incomplete.  Add
13b60 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61  itional eDist va
13b70 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65  lue have be adde
13b80 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20  d.** since this 
13b90 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74  comment was writ
13ba0 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65  ten.  See the se
13bb0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
13bc0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  function for.** 
13bd0 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69  a complete listi
13be0 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65  ng of the allowe
13bf0 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73  d values of eDes
13c00 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e  t and their mean
13c10 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ings..**.** This
13c20 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
13c30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
13c40 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
13c50 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
13c60 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
13c70 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
13c80 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
13c90 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
13ca0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
13cb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
13cc0 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
13cd0 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
13ce0 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
13cf0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
13d00 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
13d10 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   that..**.** The
13d20 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
13d30 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e  Tab, and *pParen
13d40 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20  tAgg fields are 
13d50 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69  filled in if thi
13d60 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61  s.** SELECT is a
13d70 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
13d80 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79   routine may try
13d90 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73   to combine this
13da0 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
13db0 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f  its parent to fo
13dc0 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  rm a single flat
13dd0 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64   query.  In so d
13de0 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a  oing, it might.*
13df0 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72  * change the par
13e00 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61  ent query from a
13e10 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74   non-aggregate t
13e20 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  o an aggregate q
13e30 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61  uery..** For tha
13e40 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50  t reason, the pP
13e50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73  arentAgg flag is
13e60 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69   passed as a poi
13e70 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63  nter, so it.** c
13e80 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  an be changed..*
13e90 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
13ea0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
13eb0 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   the pParent par
13ec0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ameter..**.**   
13ed0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
13ee0 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78  1 JOIN (SELECT x
13ef0 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
13f00 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20  t2) JOIN t3;.** 
13f10 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
13f20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
13f30 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
13f40 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a  ___/        /.**
13f50 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20       \          
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
13f90 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
13fa0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
13fb0 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
13fc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a  ___________/.**.
13fd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13fe0 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
13ff0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69  e outer query fi
14000 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20  rst.   For that 
14010 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74  call,.** pParent
14020 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20   will be NULL.  
14030 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65  During the proce
14040 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74  ssing of the out
14050 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a  er query, this .
14060 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
14070 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
14080 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73   to handle the s
14090 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68  ubquery.  For th
140a0 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63  e recursive.** c
140b0 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c  all, pParent wil
140c0 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f  l point to the o
140d0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63  uter query.  Bec
140e0 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72  ause the subquer
140f0 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f  y is.** the seco
14100 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20  nd element in a 
14110 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20  three-way join, 
14120 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61  the parentTab pa
14130 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20  rameter will.** 
14140 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61  be 1 (the 2nd va
14150 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78  lue of a 0-index
14160 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e  ed array.).*/.in
14170 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
14180 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14190 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
141a0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
141b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
141c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
141d0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
141e0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
141f0 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14210 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
14220 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
14230 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
14240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
14250 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79  arameter used by
14260 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f   the eDest dispo
14270 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
14280 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c  Select *pParent,
14290 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
142a0 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69  r SELECT for whi
142b0 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62  ch this is a sub
142c0 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  -query */.  int 
142d0 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20  parentTab,      
142e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
142f0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20  Parent->pSrc of 
14300 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
14310 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  int *pParentAgg,
14320 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14330 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61  f pParent uses a
14340 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
14350 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  ns */.  char *af
14360 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f              /
14370 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
14380 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
14390 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
143a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
143b0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
143c0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
143d0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
143e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
143f0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
14400 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
14410 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
14420 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
14430 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
14440 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
14450 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
14460 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
14470 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
14480 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
14490 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
144a0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
144b0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
144c0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
144d0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
144e0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
144f0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
14500 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
14510 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
14520 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
14530 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
14540 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
14550 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
14560 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
14570 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
14580 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
14590 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
145a0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
145b0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
145c0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
145d0 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
145e0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
145f0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
14600 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
14610 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
14620 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
14630 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
14640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
14650 2f 0a 20 20 41 67 67 72 65 67 61 74 65 49 6e 66  /.  AggregateInf
14660 6f 20 73 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 69  o sAggInfo;..  i
14670 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
14680 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  c_failed || pPar
14690 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30  se->nErr || p==0
146a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
146b0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
146c0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
146d0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
146e0 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
146f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14700 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
14710 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65  LECT.  /* If the
14720 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
14730 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
14740 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
14750 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
14760 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
14770 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
14780 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a  Rightmost==0 ){.
14790 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c        Select *pL
147a0 6f 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  oop;.      for(p
147b0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
147c0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
147d0 6f 72 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  or){.        pLo
147e0 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
147f0 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
14800 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  }.    return mul
14810 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
14820 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
14830 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64  , aff);.  }.#end
14840 69 66 0a 0a 20 20 73 61 76 65 41 67 67 72 65 67  if..  saveAggreg
14850 61 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ateInfo(pParse, 
14860 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 70 4f  &sAggInfo);.  pO
14870 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
14880 65 72 42 79 3b 0a 20 20 69 66 28 20 65 44 65 73  erBy;.  if( eDes
14890 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
148a0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
148b0 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
148c0 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 70  Discard ){.    p
148d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
148e0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
148f0 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
14900 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
14910 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
14920 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
14930 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
14940 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f  y;..  /* Make lo
14950 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68  cal copies of th
14960 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72  e parameters for
14970 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a   this query..  *
14980 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
14990 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65  ->pSrc;.  pWhere
149a0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
149b0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
149c0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
149d0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
149e0 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41    isAgg = p->isA
149f0 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74  gg;.  isDistinct
14a00 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
14a10 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
14a20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
14a30 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73  List==0 ) goto s
14a40 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
14a50 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76   .  ** Do not ev
14a60 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65  en attempt to ge
14a70 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20  nerate any code 
14a80 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61  if we have alrea
14a90 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72  dy seen.  ** err
14aa0 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20  ors before this 
14ab0 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a  routine starts..
14ac0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
14ad0 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f  e->nErr>0 ) goto
14ae0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
14af0 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
14b00 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
14b10 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
14b20 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
14b30 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
14b40 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  put..  */.  asse
14b50 72 74 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  rt( eDest!=SRT_E
14b60 78 69 73 74 73 20 7c 7c 20 70 45 4c 69 73 74 2d  xists || pEList-
14b70 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 23 69 66  >nExpr==1 );.#if
14b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14b90 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
14ba0 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
14bb0 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
14bc0 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  t) && pEList->nE
14bd0 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  xpr>1 ){.    sql
14be0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14bf0 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
14c00 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
14c10 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
14c20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
14c30 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
14c40 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67  ression");.    g
14c50 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
14c60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14c70 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67 6e   ORDER BY is ign
14c80 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65  ored for some de
14c90 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  stinations..  */
14ca0 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
14cb0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
14cc0 5f 55 6e 69 6f 6e 3a 0a 20 20 20 20 63 61 73 65  _Union:.    case
14cd0 20 53 52 54 5f 45 78 63 65 70 74 3a 0a 20 20 20   SRT_Except:.   
14ce0 20 63 61 73 65 20 53 52 54 5f 44 69 73 63 61 72   case SRT_Discar
14cf0 64 3a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  d:.      pOrderB
14d00 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  y = 0;.      bre
14d10 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
14d20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d30 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
14d40 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
14d50 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
14d60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
14d70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
14d80 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
14d90 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
14da0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
14db0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
14dc0 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
14dd0 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
14de0 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
14df0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
14e00 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
14e10 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
14e20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
14e30 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
14e40 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
14e50 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
14e60 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
14e70 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
14e80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
14e90 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
14ea0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
14eb0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
14ec0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14ed0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
14ee0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14ef0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
14f00 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
14f10 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
14f20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
14f30 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
14f40 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
14f50 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
14f60 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c 69  ..    if( pTabLi
14f70 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  st->a[i].pSelect
14f80 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
14f90 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
14fa0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20  ->a[i].zName!=0 
14fb0 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41  ){.      zSavedA
14fc0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
14fd0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
14fe0 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t;.      pParse-
14ff0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
15000 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
15010 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
15020 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
15030 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
15040 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
15050 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
15060 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
15070 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  lect(pParse, pTa
15080 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  bList->a[i].pSel
15090 65 63 74 2c 20 53 52 54 5f 54 65 6d 70 54 61 62  ect, SRT_TempTab
150a0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  le, .           
150b0 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d 3e        pTabList->
150c0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 70 2c  a[i].iCursor, p,
150d0 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a   i, &isAgg, 0);.
150e0 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74      if( needRest
150f0 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20  oreContext ){.  
15100 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
15110 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
15120 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  dAuthContext;.  
15130 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
15140 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
15150 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
15160 72 65 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  re;.    if( eDes
15170 74 21 3d 53 52 54 5f 55 6e 69 6f 6e 20 26 26 20  t!=SRT_Union && 
15180 65 44 65 73 74 21 3d 53 52 54 5f 45 78 63 65 70  eDest!=SRT_Excep
15190 74 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f  t && eDest!=SRT_
151a0 44 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 20  Discard ){.     
151b0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
151c0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
151d0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
151e0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
151f0 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
15200 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
15210 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
15220 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nct;.  }.#endif.
15230 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
15240 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
15250 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   of a min() or m
15260 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79  ax() function by
15270 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20   itself.  ** in 
15280 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
15290 20 20 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c    */.  if( simpl
152a0 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61  eMinMaxQuery(pPa
152b0 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
152c0 50 61 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20  Parm) ){.    rc 
152d0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  = 0;.    goto se
152e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
152f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
15300 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
15310 62 71 75 65 72 79 20 74 68 61 74 20 63 61 6e 20  bquery that can 
15320 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69  be "flattened" i
15330 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a  nto its parent..
15340 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69    ** If flatteni
15350 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69  ng is a possibli
15360 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65  ty, do so and re
15370 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
15380 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  .  .  */.#ifndef
15390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
153a0 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  W.  if( pParent 
153b0 26 26 20 70 50 61 72 65 6e 74 41 67 67 20 26 26  && pParentAgg &&
153c0 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75  .      flattenSu
153d0 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
153e0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
153f0 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  b, *pParentAgg, 
15400 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66  isAgg) ){.    if
15410 28 20 69 73 41 67 67 20 29 20 2a 70 50 61 72 65  ( isAgg ) *pPare
15420 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67  ntAgg = 1;.    g
15430 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15440 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15450 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
15460 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
15470 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c   resolve any col
15480 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
15490 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74  .  ** names that
154a0 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 6c 69   have been expli
154b0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 2e  citly specified.
154c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
154d0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  erBy ){.    stru
154e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
154f0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65 79   *pTerm;.    Key
15500 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
15510 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
15520 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d    for(i=0, pTerm
15530 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
15540 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
15550 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
15560 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
15570 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
15580 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e    pTerm->pExpr->
15590 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
155a0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
155b0 72 73 65 2c 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d  rse, pTerm->zNam
155c0 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, -1);.      }.
155d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
155e0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
155f0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
15600 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  end;.    }.    p
15610 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
15620 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
15630 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
15640 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69  .    pOrderBy->i
15650 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
15660 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d  ab++;.    addr =
15670 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
15680 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
15690 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 54 61  l, pOrderBy->iTa
156a0 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  b, pOrderBy->nEx
156b0 70 72 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20  pr+2, .         
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
156d0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
156e0 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
156f0 46 46 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  FF);.    p->addr
15700 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64  OpenVirt[2] = ad
15710 64 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  dr;.  }..  /* Se
15720 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
15730 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
15740 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
15750 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  se, p);..  /* If
15760 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
15770 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
15780 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
15790 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
157a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
157b0 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20  ==SRT_TempTable 
157c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
157d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
157e0 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d  enVirtual, iParm
157f0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
15800 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61  ;.  }..  /* Do a
15810 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 67  n analysis of ag
15820 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73 69  gregate expressi
15830 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
15840 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42  isAgg || pGroupB
15850 79 20 29 7b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  y ){.    NameCon
15860 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d 65  text sNC;.    me
15870 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
15880 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
15890 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
158a0 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
158b0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
158c0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
158d0 50 61 72 73 65 2d 3e 6e 41 67 67 3d 3d 30 20 29  Parse->nAgg==0 )
158e0 3b 0a 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b  ;.    isAgg = 1;
158f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15900 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
15910 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
15920 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
15930 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
15940 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15950 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
15960 73 74 28 26 73 4e 43 2c 20 70 47 72 6f 75 70 42  st(&sNC, pGroupB
15970 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  y) ){.      goto
15980 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
15990 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
159a0 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ng && sqlite3Exp
159b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
159c0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
159d0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
159e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
159f0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
15a00 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
15a10 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
15a20 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  By) ){.      got
15a30 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
15a40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
15a50 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
15a60 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  or.  */.  if( is
15a70 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  Agg ){.    int a
15a80 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15a90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
15aa0 52 65 73 65 74 2c 20 28 70 47 72 6f 75 70 42 79  Reset, (pGroupBy
15ab0 3f 30 3a 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e  ?0:1), pParse->n
15ac0 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Agg);.    for(i=
15ad0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
15ae0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  g; i++){.      F
15af0 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20  uncDef *pFunc;. 
15b00 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20       if( (pFunc 
15b10 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
15b20 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70  ].pFunc)!=0 && p
15b30 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  Func->xFinalize!
15b40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
15b50 74 20 6e 45 78 70 72 20 3d 20 30 3b 0a 23 69 66  t nExpr = 0;.#if
15b60 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
15b70 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 67         Expr *pAg
15b80 67 45 78 70 72 20 3d 20 70 50 61 72 73 65 2d 3e  gExpr = pParse->
15b90 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  aAgg[i].pExpr;. 
15ba0 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 45         if( pAggE
15bb0 78 70 72 20 26 26 20 70 41 67 67 45 78 70 72 2d  xpr && pAggExpr-
15bc0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
15bd0 20 20 20 20 6e 45 78 70 72 20 3d 20 70 41 67 67      nExpr = pAgg
15be0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
15bf0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  pr;.        }.#e
15c00 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
15c10 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
15c20 50 5f 41 67 67 49 6e 69 74 2c 20 6e 45 78 70 72  P_AggInit, nExpr
15c30 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46 75 6e  , i, (char*)pFun
15c40 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P3_FUNCDEF);.
15c50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15c60 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
15c70 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
15c80 2a 70 4b 65 79 20 3d 20 6b 65 79 49 6e 66 6f 46  *pKey = keyInfoF
15c90 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
15ca0 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
15cb0 20 20 20 20 20 69 66 28 20 30 3d 3d 70 4b 65 79       if( 0==pKey
15cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15cd0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
15ce0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15cf0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
15d00 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29  , addr, (char *)
15d10 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
15d20 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d  _HANDOFF);.    }
15d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
15d40 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
15d50 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20 66 6f   cell to NULL fo
15d60 72 20 53 52 54 5f 4d 65 6d 20 6f 72 20 30 20 66  r SRT_Mem or 0 f
15d70 6f 72 20 53 52 54 5f 45 78 69 73 74 73 0a 20 20  or SRT_Exists.  
15d80 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
15d90 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
15da0 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  ==SRT_Exists ){.
15db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15dc0 64 64 4f 70 28 76 2c 20 65 44 65 73 74 3d 3d 53  ddOp(v, eDest==S
15dd0 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f 4e 75 6c 6c  RT_Mem ? OP_Null
15de0 20 3a 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30   : OP_Integer, 0
15df0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15e00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15e10 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
15e20 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
15e30 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
15e40 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
15e50 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
15e60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
15e70 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b  istinct ){.    K
15e80 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15e90 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
15ea0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15eb0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
15ec0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
15ed0 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
15ee0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
15ef0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
15f00 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 64 69  _OpenVirtual, di
15f10 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20  stinct, 0, .    
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
15f40 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
15f50 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
15f60 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
15f70 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
15f80 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
15f90 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70  se scan.  */.  p
15fa0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
15fb0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
15fc0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
15fd0 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  re,.            
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20 3a 20   pGroupBy ? 0 : 
16000 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  &pOrderBy);.  if
16010 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
16020 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
16030 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
16040 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
16050 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64   if we are not d
16060 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20 2a 2a  ealing with.  **
16070 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2f   aggregates.  */
16080 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 29 7b  .  if( !isAgg ){
16090 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
160a0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
160b0 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
160c0 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
160d0 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e   iParm, pWInfo->
16100 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
16110 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20  o->iBreak, aff) 
16120 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
16130 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
16140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
16150 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
16160 68 20 61 67 67 72 65 67 61 74 65 73 2c 20 74 68  h aggregates, th
16170 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63 69 61  en do the specia
16180 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a  l aggregate.  **
16190 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 0a 20   processing.  . 
161a0 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
161b0 41 67 67 45 78 70 72 20 2a 70 41 67 67 3b 0a 20  AggExpr *pAgg;. 
161c0 20 20 20 69 6e 74 20 6c 62 6c 31 20 3d 20 30 3b     int lbl1 = 0;
161d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 66 69 6c  .    pParse->fil
161e0 6c 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 69 66  lAgg = 1;.    if
161f0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
16200 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16210 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
16220 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
16230 20 20 20 20 20 2f 2a 20 4e 6f 20 61 66 66 69 6e       /* No affin
16240 69 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 74  ity string is at
16250 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 66 6f  tached to the fo
16260 6c 6c 6f 77 69 6e 67 20 4f 50 5f 4d 61 6b 65 52  llowing OP_MakeR
16270 65 63 6f 72 64 20 0a 20 20 20 20 20 20 2a 2a 20  ecord .      ** 
16280 62 65 63 61 75 73 65 20 77 65 20 64 6f 20 6e 6f  because we do no
16290 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 61 6e 79  t need to do any
162a0 20 63 6f 65 72 63 69 6f 6e 20 6f 66 20 64 61 74   coercion of dat
162b0 61 74 79 70 65 73 2e 20 2a 2f 0a 20 20 20 20 20  atypes. */.     
162c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
162d0 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
162e0 72 64 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  rd, pGroupBy->nE
162f0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c  xpr, 0);.      l
16300 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bl1 = sqlite3Vdb
16310 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
16320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16330 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 46  AddOp(v, OP_AggF
16340 6f 63 75 73 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a  ocus, 0, lbl1);.
16350 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
16360 30 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e  0, pAgg=pParse->
16370 61 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e  aAgg; i<pParse->
16380 6e 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b  nAgg; i++, pAgg+
16390 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41  +){.      if( pA
163a0 67 67 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74  gg->isAgg ) cont
163b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  inue;.      sqli
163c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
163d0 73 65 2c 20 70 41 67 67 2d 3e 70 45 78 70 72 29  se, pAgg->pExpr)
163e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
163f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
16400 67 67 53 65 74 2c 20 30 2c 20 69 29 3b 0a 20 20  ggSet, 0, i);.  
16410 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
16420 66 69 6c 6c 41 67 67 20 3d 20 30 3b 0a 20 20 20  fillAgg = 0;.   
16430 20 69 66 28 20 6c 62 6c 31 3c 30 20 29 7b 0a 20   if( lbl1<0 ){. 
16440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16450 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16460 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lbl1);.    }.   
16470 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70   for(i=0, pAgg=p
16480 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70  Parse->aAgg; i<p
16490 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
164a0 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20  , pAgg++){.     
164b0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
164c0 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
164d0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
164e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
164f0 2d 3e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ->isAgg ) contin
16500 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
16510 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 21 3d 30  ( pAgg->pFunc!=0
16520 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16530 28 20 70 41 67 67 2d 3e 70 46 75 6e 63 2d 3e 78  ( pAgg->pFunc->x
16540 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 20 20 20  Step!=0 );.     
16550 20 70 44 65 66 20 3d 20 70 41 67 67 2d 3e 70 46   pDef = pAgg->pF
16560 75 6e 63 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  unc;.      pE = 
16570 70 41 67 67 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAgg->pExpr;.   
16580 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
16590 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
165a0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  ( pE->op==TK_AGG
165b0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
165c0 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
165d0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
165e0 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
165f0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  List);.      sql
16600 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16610 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
16620 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
16630 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
16640 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
16650 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
16660 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
16670 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 21        for(j=0; !
16680 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 45 78 70 72  pColl && j<nExpr
16690 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
166a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
166b0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
166c0 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  rse, pE->pList->
166d0 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
166e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
166f0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
16700 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
16710 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
16720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
16730 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
16740 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
16750 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
16760 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16770 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16780 76 2c 20 4f 50 5f 41 67 67 46 75 6e 63 2c 20 30  v, OP_AggFunc, 0
16790 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29  , nExpr, (char*)
167a0 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46  pDef, P3_FUNCDEF
167b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
167c0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
167d0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
167e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
167f0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
16800 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 70    /* If we are p
16810 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
16820 61 74 65 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  ates, we need to
16830 20 73 65 74 20 75 70 20 61 20 73 65 63 6f 6e 64   set up a second
16840 20 6c 6f 6f 70 0a 20 20 2a 2a 20 6f 76 65 72 20   loop.  ** over 
16850 61 6c 6c 20 6f 66 20 74 68 65 20 61 67 67 72 65  all of the aggre
16860 67 61 74 65 20 76 61 6c 75 65 73 20 61 6e 64 20  gate values and 
16870 70 72 6f 63 65 73 73 20 74 68 65 6d 2e 0a 20 20  process them..  
16880 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  */.  if( isAgg )
16890 7b 0a 20 20 20 20 69 6e 74 20 65 6e 64 61 67 67  {.    int endagg
168a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
168b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
168c0 69 6e 74 20 73 74 61 72 74 61 67 67 3b 0a 20 20  int startagg;.  
168d0 20 20 73 74 61 72 74 61 67 67 20 3d 20 73 71 6c    startagg = sql
168e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
168f0 20 4f 50 5f 41 67 67 4e 65 78 74 2c 20 30 2c 20   OP_AggNext, 0, 
16900 65 6e 64 61 67 67 29 3b 0a 20 20 20 20 69 66 28  endagg);.    if(
16910 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
16920 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
16930 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
16940 76 69 6e 67 2c 20 73 74 61 72 74 61 67 67 2c 20  ving, startagg, 
16950 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
16960 28 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  ( selectInnerLoo
16970 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
16980 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
16990 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65  rBy, distinct, e
169a0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
169b0 20 20 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c            iParm,
169c0 20 73 74 61 72 74 61 67 67 2c 20 65 6e 64 61 67   startagg, endag
169d0 67 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20  g, aff) ){.     
169e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
169f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16a00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16a10 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 74 61 72  OP_Goto, 0, star
16a20 74 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  tagg);.    sqlit
16a30 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16a40 65 6c 28 76 2c 20 65 6e 64 61 67 67 29 3b 0a 20  el(v, endagg);. 
16a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16a60 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
16a70 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
16a80 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
16a90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
16aa0 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
16ab0 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
16ac0 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
16ad0 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
16ae0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
16af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
16b00 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
16b10 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
16b20 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
16b30 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
16b40 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69   iParm);.  }..#i
16b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16b60 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20  T_SUBQUERY.  /* 
16b70 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
16b80 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
16b90 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
16ba0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
16bb0 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
16bc0 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65   table.  So dele
16bd0 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  te the subquery 
16be0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
16bf0 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74  he parent.  ** t
16c00 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73  o prevent this s
16c10 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
16c20 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
16c30 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
16c40 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65  the.  ** the use
16c50 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
16c60 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
16c70 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
16c80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
16c90 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70  nt->pSrc->nSrc>p
16ca0 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20  arentTab );.    
16cb0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
16cc0 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
16cd0 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29  ab].pSelect==p )
16ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
16cf0 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  ectDelete(p);.  
16d00 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
16d10 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
16d20 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  elect = 0;.  }.#
16d30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20  endif..  /* The 
16d40 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
16d50 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
16d60 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
16d70 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
16d80 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
16d90 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
16da0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
16db0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
16dc0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
16dd0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
16de0 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
16df0 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
16e00 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
16e10 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
16e20 3a 0a 20 20 72 65 73 74 6f 72 65 41 67 67 72 65  :.  restoreAggre
16e30 67 61 74 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  gateInfo(pParse,
16e40 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 72   &sAggInfo);.  r
16e50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.